直接导入sklearn中KMeans模块
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
#导入KMeans
from sklearn.cluster import KMeans
#生成一个样本点数据集
from sklearn.datasets import make_blobs
X,y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=2)
#绘制散点图
plt.scatter(X[:,0],X[:,1]
,marker="*"
,s = 6
)
data = pd.DataFrame(X)
在做聚类算法时,如何评估聚类效果的好坏,是一个难题。
如果采用SSE,缺点较明显,例如当特征数目较多、维度较大时,SSE的计算量很大。采取降维,增加了工作量也可能造成更多的损失。
通常使用轮廓系数作为聚类算法的评估指标。它是对每个样本来定义的,单个样本的轮廓系数方程式为:
**s = (b-a) / max(a,b)**
a是 样本 与 其自身所在簇的其他样本 的相似度,等于样本与同簇中所有点之间的平均距离。
b是 样本 与 异簇样本的相似度,等于样本与异簇所有点的平均距离。
使用轮廓系数
#使用轮廓系数
from sklearn.metrics import silhouette_samples
from sklearn.metrics import silhouette_score
#记录不同簇数下的轮廓系数的均值
silhouette_score_list = []
for i in [2,3,4,5,6]:
cluster_i = KMeans(n_clusters=i,random_state=2).fit(X)
cluster_i_labels = cluster_i.labels_
#样本点轮廓系数均值
silhouette_score_i = silhouette_score(X,cluster_i_labels)
silhouette_score_list.append(silhouette_score_i)
silhouette_score_list
列表如下:
[0.5563935385599693,
0.6602750377214402,
0.6250462156493074,
0.5682151387843899,
0.46897422644386516]
即,当簇数为3或4时,模型较优。