聚类算法K-means实战(详细代码+数据集)
创作时间:
作者:
@小白创作中心
聚类算法K-means实战(详细代码+数据集)
引用
CSDN
1.
https://m.blog.csdn.net/weixin_38232619/article/details/138015160
有关k-means的原理我们已经讲过了,为了更好的进行实战训练,我们先简单的回顾一下(K-means工作流程):
- 先设定K值
- 随机初始化K个质心点
- 计算每个样本点到各个质心点的距离,样本点距离哪个质心的距离最小,就归到哪一类中。
- 所有的样本点都归类结束后,更新质心点。对每个类重新算均值,算质心。
- 重新遍历样本点,对样本点重新计算距离并归类。
- 直到样本点分类不在发生变化,停止更新。
接下来进行今天的k-means实战练习。首先看看我们的数据集:
本次实战的目标是对啤酒进行分类,name是啤酒的名称。该数据集有四个属性:卡路里/钠含量/酒精含量/价值。
1. 首先写入数据集
import pandas as pd
beer = pd.read_csv('data.txt', sep=' ')
X = beer[["calories","sodium","alcohol","cost"]]
2. 应用k-means算法进行聚类分析
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3).fit(X) #n_clusters就是k值,我们设定k=3或k=2做比较
km2 = KMeans(n_clusters=2).fit(X)
3. 将分类结果进行排序
beer['cluster'] = km.labels_ #km.labels_对应数据标签
beer['cluster2'] = km2.labels_
beer.sort_values('cluster')
4. 求出每一类的质心
centers = beer.groupby("cluster").mean().reset_index()
5. 画图
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 14
import numpy as np
colors = np.array(['red', 'green', 'blue', 'yellow'])
plt.scatter(beer["calories"], beer["alcohol"],c=colors[beer["cluster"]])
plt.scatter(centers.calories, centers.alcohol, linewidths=3, marker='+', s=300, c='black')
plt.xlabel("Calories")
plt.ylabel("Alcohol")
7. 数据归一化
Scaled data
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_scaled:
array([[ 0.38791334, 0.00779468, 0.43380786, -0.45682969],
[ 0.6250656 , 0.63136906, 0.62241997, -0.45682969],
[ 0.82833896, 0.00779468, -3.14982226, -0.10269815],
[ 1.26876459, -1.23935408, 0.90533814, 1.66795955],
[ 0.65894449, -0.6157797 , 0.71672602, 1.95126478],
[ 0.42179223, 1.25494344, 0.3395018 , -1.5192243 ],
[ 1.43815906, 1.41083704, 1.1882563 , -0.66930861],
[ 0.55730781, 1.87851782, 0.43380786, -0.52765599],
[-1.1366369 , -0.7716733 , 0.05658363, -0.45682969],
[-0.66233238, -1.08346049, -0.5092527 , -0.66930861],
[ 0.25239776, 0.47547547, 0.3395018 , -0.38600338],
[-1.03500022, 0.00779468, -0.13202848, -0.24435076],
[ 0.08300329, -0.6157797 , -0.03772242, 0.03895447],
[ 0.59118671, 0.63136906, 0.43380786, 1.88043848],
[ 0.55730781, -1.39524768, 0.71672602, 2.0929174 ],
[-2.18688263, 0.00779468, -1.82953748, -0.81096123],
[ 0.21851887, 0.63136906, 0.15088969, -0.45682969],
[ 0.38791334, 1.41083704, 0.62241997, -0.45682969],
[-2.05136705, -1.39524768, -1.26370115, -0.24435076],
[-1.20439469, -1.23935408, -0.03772242, -0.17352445]])
8. 使用归一化之后的数据再进行聚类算法
km = KMeans(n_clusters=3).fit(X_scaled)
beer["scaled_cluster"] = km.labels_
beer.sort_values("scaled_cluster")
9. 使用轮廓系数来评判k-means算法分类的准确度
- 计算样本i到同簇其他样本的平均距离ai。ai 越小,说明样本i越应该被聚类到该簇。将ai 称为样本i的簇内不相似度。
- 计算样本i到其他某簇Cj 的所有样本的平均距离bij,称为样本i与簇Cj 的不相似度。定义为样本i的簇间不相似度:bi =min{bi1, bi2, ..., bik}
- si接近1,则说明样本i聚类合理
- si接近-1,则说明样本i更应该分类到另外的簇
- 若si 近似为0,则说明样本i在两个簇的边界上。
from sklearn import metrics
score_scaled = metrics.silhouette_score(X,beer.scaled_cluster)
score = metrics.silhouette_score(X,beer.cluster)
print(score_scaled, score)
输出结果:
0.179780680894 0.673177504646
如上是数据归一化和未归一化的轮廓系数,未进行归一化的数据使用k-means算法反而分类效果更好。
10. 对k值进行遍历,选取轮廓系数最高的k值
scores = []
for k in range(2,20):
labels = KMeans(n_clusters=k).fit(X).labels_
score = metrics.silhouette_score(X, labels)
scores.append(score)
scores:
[0.69176560340794857,
0.67317750464557957,
0.58570407211277953,
0.42254873351720201,
0.4559182167013377,
0.43776116697963124,
0.38946337473125997,
0.39746405172426014,
0.33061511213823314,
0.34131096180393328,
0.34597752371272478,
0.31221439248428434,
0.30707782144770296,
0.31834561839139497,
0.28495140011748982,
0.23498077333071996,
0.15880910174962809,
0.084230513801511767]
11. 画出不同k值轮廓系数变化图
plt.plot(list(range(2,20)), scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Sihouette Score")
如下是本次试验的数据集,复制粘贴到data.txt文件即可
name calories sodium alcohol cost
Budweiser 144 15 4.7 0.43
Schlitz 151 19 4.9 0.43
Lowenbrau 157 15 0.9 0.48
Kronenbourg 170 7 5.2 0.73
Heineken 152 11 5.0 0.77
Old_Milwaukee 145 23 4.6 0.28
Augsberger 175 24 5.5 0.40
Srohs_Bohemian_Style 149 27 4.7 0.42
Miller_Lite 99 10 4.3 0.43
Budweiser_Light 113 8 3.7 0.40
Coors 140 18 4.6 0.44
Coors_Light 102 15 4.1 0.46
Michelob_Light 135 11 4.2 0.50
Becks 150 19 4.7 0.76
Kirin 149 6 5.0 0.79
Pabst_Extra_Light 68 15 2.3 0.38
Hamms 139 19 4.4 0.43
Heilemans_Old_Style 144 24 4.9 0.43
Olympia_Goled_Light 72 6 2.9 0.46
Schlitz_Light 97 7 4.2 0.47
以上就是本次的k-means巩固小实验,抽时间动动手练习一下吧!
热门推荐
一建项目管理怎么学
同样是变法,商鞅、王安石和张居正有什么不同之处?
内衣尺寸测量全攻略:台湾、日本、欧美尺寸换算指南
日本流行语第一的「蛙化现象」,背后竟隐藏着这样的恋爱心理...
英语语法基础知识:冠词
熟龄肌护肤新篇章!30岁+专属抗老技巧
抗老攻略:如何选择合适的抗皱产品?
安史之乱:为何史思明被历史遗忘?
高质量的幸福婚姻如何维持?
科技助力古籍“藏”与“用”:卷帙遗韵获新生
助推中国古代典籍数字化传播 AI古籍语料库南京高校取得新突破
新晋T0法王,伤害爆炸、控制拉满,冰爆流元流法师起飞
塞尔达送装备:法律视角下的知识产权与赠品责任分析
21世纪最伟大歌手,没有一个来自中国
少女时代《Gee》MV播放量破2亿,见证"女帝组合"辉煌成就
义乌会展经济持续发力
中美科技竞争下的基础研究投入与经费差距对比:研发实力与投入趋势分析
从大数据及经络角度理解「麻黄」的5种强大功效!
准晶体(超分子)
王安石变法:北宋时期的改革尝试与历史启示
端到端能让自动驾驶“火力全开”吗?
苏维埃之翼vs克拉斯诺达尔:9连胜领头羊遭遇主场虫
军人离婚的手续如何办理
画图编程用什么鼠标好用
《黑神话》之前,Steam最受好评的国产游戏是什么?
北京今年将建成1000座超级充电站 力争实现高速公路服务区超充站全覆盖
2025高考报名需要什么条件 有哪些要求
燕鱼饲养指南:15个关键要点助你养出健康美丽的燕鱼
基因编辑技术的伦理与法律风险
全国爱鼻日:起床、睡觉时爱打喷嚏?可能是尘螨引起的