【机器学习实战】Python基于K均值K-means进行聚类(九)

news2024/11/19 3:38:25

文章目录

    • 1 前言
      • 1.1 K-means的介绍
      • 1.2 K-means的应用
    • 2 demo实战演示
      • 2.1 导入函数
      • 2.2 创建数据
      • 2.3 拟合聚类
      • 2.4 查看结果
    • 3 使用高级技术评估集群性能*
      • 3.1 导入函数
      • 3.2 整合数据
      • 3.3 计算
    • 4 讨论

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之间,越接近0表示分布的越随机,越接近1或-1表示可能存在误导性。

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的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

改写句子的软件有哪些-免费改写文章的软件

改写句子的软件 改写句子的软件是一种广泛应用于文字处理的工具,其主要作用是通过对原文中的语言结构和表述方式进行调整和优化,以改进文章的质量和可读性。改写句子的软件广泛用于新闻报道、科学文章、学术论文、书籍等各类文本材料中,旨在…

Elasticsearch的索引库和文档操作、RestClient的索引库和文档操作

一、Elasticsearch Linux系统通过Docker安装Elasticsearch、部署kibana 1.Elasticsearch Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索…

梅果提取物激增2782%?因字成分崛起|3月功效成分TOP100

全文速览 全文字数:6015字 阅读时长:8-12分钟 1.目前已有11款新原料成分进入监测期,三月新原料备案占比达27.1%。 2.天赐高新成为仅次于美国路博润的全球第二大卡波姆供应商,市占率将近两成。 3.氨基酸洗面奶凭多重功效替代皂…

Flink Dashboard的数据监控功能

一、数据反压 1.1 数据反压是啥 数据反压是在实时数据处理中,数据处理流的某个节点上游产生数据的速度大于该节点处理数据速度,导致数据堆积,从该节点向上游传递,一直到数据源,并降低数据源的摄入速度。导致数据反压…

如何远程内网电脑

要远程访问内联网计算机,您需要遵循以下一般步骤: 连接到与目标计算机相同的局域网 (LAN)。 这可能涉及到现场或使用 VPN 远程连接到 LAN。 获取目标计算机的 IP 地址或网络名称。 确保在目标计算机上启用了远程桌面访问。 使用远程桌面软件与目标计…

ASP.NET Core 8 中身份验证的改进

ASP.NET Core 团队正在改进 .NET 8 中的身份验证、授权和身份管理(统称为“身份验证”)。新的 APIs 将使自定义用户登录和身份管理体验变得更加容易。新的端点将在没有外部依赖的单页应用程序(SPA)中启用基于令牌的身份验证和授权。我们还将改进我们的指引和文档,使…

数据结构绪论

数据结构绪论 1.数据结构 数据结构 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。 数据 数据:是描述客观事物的符号,是计算机中可以…

Dtop环球嘉年华全球Web3.0分布式私域电商生态发展峰会圆满举办

5月7日,Dtop环球嘉年华全球Web3.0分布式跨境私域电商生态发展峰会暨战略合作备忘录签署仪式在马来西亚首都吉隆坡隆重举办。此次峰会汇集了Dtop环球嘉年华韩国、新加坡、澳洲、泰国、印尼等国家的社区联合发起人,环球自治商学院地区代表及来自Dtop环球嘉年华不同国家的粉丝用户…

nas各种共享访问协议的使用(smb,nfs,ftp,ftps,sftp,afp,webdav)

使用群晖、UNRAID、FREENAS等NAS系统的小伙伴肯定会有传输文件的需求,无论是在本地局域网还是远端设备,这种情况下当然可以使用群晖的WEB管理界面中File Station,但是这种方式便捷性不够,于是nas与本地设备文件的传输最好的方式是…

lua | table表的使用操作

目录 lua table表 表的构造 Table的使用 table.concat() table.insert()与table.remove() table.sort() table.maxn() 本文章为笔者学习分享 学习网站:Lua 基本语法 | 菜鸟教程 lua table表 table:是lua的一种数据结构,用来帮助我们…

为什么Windows 10电脑运行缓慢?如何解决?

​虽然电脑是大家生活中的常用工具,但它经常会出现一些烦人的小问题,比如Windows 10系统在长时间使用后运行会变的缓慢。这时你必须等待一会才能打开/关闭电脑、打开和访问文件夹或软件,那要如何优化Windows 10电脑来解决运行缓慢的问题呢&am…

如何在 Espressif-IDE 中使用 Wokwi 模拟器

乐鑫近期已发布 Espressif-IDE v2.9.0,您可直接在此版本的 IDE 中使用 Wokwi 模拟器。 什么是 Wokwi 模拟器? Wokwi 是一款在线电子模拟器,支持模拟各种开发板、元器件和传感器,例如乐鑫产品 ESP32。 Wokwi 提供基于浏览器的界面…

C++学习day--08 数组和字符串

1、什么是数组 数组,就是多个元素的有序“组合”。 C 和 C语言中的数组: 1 )由多个大小相同的小柜子组成 > 相同大小的内存块组成,即相同类型的数据 2 )这些小柜子,有自己对应的编号 > 编号从 …

软考中级工程师笔记(持续更新)

进制 正负0 -0原000110010000 1000反000111100000 1111补000111110000 0000 取值范围 原 -(2n-1)-1~(2n-1)-1 数量 [(2n-1)-1]-[-(2n-1)-1] 1(1代表0)(2*2n-1)-1**2n-1** 反 -(2n-1)-1~(2n-1)-1 数量 [(2n-1)-1]-[-(2n-1)-1] 1(1代表0)(2*2n-1)-1**2n-1** 补 -(2n-1)~(2n-…

算法设计 || 实验一 用分治法实现元素的归并与检索 (头歌详解+本题分析笔记)

目录 (一)递归与分治是个啥? 1.递归(归并排序) 2.分治(二分检索算法) (二)头歌代码怎么写? (三)代码部分详解: &…

Android内嵌Unity (Activity)

Unity2019.4.4 AndropidStudio4.2.1 参考文档: Android内嵌Unity并实现互相跳转的实例代码_Android_脚本之家 Android Fragment中加载,嵌套Unity视图_unity 导入并作为fragment_周灬浩的博客-CSDN博客 本文只实现了Activity整个切换过去,而Fragment…

WSL2 ubuntu ip 自动同步 、静态ip(解决wsl2 ip 每次开机ip会变化的问题)

​ 利用python脚本解决wsl2 ip不固定的问题 环境信息 ​ wsl2 中linux版本:ubuntu ​ windows版本: win10/win11 问题描述 最近装了wsl2,使用vscode远程连接wsl2时遇到了如下问题: 1、wsl2的ip无法固定 2、wsl2的ssh服务不能…

vue项目使用element-ui

最近新建一个vue项目,配置了element-ui,较之前使用时发生了些许变化,对新的配置方式进行记录 node版本 v14.21.3 npm版本 v6.14.18 vue版本 v2.6.14 element-ui版本 v2.15.13 创建项目vue项目,使用…

设计原则之【迪米特法则】

文章目录 一、什么是迪米特法则1、理解迪米特法则2、如何理解“高内聚、松耦合”? 二、实例1、实例12、实例2 一、什么是迪米特法则 迪米特原则(Law of Demeter LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则&…

Navicat自动提交的开和关

使用Navicat时,若是自动提交是打开状态,就相当于是自动执行了commit操作,就无法进行回滚操作。 一.相关指令 1.查询Navicat的自动提交开关状态: -- 查询自动提交 ON:是自动提交,即commit ;OFF:不是自动提交&#xf…