本系列文章介绍人工智能的基础概念和常用公式。由于协及内容所需的数学知识要求,建议初二以上同学学习。 运行本系统程序,请在电脑安装好Python、matplotlib和scikit-learn库。相关安装方法可自行在百度查找。
K-均值算法是一种典型的无监督机器学习算法,用来解决聚类问题。k表示把数据分成多少类,理论上k值越大,算法成本越低。K-均值算法包含两个步骤:
- 给聚类中心分配点。计算所有的训练样例,把每个训练样例分配到距离其最近的聚类中心所在的类别里。
- 移动聚类中心。新的聚类中心移动到这个聚类所有的点的平均值处。
重复上面的动作,直到聚类中心不再移动为止。
示例说明
从上面过程可看出,初始化的聚类中心点与聚类的结果密切相关,不同的随机初始化中心点可能会得到不同的结果。因为成本函数可能会收敛在一个局部的最优解,而不是全局最优解。而解决这个问题 的办法就是,多运行几次K-均值算法,找到一个最小的成本值。
示例程序
以下程序是随机生成200个点坐标,用K-均值算法对其进行2、3、4类的分组。
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
def fit_plot_kmean_model(n_clusters,X):
plt.xticks(())
plt.yticks(())
#使用k-均值算法进行拟合
kmean = KMeans(n_clusters=n_clusters)
kmean.fit_predict(X)
labels = kmean.labels_
centers = kmean.cluster_centers_
markers = ['o','^','*','s']
colors = ['r','g','b','k']
#计算成本
score = kmean.score(X)
plt.title("k={},score={}".format(n_clusters,(int)(score)))
#画样本
for c in range(n_clusters):
cluster = X[labels==c]
plt.scatter(cluster[:,0],cluster[:,1],marker=markers[c],s=20,c=colors[c])
#画中心点
plt.scatter(centers[:,0],centers[:,1],marker='o',c="white",alpha=0.9,s=300)
for i,c in enumerate(centers):
plt.scatter(c[0],c[1],marker='$%d$' % i,s=50,c=colors[i])
#-------------------------------
#生成200个随机样本坐标
X,Y = make_blobs(n_samples=200,
n_features=2,
cluster_std=1,
center_box=(-10,10),
shuffle=True,
random_state=1)
n_clusters = [2,3,4]
plt.figure(figsize=(10,3),dpi=144)
for i,c in enumerate(n_clusters):
plt.subplot(1,3,i+1)
fit_plot_kmean_model(c,X)
plt.show()
从上面数据可以看出,计算成本score的绝对值越大,说明计算成本越高。分类越多,成本越小。
k-均值的算法成本就是训练样本到其所属的聚类中心点的距离的平均值