2020 机器学习之Kmeans
2020-01-11 本文已影响0人
zidea
machine_learning.jpg
K-means
k-means 是一种搜寻中心的无监督的算法。K-means 是一种迭代的不确定方法,所谓迭代,是指算法的步骤不断重复产生的每个簇都可以用以下的指标来进行评估。
- 簇的位置: 簇中心的坐标,k-means 初始化的时候随机选择一个点作为中心点,然后每个步骤迭代找到新的中心,在新的中心附近的点都相似,并被划分到同一个组
- 簇的半径: 簇内每个点到簇中心的距离的平均差
- 簇的规模: 簇内点的总数
- 簇的密度:簇的规模和簇的半径的比值
K-means 模型的评估
如何评估输出的簇的好坏呢?因为是无监督问题,无法给出如精度、召回率、准确率、F1 分数或其他类似指标的评估方法,我们将采用所谓轮廓系数来评估 Kmeans 的结果。轮廓系数的值介于-1 到 1。
- 负值说明簇的半径大于簇之间的距离,也就是两个簇之间有重叠
- 值越大,也就是越接近 1 表示聚类结果越好
轮廓系数
我们知道轮廓系数用于衡量 Kmean 模型的好坏,那么我们应该如何计算轮廓系数。
- 表示在簇 C 里点 i 到簇内其他点距离的平均值
- 然后计算 i 点到其他簇的所有点的距离平均值,选择其中最小值。
每个簇里所有点的轮廓系数的平均值可以用来衡量这个簇的质量,所有点的轮廓系数的平局值可以用来衡量聚类分簇的质量。
def get_random_data():
x_1 = np.random.normal(loc=0.2,scale=0.2,size=(100,100))
x_2 = np.random.normal(loc=0.9,scale=0.1,size=(100,100))
#np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于pandas中的concat()
x = np.r_[x_1,x_2]
return x
x = get_random_data()
# plt.cla()
plt.figure()
plt.title("Generated Data")
plt.scatter(x[:,0],x[:,1])
plt.show()
print(x.shape)
屏幕快照 2020-01-11 下午9.57.05.png
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
def form_clusters(x,k):
# k 是划分出的簇的个数
no_clusters = k
model = KMeans(n_clusters=no_clusters,init='random')
model.fit(x)
labels = model.labels_
# print(labels)
# 计算轮廓系数
sh_score = silhouette_score(x,labels)
return sh_score
sh_scores = []
for i in range(1,5):
sh_score = form_clusters(x,i+1)
sh_scores.append(sh_score)
no_clusters = [i+1 for i in range(1,5)]
plt.figure(2)
plt.plot(no_clusters,sh_scores)
plt.title("Cluster Quality")
plt.xlabel("No of clusters k")
plt.ylabel("Sihouette Coefficient")
plt.show()
屏幕快照 2020-01-11 下午9.22.35.png
k-means 是一种迭代的算法,大致上步骤如下
- 从数据集中随机选择 k 个点作为簇的初始中心点
- 然后执行以下步骤直到收敛
- 将点分配给最近的簇中心,计算这个点和簇中心点的距离
- 基于本次迭代过程中分配的点重新计算簇中心
- 如果分配点和上一次迭代过程里的都一样,则算法收敛到一个最优解,退出循环。