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 依然是数据分析中一个非常重要的工具。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RocketMQ异步报错:No route info of this topic

在SpringBoot中发送RocketMQ异步消息的时候报错了,提示org.apache.rocketmq.client.exception.MQClientException: No route info of this topic, testTopic1 这里给出具体的解决方案 一、Broker模块不支持自动创建topic,并且topic没有被手动创建过 R…

OpenCV 与 YoloV3的结合使用:目标实时跟踪

目录 代码分析 1. YOLO 模型加载 2. 视频加载与初始化 3. 视频帧处理 4. 物体检测 5. 处理检测结果 6. 边界框和类别显示 7. 帧率(FPS)计算 8. 结果显示与退出 9. 资源释放 整体代码 效果展示 总结 代码分析 这段代码使用 YOLO&#xff08…

Linxu系统:kill命令

1、命令详解: kill命令是用于向进程发送信号,通常用来终止某个指定PID服务进程,kill命令可以发送不同的信号给目标进程,来实现不同的操作,如果不指定信号,默认会发送 TERM 信号(15)&…

ubuntu 和windows用samba服务器实现数据传输

1,linux安装samba服务器 sudo apt-get install samba samba-common 2,linux 配置权限,修改目录权限,linux下共享的文件权限设置。 sudo chmod 777 /home/lark -R 3. 添加samba用户 sudo smbpasswd -a lark 4,配置共享…

小程序页面整体执行顺序

首先执行 App.onLaunch -> App.onShow其次执行 Component.created -> Component.attached再执行 Page.onLoad -> Page.onShow最后 执行 Component.ready -> Page.onReady 你不知道的小程序系列之生命周期执行顺序

828华为云征文 | Flexus X实例与Harbor私有镜像仓库的完美结合

需要了解 本文章主要讲述在 华为云Flexus X 实例上搭建自己的企业级私有镜像仓库 Harbor,一键部署、搭建高可用安全可靠的容器镜像仓库选择合适的云服务器: 本文采用的是 华为云服务器 Flexus X 实例(推荐使用)连接方式&#xff1…

ctfshow-PHP特性

web89 <?php include("flag.php"); highlight_file(_FILE_);if(isset($_GET[num])){$num$_GET[num];if(preg_match("/[0-9]/",$num)){die("no no no"); #结束脚本呢执行输出指定信息}if(intval($num)){#把参数转换整数类型echo $flag;} } pr…

用面向对象的方法进行数据分析

项目从两个不同类型的文件&#xff08;文本文件和 JSON 文件&#xff09;读取销售数据&#xff0c;将其封装为 Record 对象&#xff0c;合并数据后&#xff0c;统计每天的销售总额&#xff0c;并通过 pyecharts 库生成一个包含每日销售额的柱状图&#xff08;Bar chart&#xf…

无线感知会议系列【1】【增强无线感知应用的鲁棒性】

前言&#xff1a; 这个是2021年 泛在可信智能感知论坛&#xff0c;汤战勇 &#xff08;西北大学物联网研究院 )教授的 一个讲座《wireless signals like WiFi, RFID and (ultra) sound as a powerful modality for ubiquitous sensing》 参考连接&#xff1a; 4.见微知萌—…

ollama 本地部署

ollama 本地模型部署 下载安装: [link](https://ollama.com/download)下载说明 部署使用在终端查看ollama是否安装完成终端查看ollama 命令说明查看当前支持下载的模型启动对话模式默认情况下&#xff0c;ollama启动了server 的api访问功能 外部 api访问使用postman网页版本for…

什么是Aware注入?

Spring容器可以在Bean初始化的时候&#xff0c;自动注入一些特定信息&#xff08;如beanfactory&#xff09;,使得bean可以轻松的访问其他Bean的实例&#xff0c;简化代码&#xff0c;避免了显式的注入。 Spring提供了很多Aware的接口,如下&#xff1a; 拿其中的BeanFactoryAwa…

全频段覆盖的卫星通信模块-灵活应对多应用场景

LoRa1121是采用SEMTECH的LR1121芯片&#xff0c;这是一款超低功耗、远程LoRa收发器&#xff0c;支持Sub-GHz和全球2.4GHz频谱中的地面ISM频段通信&#xff0c;且支持用于卫星连接的S频段。LoRa1121支持LoRa&#xff0c;(G)FSK调制&#xff0c;Sigfox协议&#xff0c;以及&#…

SRS流媒体服务器从入门到精通(其一,环境搭建)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力! 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 一、SRS简介二、SRS的应用场景三、环境搭建…

Leetcode - 周赛414

目录 一&#xff0c;3280. 将日期转换为二进制表示 二&#xff0c;3281. 范围内整数的最大得分 三&#xff0c;3282. 到达数组末尾的最大得分 四&#xff0c;3283. 吃掉所有兵需要的最多移动次数 一&#xff0c;3280. 将日期转换为二进制表示 本题就是简单的字符串和整数之…

爆改YOLOv8|利用yolov9的ADown改进卷积Conv-轻量化

1&#xff0c;本文介绍 本文将利用YOLOv9的ADown模块改进卷积。 关于ADown的详细介绍可以看论文&#xff1a;https://arxiv.org/abs/2402.13616 本文将讲解如何将ADown融合进yolov8 话不多说&#xff0c;上代码&#xff01; 2&#xff0c; 将ADown融合进yolov8 2.1 步骤一…

【高中物理】用代码缩写胡克定律公式原理图

用代码缩写胡克定律公式原理图 代码实现了以下功能&#xff1a; 交互式滑块&#xff1a;用户可以通过滑块调整弹簧的弹性系数&#xff08;k&#xff09;、拉力大小&#xff08;F&#xff09;和弹簧的原长&#xff08;l0&#xff09;&#xff0c;实时观察弹簧的伸长和受力变化。…

在VB.net中,TimeSpan有什么属性与方法

标题 在VB.net中&#xff0c;TimeSpan有什么属性与方法 正文 在 VB.NET 中&#xff0c;TimeSpan 结构表示时间间隔&#xff0c;即一段时间&#xff0c;而不表示特定的时间点。TimeSpan 提供了多种属性来获取时间间隔的各个组成部分&#xff0c;以及一些方法来操作这些时间间隔。…

【观察者】设计模式:构建灵活且响应式的软件系统

引言 在软件开发中&#xff0c;我们经常面临需要在多个对象之间进行通信的挑战。特别是当一个对象的状态发生变化时&#xff0c;我们希望所有依赖于这个状态的对象都能自动更新。这就是观察者设计模式大显身手的地方。 简介 观察者模式是一种行为设计模式&#xff0c;它定义…

基于vue框架的城市交通管理系统的设计与实现9fcck(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,区域,车站信息,公交线路 开题报告内容 基于Vue框架的城市交通管理系统的设计与实现开题报告 一、研究背景与意义 1.1 研究背景 随着城市化进程的加速&#xff0c;城市交通问题日益严峻&#xff0c;包括交通拥堵、交通事故频发、…

“CSDN独家揭秘:AIGC技术在AI绘画领域的应用与学习攻略”

导语&#xff1a;人工智能的发展正推动着内容创作的革新&#xff0c;AIGC&#xff08;AI Generated Content&#xff09;技术便是其中的佼佼者。本文将带您领略AIGC在AI绘画领域的魅力&#xff0c;并分享一些学习资源和路径&#xff0c;助您在艺术与技术交汇的旅途中更进一步。…