K-means聚类算法
1.聚类的了解
- 聚类是一种无监督的学习,它将相似的对象归到同一个簇中。它有点像全自动分类。
- 聚类与分类的最大不同在于,分类的目标事先已知,而聚类则不一样
2.K-均值聚类的算法
- 优点:容易实现
- 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢
- 适用数据类型:数据型数据
K-均值的算法工作流程:
- 随机确定K个初始点作为质心。
- 将数据集中在每个点分配到一个簇中(为每个点找距其最近的质心,并将其分配给该质心对应的簇)
K-均值聚类的一般流程:
1.收集数据:使用任意方法。
2.准备数据:需要数值型数据来计算距离,也可以将标称型数据映射 为二值型数据再来用于数据计算
3.分析数据:使用任意方法。
4.训练算法:不使用于无监督学习,即无监督学习没有训练过程。
5.测试算法:应用聚类算法、观察结果。可以使用量化的误差指标如误差平方和来评价算法的结果。
6.使用算法:可以用于所希望的任何应用。通常情况下,簇质心可以代表整个簇的数据来做出决定
K-means的代码实现:
from numpy import *
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
def kmeans(dataSet, k):#dataSet样点数,k簇的个数
sampleNum,col=dataSet.shape#样本数
cluster=mat(zeros((sampleNum,2)))#m*2的矩阵,2是一个来记录误差,一个来记录最近点的下标
centroid=zeros((k,col))
for i in range(k):
index=int(random.uniform(0,sampleNum))
centroid[i,:]=dataSet[index,:]
clusterChaged=True# clusterChaged标志变量
while clusterChaged:#当聚类不再变化
clusterChaged=False
for i in range(sampleNum):
minDist=sqrt(sum(power(centroid[0,:]-dataSet[i,:],2)))#dataSet[i,:]第i行的所有元素
minIdex=0
for j in range(1,k):
distance=sqrt(sum(power(centroid[j,:]-dataSet[i,:],2)))
if distance<minDist:
minDist=distance
minIdex=j#查找最近的质心
if cluster[i,0]!=minIdex:
clusterChaged=True
cluster[i,:]=minIdex,minDist**2#更新质心
for j in range(k):
pointsCluter=dataSet[nonzero((cluster[:,0].A==j)[0])]#查找值为K的满足条件点的序号
centroid[j,:]==mean(pointsCluter,axis=0)#axis=0表示沿矩阵的列方向进行均值计算
return centroid,cluster
dataSet = [[1, 1], [3, 1], [1, 4], [2, 5], [11, 12], [14, 11], [13, 12], [11, 16], [17, 12], [28, 10],[26, 15], [27, 13], [28, 11], [29, 15]]
dataSet=mat(dataSet)
k=4
centroids, cluster = kmeans(dataSet, k)
sampleNum,col=dataSet.shape
mark=['or','ob','og']
for i in range(sampleNum):
markIndax=int(cluster[i,0])
plt.plot(dataSet[i,0],dataSet[i,1],mark[markIndax])
mark=['+r','+b','+g']
for i in range(k):
plt.plot(centroids[i,0],centroids[i,1],markersize=12)
plt.show()