K-means介绍
这是写机器学习笔记以来的第一个无监督学习算法,最常见的无监督学习就是聚类,也就是将无标记的数据分成几种集群,这些集群是根据某种相似度指标进行划分的。例如欧式距离等。聚类常常被用来探索数据集,例如推荐系统,会使用聚类定位一个用户感兴趣的产品。市场营销会对相似用户进行分组等等
而K-means是最流行的聚类算法之一,由于它的速度以及稳定性广受欢迎。其中K代表的是K类,也就是聚成几类,Means代表的是中心。这个算法的本质就是确定K类的中心点,当你找到了这些中心点,也就是完成了聚类
K-means原理
k-means的原理非常简单,具体步骤如下:
- 选取k个点作为初始类的中心(图心),点是随机抽取的,sklearn可选取最优点
- 将每个点分配到离它最近的图心,形成k个类群,然后重新计算每个类的图心
- 重复第二步,直到类不发生变化,或者设置最大迭代次数,当迭代次数一到就停止迭代
Sklearn实现
引用数据分析45讲的数据集,具体数据集在这 数据集下载地址
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')
data = pd.read_csv(r'C:\Users\11060\Desktop\data.csv',encoding='gbk')
X_train = data[['2019年国际排名','2018世界杯','2015亚洲杯']]
df = pd.DataFrame(X_train)
model = KMeans(n_clusters=3
# max_iter=100, 最大迭代次数
# n_init=10 初始化中心次数,选取较好的中心点
# init='k-means++' 初始值的选定方式,默认为优化过的k-means++方式,
# algorithm k-means的实现算法,有auto、full、elkan三种方式
)
X_train_scaled = StandardScaler().fit_transform(X_train)
model.fit(X_train_scaled)
y_predict = model.predict(X_train_scaled)
result = pd.concat((data,pd.DataFrame(y_predict)),axis=1)
result.rename({0:'聚类后的数据分布'},inplace=True,axis=1)
print(result)
# output
国家 2019年国际排名 2018世界杯 2015亚洲杯 聚类后的数据分布
0 中国 73 40 7 0
1 日本 60 15 5 2
2 韩国 61 19 2 2
3 伊朗 34 18 6 2
4 沙特 67 26 10 2
5 伊拉克 91 40 4 0
6 卡塔尔 101 40 13 1
7 阿联酋 81 40 6 0
8 乌兹别克斯坦 88 40 8 0
9 泰国 122 40 17 1
10 越南 102 50 17 1
11 阿曼 87 50 12 1
12 巴林 116 50 11 1
13 朝鲜 110 50 14 1
14 印尼 164 50 17 1
15 澳洲 40 30 1 2
16 叙利亚 76 40 17 1
17 约旦 118 50 9 1
18 科威特 160 50 15 1
19 巴勒斯坦 96 50 16 1
K值的选择
如果K值不能由问题的上下文确定,最优的聚类数量通过肘部法来估计,肘部法通过使用不同的K值绘制出代价函数的值,随着K值增加,平均偏差也会增加,每个聚类将会包含更少的实例,同时实例也更加靠近各自对应的图心,然而,K值的增加,对平均离差的提升将会减少,离差提升最陡时的K值称为肘部,下面构造一个数据集来演示肘部法:
c1x = np.random.uniform(0.5,1.5,(1,10))
c1y = np.random.uniform(0.5,1.5,(1,10))
c2x = np.random.uniform(3.5,4.5,(1,10))
c2y = np.random.uniform(3.5,4.5,(1,10))
x = np.hstack((c1x,c2x))
y = np.hstack((c1y,c2y))
X = np.vstack((x,y)).T
K = range(1,10)
meanDispersions = []
for k in K:
kemans = KMeans(n_clusters=k)
kemans.fit(X)
meanDispersions.append(sum(np.min(cdist(X,kemans.cluster_centers_,'euclidean'),axis=1))/X.shape[0])
f,ax = plt.subplots(1,2,figsize=(15,6))
plt.subplot(121)
plt.scatter(x,y)
plt.subplot(122)
plt.plot(K,meanDispersions,'bx-')
plt.show()
可以明显的看到拐点是在K=2的地方,当K>2时,平均离差逐渐平缓,所以可以确定K值为2。
在本次的球队数据集中,同样画出图
由于数据不像构造的数据一样分割明显,但是还是可以选则K=4作为最优参数,因为当K>4是,图像下降变慢。
K-means的优缺点
优点
- 原理容易理解,可解释性
- 易于实现
- 稳定性高
缺点
- 在大数据集上收敛速度慢
- 对异常值敏感
- K值的不确定性
- 数据集大的时候,计算时间影响较大
- 对初始值选取敏感
K-means与KNN的区别
- K-means是无监督学习,且为聚类算法,KNN是有监督学习,分类算法
- K-means的K代表的是K个簇,KNN代表的是K个邻居