一、简介
k-means是一种常见的无监督机器学习算法,众所周知,无监督学习的分类往往是需要先聚类再分类的,而k-means算法就是最常见,使用频率最高的聚类算法。其核心思想是把一些未标注的数据(无标签)分类称为k类不相同的簇中(cluster),算法k-means名称中的k就是所分成的簇的数量。而同一簇之中的对象都是有某些相似之处,当簇中的点越相似,我们的分类效果就越好。每个簇的中心点是由该簇所有点的欧氏距离的平均值计算而成,因此也就得名means。
k-means除了应用在对无标签的数据进行聚类分类之外,也常常应用于有监督学习进行训练之前的对数据集特征的探索和表征。
k-means算法中的k一般是手动指定的,换句话说k是算法的输入,稍后我们会讨论如何不指定k值的情况下开始我们的算法。
二、数学表示
三、代码
def distEclud(vecA,vecB):
return np.sqrt(sum(vecA-vecB,2))
def randCent(dataSet,k=2):
n=np.shape(dataSet)[1]
centroids=np.matrix(np.zeros(n,k))
for j in range(n):
minJ=min(dataSet[:,j])
rangeJ=float(max(dataSet[:,j])-minJ)
centroids[:,j]=minJ+rangeJ*np.random.rand(k,1)
return centroids
def kmeans (dataSet,k=2,distMess=distEclud,createCent=randCent):
m=np.shape(dataSet)[0]
clusterAssment = np.mat(np.zeros((m,2)))
centroids=createCent(dataSet,k)
clusterChanged = True
while clusterChanged:
clusterChanged = False
for i in range(m):
minDist = np.inf;
minIndex = -1;
for j in range(k):
distJI=distMess(centroids[j,:],dataSet[i,:])
if distJI<minDist:
# 寻找最近的质心
minDist=distJI;minIndex=j
if clusterAssment[i,0] != minIndex:
clusterChanged = True
clusterAssment[i,:] = minIndex,minDist**2
print(centroids)
for cent in range(k):
# 更新质心的位置
ptsInClust = dataSet[np.nonzero()]
centroids[cent,:]=np.mean(ptsInClust,axis=0)
return centroids,clusterAssment
四、实现
上面的python代码是参考《机器学习实战》一书写出的代码,但是在实际工作之中,我们更多的是使用scikit-learn提供的k-means算法,scikit-learn是一个在机器学习领域被广泛应用的科学计算工具包,该项目最早由数据科学家 David Cournapeau 在2007 年发起,需要NumPy和SciPy等其他包的支持,是Python语言中专门针对机器学习应用而发展起来的一款开源框架。
下面贴出scikit-learn的k-means示例代码[2]:
>>> from sklearn.cluster import KMeans
>>> import numpy as np
>>> X = np.array([[1, 2], [1, 4], [1, 0],
... [4, 2], [4, 4], [4, 0]])
>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
>>> kmeans.labels_
array([0, 0, 0, 1, 1, 1], dtype=int32)
>>> kmeans.predict([[0, 0], [4, 4]])
array([0, 1], dtype=int32)
>>> kmeans.cluster_centers_
array([[ 1., 2.],
[ 4., 2.]])
scikit-learn的sklearn.cluster提供了一个完整的k-means算法的实现KMeans,其中参数的含义如下:
1、n_clusters:k值,即聚类簇的数量,该值默认值是8
2、max_iter:每次执行k-means算法单次最大循环次数,即终止条件,以防止迭代次数过多循环仍不结束,在最优解附近徘徊的情况,该值也是可选的,默认值300