当前位置: 首页 > news >正文

K-Means聚类

聚类的作用:

  • 知识发现 发现事物之间的潜在关系

  • 异常值检测

  • 特征提取 数据压缩的例子

有监督和无监督学习:

有监督:

  • 给定训练集 X 和 标签Y

  • 选择模型

    • 学习(目标函数的最优化)

    • 生成模型(本质上是一组参数、方程)

根据生成的一组参数进行预测分类等任务

无监督:

  • 拿到的数据只有X ,没有标签,只能根据X的相似程度做一些事情。

  • Clustering 聚类

    • 对于大量未标注的数据集,按照内在相似性来分为多个类别(簇) 目标:类别内相似度大,类别间相似小。

    • 也可以用来改变数据的维度,可以将聚类结果作为一个维度添加到训练数据中。

  • 降维算法,数据特征变少

相似度:

数据间相似度:

 

  • 每一条数据都可以理解为多维空间中的一个点。

  • 可以根据点和点之间的距离来评价数据间的相似度

  • 近朱者赤近墨者黑!

​​​​​​​欧式距离:

 

闵可夫斯基距离:

 

 

余弦距离:

将数据看做空间中的点的时候,评价远近可以用欧氏距离或者余弦距离。

计算过程如下:

  • 将数据映射为高维空间中的点(向量)

  • 计算向量间的余弦值

  • 取值范围[-1,+1] 越趋近于1代表越相似,越趋近于-1代表方向相反,0代表正交

 

描述:

K-Means 是一种常用的聚类算法,它的目标是将数据集划分为 KKK 个簇,使得簇内数据点之间的相似度最大化,而簇与簇之间的相似度最小化。K-Means 算法的基本流程是:

  1. 随机选择 KKK 个初始簇中心。
  2. 计算每个数据点到每个簇中心的距离,将数据点分配到最近的簇。
  3. 更新每个簇的中心,重新计算簇的质心。
  4. 重复步骤 2 和 3,直到簇中心不再发生变化或达到最大迭代次数。

我们可以使用 sklearn 库来实现 K-Means 聚类,或者手动编写 K-Means 算法。以下是这两种方法的实现。

聚类过程:

1. 使用 sklearn 库实现 K-Means 聚类

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs# 生成样本数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# 使用 sklearn 实现 K-Means
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)# 获取聚类结果
y_kmeans = kmeans.predict(X)# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')# 绘制簇的质心
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.title("K-Means Clustering with sklearn")
plt.show()

 在这里,make_blobs 用于生成模拟的聚类数据集。我们使用 KMeans 类对数据进行聚类,并绘制出每个簇的质心和分配给每个簇的点。可以通过设置 n_clusters 参数来调整簇的数量。

2. 手动实现 K-Means 算法

如果不使用 sklearn,我们可以手动实现 K-Means 算法。以下是 K-Means 的基本实现步骤:

import numpy as np
import matplotlib.pyplot as plt# 生成随机数据
def create_data(n_samples=300, n_features=2, n_clusters=4, cluster_std=0.60, random_state=0):np.random.seed(random_state)X = []centers = np.random.randn(n_clusters, n_features) * 10for center in centers:X.append(center + np.random.randn(n_samples // n_clusters, n_features) * cluster_std)return np.vstack(X)# 计算欧氏距离
def euclidean_distance(a, b):return np.linalg.norm(a - b, axis=1)# K-Means算法实现
def kmeans(X, k, max_iters=100):# 随机初始化簇中心centers = X[np.random.choice(X.shape[0], k, replace=False)]for _ in range(max_iters):# 计算每个点到各个簇中心的距离,并分配到最近的簇labels = np.array([np.argmin(euclidean_distance(x, centers)) for x in X])# 计算新的簇中心new_centers = np.array([X[labels == i].mean(axis=0) for i in range(k)])# 检查簇中心是否发生变化,若无变化则停止迭代if np.all(centers == new_centers):breakcenters = new_centersreturn labels, centers# 生成数据
X = create_data(n_samples=300, n_clusters=4, random_state=0)# 设置K值,运行K-Means
k = 4
labels, centers = kmeans(X, k)# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=50, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.title("K-Means Clustering Manual Implementation")
plt.show()

解释:

  1. 数据生成create_data 函数用来生成模拟数据。
  2. 计算距离euclidean_distance 函数用于计算数据点与簇中心之间的欧氏距离。
  3. K-Means 核心算法:在 kmeans 函数中,我们随机初始化簇中心,然后通过多次迭代更新簇中心和数据点分配,直到收敛。

3意义:

K-Means 是一种无监督学习算法,主要用于解决聚类问题。它的核心思想是通过划分数据集,将相似的数据点归为一类,以最大化簇内相似度、最小化簇间相似度。具体意义包括:

  • 数据分类与简化:K-Means 可用于对无标签的数据集进行划分,将复杂的高维数据简化为多个类别。通过划分数据集,可以更好地理解数据的分布与结构。

  • 发现潜在模式:K-Means 通过将数据进行分组,可以揭示隐藏在数据中的潜在模式。例如,在消费行为数据中,K-Means 可以帮助识别出不同类型的消费者群体。

  • 降维与数据压缩:在某些情况下,K-Means 可用于数据降维和数据压缩。通过将相似的点划分为同一个簇,实际中可以用簇中心来代替数据点,从而达到压缩数据的效果。

  • 性能与效率:K-Means 算法简单易实现,计算复杂度较低,适合处理大规模数据集,是一种常用的聚类算法。

4.应用案例:

K-Means 算法在多个领域中有广泛的应用,以下是一些典型的应用场景:

1. 图像压缩

在图像处理中,K-Means 可以用于图像的颜色量化与压缩。通过将图像中的像素颜色分为若干簇(K个颜色),然后用每个簇的质心颜色来替代该簇内所有的像素颜色,进而实现图像压缩。

  • 具体案例:在 JPEG 图像压缩中,K-Means 可以用于减少图像的颜色空间。例如,如果一个图像有数千种颜色,K-Means 可以将它压缩为 K 种主要颜色,而图像质量的下降非常有限。

2. 客户细分

在市场营销中,K-Means 被广泛用于客户细分。通过将客户按照他们的行为数据(如消费频率、购买金额等)进行聚类,可以识别出不同的客户群体,进而针对不同群体采取定制化的营销策略。

  • 具体案例:电商平台可以利用 K-Means 将客户分为高价值客户、低活跃客户、价格敏感客户等群体,从而制定针对性营销措施,提升客户留存率和转化率。

3. 文本分类

K-Means 也可以用于自然语言处理中的文本聚类,例如对新闻文章、社交媒体帖子、产品评论等进行聚类分析,识别出不同的主题或内容类别。

  • 具体案例:新闻聚类中,可以使用 K-Means 将相似主题的新闻文章自动分类为不同的新闻类别(如体育、政治、科技等),以便用户快速浏览相关内容。

4. 图像分割

在医学影像处理、卫星图像分析等领域,K-Means 可以用于图像分割,将图像划分为不同的区域或对象。例如,在 CT 或 MRI 图像中,可以通过 K-Means 分割不同的组织器官。

  • 具体案例:通过 K-Means 聚类分析不同像素的灰度值,可以将医疗图像中的器官或肿瘤区域分割出来,帮助医生进行病灶分析。

5. 社交网络分析

在社交网络中,K-Means 可以用来分析用户行为和兴趣,将相似的用户聚类成社群。例如,社交媒体平台可以通过分析用户的点赞、评论等行为,找出兴趣相似的用户群体,进而为他们推荐定制化的内容。

  • 具体案例:社交媒体平台使用 K-Means 聚类将用户分为体育爱好者、音乐迷、科技迷等不同兴趣群体,以便优化内容推荐算法。

6. 推荐系统

在推荐系统中,K-Means 聚类可以帮助识别用户群体并推荐相似用户喜欢的商品。例如,在视频网站中,可以通过用户的观看行为,将他们聚类为不同的观众群体,进而推荐他们喜欢的影片。

  • 具体案例:Netflix 等流媒体平台通过 K-Means 聚类用户的观看历史,推荐与其他相似用户喜欢的影片或电视剧,提高用户体验。

5算法优缺点:

优点:

  • 简单易实现,计算复杂度低。
  • 收敛速度快,适合大规模数据集。
  • 结果直观,可解释性强。

缺点:

  • 对初始簇中心的选择较为敏感,不同的初始化方式可能导致不同的聚类结果。
  • 只能发现球形簇,无法处理复杂的簇形状。
  • 需要预先指定 KKK 值,而 KKK 值的选择通常需要根据经验或通过交叉验证等方法确定。

6. 总结

  • 使用 sklearn 可以快速实现 K-Means 算法,适合开发中快速调用。
  • 手动实现可以帮助我们理解 K-Means 算法的内部工作机制,例如如何更新簇中心、如何分配数据点等。
  • 通过手动实现,我们也可以更容易地修改算法,尝试改进或扩展 K-Means。

K-Means 是一种经典的聚类算法,适合处理数据量较大、簇形状为圆形或球形的场景。不过,K-Means 也有一定的局限性,例如它对簇的形状敏感,容易受到初始簇中心选择的影响。尽管它在处理复杂簇形状时存在一定局限性,但通过合理调整参数及结合其他方法,K-Means 依然是数据分析中一个非常重要的工具。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 快充协议工作原理 XSP04快充协议芯片的简绍
  • Vue——day12之组件
  • web项目如何部署到服务器上呢?——麻烦的方法
  • sqlalchemy FastAPI 前端实现数据库增删改查
  • 快速上手指南:在Windows系统中下载Ollama,一键启动大模型体验!
  • P2P应用
  • 自己动手实现mybatis的底层框架(不用动态代理直接用执行器、用动态代理自己实现。图文分析!)
  • 智慧教室无纸化同屏方案是否适用RTMP?
  • virtual cells 相关软件整理
  • 直播相关01-录制麦克风声音,QT上 .pro 将 linux,mac和windows上配置为三种可以共享, 在.pro文件中 message 的作用
  • 【数据库】MySQL-基础篇-函数
  • 批量创建文件夹和文件——excel VBA实现
  • Aigtek功率放大器在超声检测陶瓷复合材料内部缺陷中的应用
  • HTML5 `<button>` 标签深入全面解析
  • 运动耳机精选分享,热门骨传导耳机运动好物推荐!
  • Akka系列(七):Actor持久化之Akka persistence
  • CODING 缺陷管理功能正式开始公测
  • Effective Java 笔记(一)
  • gulp 教程
  • Js基础知识(四) - js运行原理与机制
  • Making An Indicator With Pure CSS
  • underscore源码剖析之整体架构
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 给初学者:JavaScript 中数组操作注意点
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 如何合理的规划jvm性能调优
  • 为什么要用IPython/Jupyter?
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​​​【收录 Hello 算法】9.4 小结
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #mysql 8.0 踩坑日记
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (1)(1.13) SiK无线电高级配置(五)
  • (55)MOS管专题--->(10)MOS管的封装
  • (day6) 319. 灯泡开关
  • (二)丶RabbitMQ的六大核心
  • (算法)前K大的和
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net 流——流的类型体系简单介绍
  • .NET处理HTTP请求
  • .net下简单快捷的数值高低位切换
  • .NET项目中存在多个web.config文件时的加载顺序
  • [ Linux ] Linux信号概述 信号的产生
  • [ Socket学习 ] 第一章:网络基础知识
  • [20160807][系统设计的三次迭代]
  • [AI 大模型] Meta LLaMA-2
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [BetterExplained]书写是为了更好的思考(转载)
  • [C++] 统计程序耗时