Kmeans算法是一个无监督算法,
他是根据一大堆数据自己训练出他自己是属于哪一类型的,本质上也是算距离
我们先自己搞一个已经做好分类的kmeans数据集
from sklearn.datasets import make_blobs #自己创建数据集
X, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1) #有500样本,2个类别,4个中心点
plt.scatter(X[:, 0], X[:, 1], marker='o')#点的形状 ,s=8 #点的大小
color = ["red","pink","orange","gray"]
for i in range(4):
plt.scatter(X[y==i, 0], X[y==i, 1]
,marker='o' #点的形状
,s=8 #点的大小
,c=color[i] )
plt.show()
# 这样就看到了一个可视化的kmeans图
下面来正式导入sklearn实践
from sklearn.cluster import KMeans
n_clusters = 3
cluster = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
cluster.labels_ #重要属性 labels_,查看聚好的类别,每个样本所对应的类
cluster.cluster_centers_ #这个是用来看质心的坐标的
# 如何衡量模型的好坏,用轮廓系数:
# 依赖评价簇内的稠密程度(簇内差异小)和簇间的离散程度(簇外差异大)来评估聚类的效果
# 轮廓系数越接近 1:样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似。
# 轮廓系数为 0 时:两个簇中的样本相似度一致,两个簇本应该是一个簇。
# 轮廓系数为负时:样本点与簇外的样本更相似。
from sklearn.metrics import silhouette_score #返回的是一个数据集中,所有样本的轮廓系数的均值。
from sklearn.metrics import silhouette_samples #返回的是数据集中每个样本自己的轮廓系数
import pandas as pd
score=[]
for i in range(2,100):
cluster= KMeans(n_clusters=i, random_state=0).fit(X)
score.append(silhouette_score(X,cluster.labels_))
plt.plot(range(2,100),score)
plt.axvline(pd.DataFrame(score).idxmin()[0]+2,ls=':')