聚类算法是机器学习中的一类无监督学习方法,用于将无标签的数据进行聚类划分。最简单的也最典型的一类算法就是KMeans算法。此处的K表示划分成K个聚类。利用各个点到质心之间的距离的平方和作为将节点划分到不同类的标准。当然也可以采用其他的距离计算方法,不一定是欧式距离方法。
一、KMeans
此方法一般是在数据分析前期使用,选取适当的K,将数据聚类后,研究不同聚类下数据的特点。
算法原理:
(1)随机选择K个中心点;
(2)在第j次迭代中,对于每个样本点,选取最近的中心点,归为该类;
(3)更新中心点为每类的均值;
(4)j < j-1,重复(2)(3)迭代更新,直到误差小到某个值或者达到一定的迭代步数,误差不变,也就是收敛为止;
空间复杂度为O(n),时间复杂度为O(l*K*N),其中N为样本个数,K为中心点个数,即聚类数,I为迭代次数
为什么迭代后误差逐渐减小:
SSE=
对于 而言,求导后,当 时,SSE最小,对应第(3)步;
对于 而言,求导后,当 时,SSE最小,对应第(2)步。
因此KMeans迭代能使误差逐渐减少直到不变
代码如下所示:
from numpy import *
#general function to parse tab -delimited floats
#assume last column is target value
def loadDataSet(fileName):
dataMat = []
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split('\t')
#笔者使用的是python3,需要将map映射后的结果转化为list
#map all elements to float()
fltLine = list(map(float,curLine))
dataMat.append(fltLine)
return dataMat
#样本距离计算函数
def distEclud(vecA, vecB):
return sqrt(sum(power(vecA - vecB, 2))) #la.norm(vecA-vecB)
#创建簇中心矩阵,初始化为k个在数据集的边界内随机分布的簇中心
def randCent(dataSet, k):
n = shape(dataSet)[1]
#create centroid mat
centroids = mat(zeros((k,n)))
#create random cluster centers, within bounds of each dimension
for j in range(n):
#求出数据集中第j列的最小值(即第j个特征)
minJ = min(dataSet[:,j])
#用第j个特征最大值减去最小值得出特征值范围
rangeJ = float(max(dataSet[:,j]) - minJ)
#创建簇矩阵的第J列,random.rand(k,1)表示产生(10,1)维的矩阵,其中每行值都为0-1中的随机值
#可以这样理解,每个centroid矩阵每列的值都在数据集对应特征的范围内,那么k个簇中心自然也都在数据集范围内