1.什么是K-Means?
K均值算法聚类
关键词:K个种子,均值
聚类的概念:一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中
K-Means算法是一种聚类分析(cluster analysis)的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法.
K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大.
2.k-Means原理
每次计算距离采用的是欧式距离
步骤图:
步骤总结:
主要优点:
主要缺点:
K是事先给定的,这个K值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。(ISODATA算法通过类的自动合并和分裂,得到较为合理的类型数目K)
K-Means算法需要用初始随机种子点来搞,这个随机种子点太重要,不同的随机种子点会有得到完全不同的结果。(K-Means++算法可以用来解决这个问题,其可以有效地选择初始点)
3.K-Means算法应用:
4.K-Means实例-亚洲国家队足球水平分类
1 import numpy as np 2 3 import pandas as pd 4 5 # cluster :簇,一堆 6 # 只有分类 7 from sklearn.cluster import KMeans 8 9 import matplotlib.pyplot as plt 10 %matplotlib inline 11 12 from mpl_toolkits.mplot3d.axes3d import Axes3D 13 import warnings 14 warnings.filterwarnings(‘ignore‘) 15 16 # 2006年世界杯,2010年世界杯,2007亚洲杯,比赛数据 17 football = pd.read_csv(‘./AsiaFootball.txt‘) 18 19 X = football.iloc[:,1:] 20 21 kmeans = KMeans(n_clusters=5) 22 23 # 无监督学习 PCA也是无监督 NMF无监督 24 kmeans.fit(X) 25 y_ = kmeans.predict(X) 26 27 # 分成3类 28 for i in range(3): 29 index = np.argwhere(y_ == i).reshape(-1) 30 print(‘类别是%d国家队有:‘%(i),football[‘国家‘].loc[index].get_values()) 31 32 # 分成5类 33 for i in range(5): 34 index = np.argwhere(y_ == i).reshape(-1) 35 print(‘类别是%d国家队有:‘%(i),football[‘国家‘].loc[index].get_values())
加载的数据结构:
分成3类打印输出:
分成5类打印输出:
分类好了,但是我们不知道分成4类好还是分成5类好,现在选取一些指标来评判一下:
(1)轮廓系数 Silhouette Coefficient
1 # 轮廓系数 2 from sklearn.metrics import silhouette_score 3 4 for i in range(2,16): 5 kmeans = KMeans(n_clusters=i) 6 kmeans.fit(X) 7 y_ = kmeans.predict(X) 8 s = silhouette_score(X,y_) 9 print(‘聚类个数是:%d。轮廓系数是:%0.2f‘%(i,s))
由轮廓系数分析可知,当分为6类的时候,效果最好
(2)calinski_harabasz_score CH分数(值越大,效果越好)
1 for i in range(2,16): 2 kmeans = KMeans(n_clusters=i) 3 kmeans.fit(X) 4 y_ = kmeans.predict(X) 5 s = metrics.calinski_harabasz_score(X,y_) 6 print(‘聚类个数是:%d。calinski_harabasz_score:%0.2f‘%(i,s))
(3)davies_bouldin_score 戴维森堡丁指数DBI(度量是每个聚类最大相似度的均值)
1 for i in range(2,16): 2 kmeans = KMeans(n_clusters=i) 3 kmeans.fit(X) 4 y_ = kmeans.predict(X) 5 s = metrics.davies_bouldin_score(X,y_) 6 print(‘聚类个数是:%d。davies_bouldin_score:%0.2f‘%(i,s))
以上三种方式得到的最优分类均不同,这是因为数据的原因,数据不太好.
原文:https://www.cnblogs.com/xiuercui/p/11980743.html