机器学习(四):K-means聚类算法

K-means介绍

这是写机器学习笔记以来的第一个无监督学习算法,最常见的无监督学习就是聚类,也就是将无标记的数据分成几种集群,这些集群是根据某种相似度指标进行划分的。例如欧式距离等。聚类常常被用来探索数据集,例如推荐系统,会使用聚类定位一个用户感兴趣的产品。市场营销会对相似用户进行分组等等
而K-means是最流行的聚类算法之一,由于它的速度以及稳定性广受欢迎。其中K代表的是K类,也就是聚成几类,Means代表的是中心。这个算法的本质就是确定K类的中心点,当你找到了这些中心点,也就是完成了聚类

K-means原理

k-means的原理非常简单,具体步骤如下:

  1. 选取k个点作为初始类的中心(图心),点是随机抽取的,sklearn可选取最优点
  2. 将每个点分配到离它最近的图心,形成k个类群,然后重新计算每个类的图心
  3. 重复第二步,直到类不发生变化,或者设置最大迭代次数,当迭代次数一到就停止迭代

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个邻居
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2020重新做人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值