KMeans算法

KMeans算法

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples

#自己创建数据集
X,y = make_blobs(n_samples=500, n_features=2, centers=4, random_state=1)
#n_samples:样本点数,n_features:每个点的特征,random_state:随机性,设置为1方便教学数据,centers:数据中心,后续可以发现分4个簇时反映簇内和簇间差异的轮廓系数最好
#这里生成的数据是自带标签y的,而聚类算法并不需要标签;
print(X.shape) #(500,2)

#将得到的数据集按照X的特征进行可视化
fig, ax1 = plt.subplots(1) #建立子图,1表示只建立一个,返回fig画布,ax1一个子图对象
ax1.scatter(X[:,0], X[:,1], marker='o', s=8) #marker:点的形状,s:点的尺寸
plt.show()

##由于生成数据自带标签,我们可以根据标签对这个数据集进行可视化
#color = ['red','pink','orange','gray']
#fig, ax1 = plt.subplots(1)
#
#for i in range(4):
#    ax1.scatter(X[y==i,0], X[y==i,1], marker='o', s=8, c=color[i])
#
#plt.show()
n_cluster = 3
cluster = KMeans(n_clusters=n_cluster, random_state=0).fit(X) #在不知道类别的情况下暂定为3
y_pred = cluster.labels_ #聚类后数据的标签
print(y_pred)

#KMeans因为并不需要建立模型或者预测结果,因此我们只需要fit就能得到聚类结果了
#KMeans也有接口predict和fit_predict,表示学习数据X并对X的类进行预测
#但所得到的的结果和我们不调用predict,直接fit之后属性的labels一模一样
pre = cluster.fit_predict(X)
print(pre==y_pred)

#重要属性cluster_centers_,查看质心
centroid = cluster.cluster_centers_
print(centroid)
print(centroid.shape)

#重要属性inertia,查看总距离平方和
inertia = cluster.inertia_
print(inertia)

#将聚类后的数据集进行可视化
color = ['red','pink','orange','gray']
fig, ax1 = plt.subplots(1)

for i in range(n_cluster):
    ax1.scatter(X[y_pred==i,0], X[y_pred==i,1], marker='o', s=8, c=color[i])
    
ax1.scatter(centroid[:,0], centroid[:,1],marker='x', s=14, c='black')
plt.show()

#聚类算法的衡量指标----轮廓系数
'''
前面cluster.inertia_表示所有点到质心的距离平方和,会发现质心越多(分的簇越多),值越小,并不能很好地评价聚类效果;
依赖于簇内稠密程度(簇内差异小)和簇间离散程度(簇外差异大)来评价聚类效果,轮廓系数是常用的聚类算法的评价指标;
样本与其自身所在的簇中的其他样本的相似度a,等于样本与同一簇中所有其他点之间的平均距离;
样本与其他簇中的样本的相似度b,等于样本与下一个最近的簇中得所有点之间的平均距离;
轮廓系数:S=(b-a)/max(a,b) 值位于-1~1,且值大于0说明聚类还行,越接近1效果越好;
'''
s1 = silhouette_score(X, y_pred) #返回的是一个数据集中,所有样本的轮廓系数的均值
s2 = silhouette_samples(X, y_pred) #参数与轮廓系数一致,但返回的是数据集中每个样本自己的轮廓系数
print(s1)
print(s2)   

根据轮廓系数来衡量聚类算法

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np

X,y = make_blobs(n_samples=500, n_features=2, centers=4, random_state=1)
for n_clusters in [2,3,4,5,6,7]:
    n_clusters = n_clusters
    fig, (ax1, ax2) = plt.subplots(1, 2) #一个画布上同时生成两个图
    fig.set_size_inches(15, 7) #画布的尺寸
    ax1.set_xlim([-0.1, 1]) #第一个图的横坐标范围,显示的是每个数据的轮廓系数
    ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10]) #第一个图的纵坐标范围,显示的是数据量,每类数据间间隔为10
    clusterer = KMeans(n_clusters=n_clusters, random_state=10).fit(X)
    cluster_labels = clusterer.labels_
    silhouette_avg = silhouette_score(X, cluster_labels) #所有数据的轮廓系数的平均值
    print("For n_clusters =", n_clusters,
          "The average silhouette_score is :", silhouette_avg)
    sample_silhouette_values = silhouette_samples(X, cluster_labels)
    y_lower = 10
    for i in range(n_clusters):
        ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i] #提取第i类数据的轮廓系数
        ith_cluster_silhouette_values.sort() #对轮廓系数进行从小到大的排序;从小到大排列只需要sort(reverse=True)
        size_cluster_i = ith_cluster_silhouette_values.shape[0] #每一类数据的个数
        y_upper = y_lower + size_cluster_i #每一类数据在y轴上的分布上限
        color = cm.nipy_spectral(float(i)/n_clusters) #每一类的显示颜色
    
        ax1.fill_betweenx(np.arange(y_lower, y_upper)
                         ,ith_cluster_silhouette_values
                         ,facecolor=color
                         ,alpha=0.7
                         )
        ax1.text(-0.05
                 , y_lower + 0.5 * size_cluster_i
                 , str(i))
        y_lower = y_upper + 10
    ax1.set_title("The silhouette plot for the various clusters.")
    ax1.set_xlabel("The silhouette coefficient values")
    ax1.set_ylabel("Cluster label")
    ax1.axvline(x=silhouette_avg, color="red", linestyle="--") #参考线
    ax1.set_yticks([])
    ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
    colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
    ax2.scatter(X[:, 0], X[:, 1]
               ,marker='o' #点的形状
               ,s=8 #点的大小
               ,c=colors
               )
    centers = clusterer.cluster_centers_
    ax2.scatter(centers[:, 0], centers[:, 1], marker='x',
                c="red", alpha=1, s=200)
    ax2.set_title("The visualization of the clustered data.")
    ax2.set_xlabel("Feature space for the 1st feature")
    ax2.set_ylabel("Feature space for the 2nd feature")
    plt.suptitle(("Silhouette analysis for KMeans clustering on sample data "
                  "with n_clusters = %d" % n_clusters),
                  fontsize=14, fontweight='bold')
plt.show()

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值