机器学习]聚类算法|KMeans 实现过程|SSE 误差均衡法和 SC 轮廓系数法|客户数据聚类分析示例
最编程
2024-10-16 16:28:20
...
文章目录
- 聚类算法
- 聚类算法简介
- 聚类算法分类
- 聚类算法API
- 案例 使用KMeans模型数据探索聚类
- KMeans实现流程***
- 模型评估方法
- 误差平方和 SSE(The sum of squares due to error)
- “肘”方法 (Elbow method) - K值确定
- SC轮廓系数法(Silhouette Coefficient)
- 聚类效果评估 – CH轮廓系数法(Calinski-Harabasz Index)
- 模型评估代码演示
- SSE 误差平方和
- SC系数
- CH系数
- 案例:顾客数据聚类分析
聚类算法
聚类算法简介
- 什么是聚类算法?
- 根据样本之间的相似性,将样本划分到不同的类别中;不同的相似度计算方法,会得到不同的聚类结果,
- 常用的相似度计算方法有欧式距离法。
- 聚类算法的目的是在没有先验知识的情况下,自动发现数据集中的内在结构和模式。
- 无监督学习算法
- 使用不同的聚类准则,产生的聚类结果不同
- 聚类算法在现实中的应用
- 用户画像,广告推荐,Data Segmentation,搜索引擎的流量推荐,恶意流量识别(搜广推)
- 基于位置信息的商业推送,新闻聚类,筛选排序
- 图像分割,降维,识别,离群点检测,信用卡异常消费,发掘相同功能的基因片段
- 图像分类|目标检测|图像分割
聚类算法分类
- 1.根据聚类颗粒度分类
- 2.根据实现方法分类
- K-means:按照质心分类,主要介绍K-means,通用、普遍
- 层次聚类:对数据进行逐层划分,直到达到聚类的类别个数]]
- DBSCAN聚类(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法
- 谱聚类是一种基于图论的聚类算法
聚类算法API
sklearn.cluster.KMeans(n_clusters=8)
- 参数: n_clusters : 开始的聚类中心数量
- 整型,缺省值=8,生成的聚类数,及产生的质心数
- 方法
- estimator.fit(x)
- estimator.predict(x)
- estimator.fit_predict(x)
- 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)
- calinski_harabasz_score(x,y_pred) 用来评估聚类效果,数值越大越好
案例 使用KMeans模型数据探索聚类
- 随机创建不同二维数据集作为训练集,并结合k-means算法将其聚类,尝试分别聚类不同数量的簇,并观察聚类效果:
-
实现流程
- 1.导入依赖包
- sklearn.cluster.KMeans
- sklearn.datasets.make_blobs
- 2.构建数据集
- 3.模型训练并预测(实例化Kmeans)
- 4.展示聚类效果
- 5.评估聚类效果好坏
- 1.导入依赖包
-
代码实现
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import calinski_harabasz_score
import matplotlib.pyplot as plt
# 构建数据集1000个样本,每个样本2个特征4个质心簇数据标准差0.4 0.2 0.2 0.2
x, y = make_blobs(n_samples=1000, n_features=2, centers=4, cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=9)
plt.figure()
plt.scatter(x[:, 0], x[:, 1], marker='o')
plt.show()
# 使用k_means聚类
estimator = KMeans(n_clusters=3, random_state=21, n_init='auto')
estimator.fit(x)
y_predict = estimator.predict(x)
# 展示聚类结果
plt.figure()
plt.scatter(x[:, 0], x[:, 1], marker='o', c=y_predict)
plt.show()
# 模型评估 使用CH方法评估
print(calinski_harabasz_score(x, y_predict))
-
运行结果
-
预测前
-
预测后
-
KMeans实现流程***
- 1、事先确定常数K ,常数K意味着最终的聚类类别数
- 2、随机选择 K 个样本点作为初始聚类中心
- 3、计算每个样本到 K 个中心的距离,选择最近的聚类中心点作为标记类别
- 4、根据每个类别中的样本点,重新计算出新的聚类中心点(平均值),如果计算得出的新中心点
与原中心点一样则停止聚类,否则重新进行第 2 步过程,直到聚类中心不再变化
模型评估方法
误差平方和 SSE(The sum of squares due to error)
- Ci 表示簇
- k 表示聚类中心的个数
- p 表示某个簇内的样本
- m 表示质心点
结论:SSE 越小,表示数据点越接近它们的 中心,聚类效果越好
“肘”方法 (Elbow method) - K值确定
- “肘” 方法通过 SSE 确定 n_clusters 的值
- 对于n个点的数据集,迭代计算 k (from 1 to n),每次聚类完成后计算 SSE
- SSE 是会逐渐变小的,因为每个点都是它所在的簇中心本身。
- SSE 变化过程中会出现一个拐点,下降率突然变缓时即认为是最佳 n_clusters 值。
- 在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别。
SC轮廓系数法(Silhouette Coefficient)
- 轮廓系数法考虑簇内的内聚程度(Cohesion),簇外的分离程度(Separation)。其计算过程如下
- 对计算每一个样本 i 到同簇内其他样本的平均距离????i,该值越小,说明簇内的相似程度越大
- 计算每一个样本 i 到最近簇 j 内的所有样本的平均距离 bij,该值越大,说明该样本越不属于其他簇 j
- 根据下面公式计算该样本的轮廓系数:S = b −a/max(a, b)
- 计算所有样本的平均轮廓系数
- 轮廓系数的范围为:[-1, 1]
- 结论: SC值越大,聚类效果越好
聚类效果评估 – CH轮廓系数法(Calinski-Harabasz Index)
-
CH系数考虑簇内的内聚成程度,簇外的离散程度,质心的个数
- 类别内部数据的距离平方和越小越好,类别之间的距离平方和越大越好.聚类的种类数越少越好
-
SSW 的含义:相当于SSE,蔟内距离
- C_pi表示质心
- x_i表示某个样本
- SSW 值是计算每个样本点到质心的距离,并累加起来
- SSW 表示表示簇内的内聚程度,越小越好
-
SSB 的含义:簇间距离
- C_j表示质心,X ̅ 表示质心与质心之间的中心点,n_j表示样本的个数
- SSB 表示簇与簇之间的分离程度,SSB 越大越好
- m 表示样本数量
- k 表示质心个数
-
结论: CH值越大,聚类效果越好
模型评估代码演示
SSE 误差平方和
from sklearn.cluster import KMeans # K-Means
import matplotlib.pyplot as plt # 画图
from sklearn.datasets import make_blobs # 生成数据
from sklearn.metrics import calinski_harabasz_score # 轮廓系数
def dm01():
x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=22)
sse_list = []
for clu_num in range(1, 100):
my_kmeans = KMeans(n_clusters=clu_num, max_iter=100, random_state=0)
my_kmeans.fit(x)
sse_list.append(my_kmeans.inertia_) # 获取sse的值添加到列表中
# 展示效果
plt.figure(figsize=(18, 8), dpi=100)
plt.xticks(range(0, 100, 3), labels=range(0, 100, 3))
plt.grid()
plt.title("sse")
plt.plot(range(1, 100), sse_list, 'or-')
plt.show()
if __name__ == '__main__':
dm01()
运行结果: 根据肘方法得出 4的时候效果最好
SC系数
from sklearn.cluster import KMeans # K-Means
import matplotlib.pyplot as plt # 画图
from sklearn.datasets import make_blobs # 生成数据
from sklearn.metrics import calinski_harabasz_score, silhouette_score # 轮廓系数
def dm02():
# 2.构建数据,产生数据random_state=22固定好
x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=22)
# 3.模型训练及SC系数
tmp_list = []
for clu_num in range(2, 100):
my_kmeans = KMeans(n_clusters=clu_num, max_iter=100, random_state=0)
my_kmeans.fit(x)
ret = my_kmeans.predict(x)
tmp_list.append(silhouette_score(x, ret)) # SC系数
# 4.效果展示
plt.figure(figsize=(18, 8), dpi=100)
plt.xticks(range(0, 100, 3), labels=range(0, 100, 3))
plt.grid()
plt.title('sse')
plt.plot(range(2, 100), tmp_list, 'ob-')
plt.show()
if __name__ == '__main__':
dm02()
运行结果: 在取4时SC值最大
CH系数
from sklearn.cluster import KMeans # K-Means
import matplotlib.pyplot as plt # 画图
from sklearn.datasets import make_blobs # 生成数据
from sklearn.metrics import calinski_harabasz_score, silhouette_score # 轮廓系数
def dm03():
# 2.构建数据,产生数据random_state=22固定好
x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.2], random_state=22)
# 3.模型训练及CH
tmp_list = []
for clu_num in range(2, 100):
my_kmeans = KMeans(n_clusters=clu_num, max_iter=100, random_state=0)
my_kmeans.fit(x)
ret = my_kmeans.predict(x)
tmp_list.append(calinski_harabasz_score(x, ret)) # CH
# 4.展示效果
plt.figure(figsize=(18, 8), dpi=100)
plt.xticks(range(0, 100, 3), labels=range(0, 100, 3))
plt.grid()
plt.title('ch')
plt.plot(range(2, 100), tmp_list, 'og-')
plt.show()
if __name__ == '__main__':
dm03()
运行结果: 在4时CH结果最大
案例:顾客数据聚类分析
- 已知:客户性别、年龄、年收入、消费指数
- 需求:对客户进行分析,找到业务突破口,寻找黄金客户
- 客户分群效果展示:
从图中可以看出,聚成5类,右上角属于挣的多,消费的也多黄金客户群
- 代码实现
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score
def demo01():
# 读取数据
data = pd.read_csv('../data/customers.csv')
# 特征选择
x = data.iloc[:, [3, 4]]
# 模型训练
mysse = []
mysscore = []
for i in range(2, 11):
myKmeans = KMeans(n_clusters=i)
myKmeans.fit(x)
mysse.append(myKmeans.inertia_) # 簇内误差平方和
ret = myKmeans.predict(x)
mysscore.append(silhouette_score(x, ret)) # SC系数 聚类需要1个以上的类别
# 数据可视化效果展示
plt.plot(range(2, 11), mysse)
plt.title('the elbow method')
plt.xlabel('number of clusters')
plt.ylabel('mysse')
plt.grid()
plt.show()
plt.title('sh')
plt.plot(range(2, 11), mysscore)
plt.grid(True)
plt.show()
def demo02():
# 2.读取数据及数据预处理
dataset = pd.read_csv('../data/customers.csv')
X = dataset.iloc[:, [3, 4]]
# 3.模型训练及预测
mykeans = KMeans(n_clusters=5)
mykeans.fit(X)
y_kmeans = mykeans.predict(X)
# 4.聚类效果展示
# 把类别是0的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数
plt.scatter(X.values[y_kmeans == 0, 0], X.values[y_kmeans == 0, 1], s=100, c='red', label='Standard')
# 把类别是1的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数
plt.scatter(X.values[y_kmeans == 1, 0], X.values[y_kmeans == 1, 1], s=100, c='blue', label='Traditional')
# 把类别是2的, 第0列数据,第1列数据, 作为x/y, 传给plt.scatter函数
plt.scatter(X.values[y_kmeans == 2, 0], X.values[y_kmeans == 2, 1], s=100, c='green', label='Normal')
plt.scatter(X.values[y_kmeans == 3, 0], X.values[y_kmeans == 3, 1], s=100, c='cyan', label='Youth')
plt.scatter(X.values[y_kmeans == 4, 0], X.values[y_kmeans == 4, 1], s=100, c='magenta', label='TA')
plt.scatter(mykeans.cluster_centers_[:, 0], mykeans.cluster_centers_[:, 1], s=300, c='black', label='Centroids')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()
if __name__ == '__main__':
demo01()
demo02()
- 效果展示
通过肘方法、SH系数都可以看出,聚成5类效果最好
推荐阅读
-
DBSwitch 和 Seatunel
-
gaussdb 基础管理 数据库 表 用户 模式 权限 存储过程
-
PostgreSQL 17 重新发布--全球最成功的数据库
-
Java 项目实践 II 基于 Java + Spring Boot + MySQL 的匹配网站设计与实施(源代码 + 数据库 + 文档)
-
JavaScript 第 16 章:错误处理和调试
-
在线游戏 "服务器向客户端分发信息[21]。
-
64 页 PPT | 汽车经销商数据应用解决方案
-
[重磅升级] 基于大数据的股票量化分析与预测系统
-
宏梦网络编程系列 8 - TLS 安全数据传输双向验证示例
-
MQTT 和 mosquitto 编程和移植