K-means算法
-
经典的数据挖掘算法。采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
K-means聚类算法是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。 -
算法步骤
(1)首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。
(2)从数据集中随机选择k个数据点作为质心。
(3)对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。
(4)把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。
(5)如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。
(6)如果新质心和原质心距离变化很大,需要迭代3~5步骤。
个人认为比较重要的点:
-
k值的选择
肘方法,首先k取值1~11(可选范围更广),做kmeans聚类,看不同k值对应的簇内误差平方和
-
质心的迭代更新
若k=5;初始的五个质心是随机选择的;确定了本轮迭代的质心后,将余下的样本点根据距离度量标准进行归类。非常直观,计算样本点和所有质心的“距离”,选取“距离”最小(argmin)的那个质心作为该样本所属的类别。距离公式主要有:
计算得到聚类中每一聚类观测值的均值作为新的质心。这里体现的思想是这样的:因为我们是无监督学习,对于待分类的样本集群我们没有任何的先验知识,完全不知道该怎么分类,那么我们就暴力地、勇敢地、随机地踏出第一步,然后不断地去修正我们的分类器,不得不说,这和人生的很多的做人做事的道理是类似的(人生就是一个勇敢踏出第一步,然后不断自我否定和修正成长的过程)。
不断重复,直至结果收敛,这里的收敛是指所有点到各自中心点的距离的和收敛。
代码如下:
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 加载数据集,是一个字典类似Java中的map
lris_df = datasets.load_iris()
# 挑选出前两个维度作为x轴和y轴,你也可以选择其他维度
x_axis = lris_df.data[:, 0]
y_axis = lris_df.data[:, 2]
# 这里已经知道了分3类,其他分类这里的参数需要调试
model = KMeans(n_clusters=3)
# 训练模型
model.fit(lris_df.data)
# 选取行标为100的那条数据,进行预测
prddicted_label = model.predict([[6.3, 3.3, 6, 2.5]])
# 预测全部150条数据
all_predictions = model.predict(lris_df.data)
# 打印出来对150条数据的聚类散点图
plt.scatter(x_axis, y_axis, c=all_predictions)
plt.show()