【机器学习实战】10分钟学会Python怎么用K均值K-means进行聚类(九)

简介: 【机器学习实战】10分钟学会Python怎么用K均值K-means进行聚类(九)

[toc]

1 前言

1.1 K-means的介绍

K均值(K-means)是一种基于距离度量的聚类算法,其主要思想是将数据集划分为k个不同的簇,每个簇代表一个相似度较高的数据组。该算法通过迭代优化来最小化所有数据点与其所属簇的欧氏距离之和,从而找到最佳的簇划分。



需要区分一下,K-means和KNN是两种不同的机器学习算法,K-means和KNN都是基于距离度量的算法,但前者用于聚类问题,而后者用于分类问题


  • K-means是一种聚类算法,它旨在将数据集分成k个不同的簇,每个簇代表一个相似度较高的数据组。该算法通过迭代优化来最小化所有数据点与其所属簇的欧氏距离之和,从而找到最佳的簇划分。
  • KNN(K-Nearest Neighbors)是一种分类算法,它将新样本与训练集中所有样本进行比较,并将其归为最接近的K个邻居中出现最多的类别。KNN算法使用欧氏距离或曼哈顿距离等计算相似性,然后根据K值确定邻居的数量。

优点:

  • 简单易用:算法的实现十分简单,也容易理解。
  • 可扩展性:在处理大规模数据时表现优秀,可以通过并行化等方法加速计算过程。
  • 效率高:算法的迭代次数通常较少,因此计算速度很快。

缺点:

  • 对初始值敏感:由于K-means算法是基于随机初始值进行迭代的,因此其结果很大程度上取决于初始中心点的选择。
  • 容易陷入局部最优:容易陷入局部最优解,无法保证找到全局最优解。
  • 簇数需要预先确定:需要预先确定簇的数量k,而实际应用中往往并不知道应该将数据划分成多少个簇。

1.2 K-means的应用

  1. 自然语言处理:K-means算法可用于文本聚类、主题建模和情感分析等自然语言处理任务。例如,将大量新闻文章聚类成不同的主题簇。
  2. 图像处理:K-means算法可用于图像分割、图像压缩和特征提取等图像处理任务。例如,使用K-means算法将图像像素分类为具有相似颜色和纹理的区域。
  3. 生物信息学:K-means算法可用于DNA序列和蛋白质序列的聚类和分类。例如,将蛋白质序列聚类到具有相似结构或功能的族群中。
  4. 金融风险管理:K-means算法可用于检测潜在的投资风险。例如,将投资组合分为不同的风险等级,并确定与每个等级相关的风险因素。
  5. 市场细分:K-means算法可用于市场细分和客户细分。例如,将消费者分成具有相似需求和偏好的不同类别,以便制定更有效的市场营销策略。
  6. 医疗诊断:K-means算法可用于分类和预测疾病。例如,将患有相似症状的患者分成具有类似病情的子组。

2 demo实战演示

2.1 导入函数

import matplotlib.pyplot as plt
from kneed import KneeLocator
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler

2.2 创建数据

#n_samples是要生成的样本总数,centers是要生成的中心数,cluster_std是标准偏差
features, true_labels = make_blobs(
     n_samples=200,
     centers=3,
     cluster_std=2.75,
     random_state=42
 )

查看数据

features[:5]
true_labels[:5]

缩放

scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)
scaled_features[:5]

2.3 拟合聚类

kmeans = KMeans(
    init="random",
    n_clusters=3,
    n_init=10,
    max_iter=300,
    random_state=42
)
kmeans.fit(scaled_features)

2.4 查看结果

# 最低的SSE值
kmeans.inertia_
# 质心的最终位置
kmeans.cluster_centers_
# 收敛所需的迭代次数
kmeans.n_iter_

一般有两种常见的方法评估聚类数:

  • 拐点法
  • 轮廓系数
# 选择合适的簇,注意这里把n_clusters改了,运行多个值并且记录结果
kmeans_kwargs = {
    "init": "random",
    "n_init": 10,
    "max_iter": 300,
    "random_state": 42,
}
sse = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, **kmeans_kwargs)
    kmeans.fit(scaled_features)
    sse.append(kmeans.inertia_)
# 可视化
 plt.style.use("fivethirtyeight")
 plt.plot(range(1, 11), sse)
 plt.xticks(range(1, 11))
 plt.xlabel("Number of Clusters")
 plt.ylabel("SSE")
 plt.show()

如图,这里很明显肉眼可见拐点是3,如果难以辨别可以通过kned识别

查看轮廓系数,轮廓系数是集群凝聚力和分离度的度量。它基于两个因素量化数据点与其分配的集群的匹配程度:轮廓系数值介于-1和之间1。较大的数字表示样本离它们的集群比离其他集群更近。

silhouette_coefficients = []
# 从轮廓系数的第2个集群开始
for k in range(2, 11):
    kmeans = KMeans(n_clusters=k, **kmeans_kwargs)
    kmeans.fit(scaled_features)
    score = silhouette_score(scaled_features, kmeans.labels_)
    silhouette_coefficients.append(score)
# 选最高分k值
plt.style.use("fivethirtyeight")
plt.plot(range(2, 11), silhouette_coefficients)
plt.xticks(range(2, 11))
plt.xlabel("Number of Clusters")
plt.ylabel("Silhouette Coefficient")
plt.show()


根据结果取最高分的点,这里依然是3

3 使用高级技术评估集群性能*

为了应付数据导致失真的情况,这是除了拐点法和轮廓系数外的一种高级方法

3.1 导入函数

from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons
from sklearn.metrics import adjusted_rand_score

3.2 整合数据

函数如其名,整合成新月数据

features, true_labels = make_moons(
    n_samples=250, noise=0.05, random_state=42
)
scaled_features = scaler.fit_transform(features)

3.3 计算

分别用k均值算法和DBSCAN算法进行计算对比,

# Instantiate k-means and dbscan algorithms
kmeans = KMeans(n_clusters=2)
dbscan = DBSCAN(eps=0.3)
# Fit the algorithms to the features
kmeans.fit(scaled_features)
dbscan.fit(scaled_features)
# Compute the silhouette scores for each algorithm
kmeans_silhouette = silhouette_score(
    scaled_features, kmeans.labels_
).round(2)
dbscan_silhouette = silhouette_score(
   scaled_features, dbscan.labels_
).round (2)
kmeans_silhouette
dbscan_silhouette

可视化结果:

# 绘制数据和集群轮廓比较
fig, (ax1, ax2) = plt.subplots(
    1, 2, figsize=(8, 6), sharex=True, sharey=True
)
fig.suptitle(f"Clustering Algorithm Comparison: Crescents", fontsize=16)
fte_colors = {
    0: "#008fd5",
    1: "#fc4f30",
}
# k-means
km_colors = [fte_colors[label] for label in kmeans.labels_]
ax1.scatter(scaled_features[:, 0], scaled_features[:, 1], c=km_colors)
ax1.set_title(
    f"k-means\nSilhouette: {kmeans_silhouette}", fontdict={"fontsize": 12}
)
# dbscan
db_colors = [fte_colors[label] for label in dbscan.labels_]
ax2.scatter(scaled_features[:, 0], scaled_features[:, 1], c=db_colors)
ax2.set_title(
    f"DBSCAN\nSilhouette: {dbscan_silhouette}", fontdict={"fontsize": 12}
)
plt.show()

也可以参考调整兰特指数 (ARI,adjusted rand index),ARI一般介于-1到1之间:

  • 当ARI等于1时,表示两个聚类结果完全一致,即两个聚类结果中所有样本都被分配到了同一个簇中,或者两个聚类结果中所有的不同簇的元素都是相同的。因此,ARI等于1时,表示聚类结果非常好。
  • 当ARI等于0时,表示两个聚类结果之间的一致性与随机模型的预期一致性相同。这意味着,两个聚类结果没有更多的关联比随机分配的情况要好,也就是说,聚类算法表现不佳。
  • 当ARI小于0时,表示两个聚类结果之间的一致性比随机模型还差。这通常出现在聚类结果的标签彼此之间毫无关系或者是完全相反的情况下,例如,两个聚类结果之间的标签是完全不同的情况下。
ari_kmeans = adjusted_rand_score(true_labels, kmeans.labels_)
ari_dbscan = adjusted_rand_score(true_labels, dbscan.labels_)
round(ari_kmeans, 2)
round(ari_dbscan, 2)

这里算到结果是0.471.0,ARI 表明,与k均值相比,DBSCAN 是合成新月示例的最佳选择

4 讨论

K-means总体来说不难,且有多个指标来衡量聚类的质量。下次出一波番外篇,记录如何构建Pineline处理TCGA的数据。

目录
相关文章
|
2月前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
417 67
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
2月前
|
数据采集 数据可视化 搜索推荐
Python数据分析全流程指南:从数据采集到可视化呈现的实战解析
在数字化转型中,数据分析成为企业决策核心,而Python凭借其强大生态和简洁语法成为首选工具。本文通过实战案例详解数据分析全流程,涵盖数据采集、清洗、探索、建模、可视化及自动化部署,帮助读者掌握从数据到业务价值的完整技能链。
272 0
|
1月前
|
数据采集 存储 Web App开发
Python爬虫库性能与选型实战指南:从需求到落地的全链路解析
本文深入解析Python爬虫库的性能与选型策略,涵盖需求分析、技术评估与实战案例,助你构建高效稳定的数据采集系统。
187 0
|
2月前
|
缓存 监控 API
1688平台开放接口实战:如何通过API获取店铺所有商品数据(Python示列)
本文介绍如何通过1688开放平台API接口获取店铺所有商品,涵盖准备工作、接口调用及Python代码实现,适用于商品同步与数据监控场景。
|
2月前
|
存储 数据安全/隐私保护 开发者
Python深浅拷贝全解析:从原理到实战的避坑指南
在Python开发中,深浅拷贝是处理对象复制的关键概念。直接赋值仅复制引用,修改副本会影响原始数据。浅拷贝(如切片、copy方法)创建新容器但共享嵌套对象,适用于单层结构或需共享子对象的场景;而深拷贝(copy.deepcopy)递归复制所有层级,确保完全独立,适合嵌套结构或多线程环境。本文详解二者原理、实现方式及性能考量,帮助开发者根据实际需求选择合适的拷贝策略,避免数据污染与性能浪费。
168 1
|
2月前
|
移动开发 安全 Linux
Python文件操作的"保险箱":with语句深度实战指南
本文深入解析Python中`with`语句的原理与高级应用,通过“保险箱”类比,形象展示资源管理机制。从上下文管理协议到实战场景,涵盖文件、数据库、网络等多种资源的高效安全处理方式,助你写出更优雅、可靠的代码。
61 1
|
2月前
|
存储 监控 安全
Python剪贴板监控实战:clipboard-monitor库的深度解析与扩展应用
本文介绍如何利用Python的clipboard-monitor库实现剪贴板监控系统,涵盖文本与图片的实时监听、防重复存储、GUI界面开发及数据加密等核心技术,适用于安全审计与自动化办公场景。
71 0
|
2月前
|
数据采集 存储 监控
Python爬虫实战:批量下载亚马逊商品图片
Python爬虫实战:批量下载亚马逊商品图片
|
2月前
|
数据采集 机器学习/深度学习 边缘计算
Python爬虫动态IP代理报错全解析:从问题定位到实战优化
本文详解爬虫代理设置常见报错场景及解决方案,涵盖IP失效、403封禁、性能瓶颈等问题,提供动态IP代理的12种核心处理方案及完整代码实现,助力提升爬虫系统稳定性。
124 0
|
2月前
|
安全 数据库 数据安全/隐私保护
Python办公自动化实战:手把手教你打造智能邮件发送工具
本文介绍如何使用Python的smtplib和email库构建智能邮件系统,支持图文混排、多附件及多收件人邮件自动发送。通过实战案例与代码详解,帮助读者快速实现办公场景中的邮件自动化需求。
200 0

推荐镜像

更多