【聚类】K-Means 聚类(无监督)及K-Means ++

1. 原理

在这里插入图片描述

2. 算法步骤

在这里插入图片描述

3. 目标函数

在这里插入图片描述

4. 优缺点

在这里插入图片描述在这里插入图片描述

import torch
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
import torch.nn as nn# ====== 数据准备 ======
# 生成数据:100 个张量,每个张量是 5 维向量
torch.manual_seed(42)data1 = torch.randn(50, 5) + 2  # 第一类# 其中包含标准正态分布的随机数(均值为 0,标准差为 1)
# + 2 将张量中的每个值加上 2,使数据的中心(均值)移动到 2,相当于对整个分布进行平移。data2 = torch.randn(30, 5) - 2  # 第二类
data3 = torch.randn(20, 5)      # 第三类
data = torch.cat([data1, data2, data3], dim=0)# 转为 NumPy 数组
data_np = data.numpy()# ====== 方法 1: K-Means 聚类 ======
# 聚类为 3 类
kmeans = KMeans(n_clusters=3, random_state=42)# 创建一个 K-Means 聚类模型实例, random_state=42 固定随机数种子,保证聚类结果的可复现性。labels_kmeans = kmeans.fit_predict(data_np)# 将数据 data_np 输入到 K-Means 模型中,完成聚类并返回每个数据点的类别标签。
# labels_kmeans 是一个长度为 100 的数组,其中每个元素是对应数据点的聚类标签(0、1 或 2)。# 使用 PCA 将数据降维到 2D 用于可视化
pca = PCA(n_components=2)# 创建一个主成分分析(PCA)模型实例。
# n_components=2:将高维数据降维到 2 维。data_pca = pca.fit_transform(data_np)# 对数据 data_np 进行 PCA 降维,并返回降维后的数据。
# data_pca 是一个形状为 (100, 2) 的二维数组,每行是原始数据在降维后空间中的坐标。# 可视化 K-Means 聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(data_pca[:, 0], data_pca[:, 1], c=labels_kmeans, cmap='viridis', s=50)
plt.title("K-Means Clustering Results (PCA 2D)")
plt.xlabel("PCA Dimension 1")
plt.ylabel("PCA Dimension 2")
plt.colorbar(label='Cluster')
plt.show()

在这里插入图片描述

PS:聚类数据生成方法

data, true_labels = make_blobs(n_samples=n_samples, centers=n_clusters, cluster_std=[1.0, 2.5, 0.5], random_state=42)
  1. n_samples 指定要生成的数据点总数。
    如果是一个整数(如 n_samples=300),表示生成 300 个数据点。
    如果是一个列表或数组(如 [100, 150, 50]),则指定每个簇分别生成的数据点数量。
  2. centers 指定簇的数量或簇中心的具体坐标。
    如果是一个整数(如 n_clusters=3),表示生成 3 个簇,簇中心的坐标会自动随机生成。
    如果是一个数组(如 [[0, 0], [3, 3], [1, -2]]),则指定每个簇的中心坐标。
  3. cluster_std 指定每个簇的标准差(数据点的离散程度)。
    如果是一个单一值(如 cluster_std=1.0),表示所有簇的标准差相同。
    如果是一个列表(如 [1.0, 2.5, 0.5]),表示每个簇有不同的标准差,分别为 1.0、2.5 和 0.5。
  4. random_state 控制随机数生成器,用于保证数据可复现。
    如果设置为固定的整数值(如 random_state=42),每次生成的数据点相同。
    如果不指定或设置为 None,每次生成的数据点可能不同。

返回值:

  1. data: 生成的样本数据。ndarray,形状为 (n_samples, n_features)。
  2. true_labels: 每个样本对应的真实类别标签。ndarray,形状为 (n_samples,)。
    每个元素是一个整数,表示该样本所属簇的索引(如 0 表示第一个簇,1 表示第二个簇,以此类推)。

实例:

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs# 参数设置
n_samples = 300
n_clusters = 3
cluster_std = [1.0, 2.5, 0.5]# 生成数据
data, true_labels = make_blobs(n_samples=n_samples,centers=n_clusters,cluster_std=cluster_std,random_state=42
)# 可视化数据
plt.figure(figsize=(8, 6))
plt.scatter(data[:, 0], data[:, 1], c=true_labels, cmap='viridis', s=50)
plt.title("Generated Data with make_blobs")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.colorbar(label='Cluster Index')
plt.show()

这里只是生成了三个簇的数据,并没有进行k-means聚类,只是用不同颜色对应true_labels。

在这里插入图片描述

其中0/1/2对应三种不同的簇

5. 优化策略

在这里插入图片描述

5.1 数据生成与可视化

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.datasets import make_blobs# 生成模拟数据
np.random.seed(42)
X, _ = make_blobs(n_samples=500, centers=4, cluster_std=1.0, random_state=42)# 数据分布可视化
plt.scatter(X[:, 0], X[:, 1], s=30, c='gray', alpha=0.5)
plt.title("Generated Data")
plt.show()

在这里插入图片描述

# 使用 KMeans++ 初始化
kmeans = KMeans(n_clusters=4, init='k-means++', random_state=42)
labels = kmeans.fit_predict(X)# 聚类结果可视化
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=30, alpha=0.5)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='X', label='center node')
plt.title("K-Means ++")
plt.legend()
plt.show()

在这里插入图片描述

# 肘部法则确定簇数
wcss = []
for k in range(1, 10):kmeans = KMeans(n_clusters=k, init='k-means++', random_state=42)kmeans.fit(X) # 对数据集 X 进行 k-means 聚类。wcss.append(kmeans.inertia_) # 将当前 k 值下的 WCSS 添加到列表中。# 绘制肘部法则图
plt.plot(range(1, 10), wcss, marker='o')
plt.title("Elbow Method")
plt.xlabel("Cluster")
plt.ylabel("WCSS")
plt.show()# 计算轮廓系数
for k in range(2, 7):kmeans = KMeans(n_clusters=k, random_state=42)labels = kmeans.fit_predict(X) # 聚类并获取每个样本的标签(簇分配)。score = silhouette_score(X, labels) # 计算轮廓系数。print(f"Cluster {k}: Silhouette Coefficient = {score:.2f}")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这两种方法最终获得的簇标签 labels 是相同的,选择哪个取决于具体需求:

  1. 如果还需要访问其他模型属性,fit 是更灵活的选择。
  2. 如果只关心簇标签,fit_predict 更便捷。

6. K-means++

6.1 原理

在这里插入图片描述
在这里插入图片描述

6.2 优势

在这里插入图片描述

6.3 劣势

在这里插入图片描述

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

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

相关文章

C++学习日记---第14天(蓝桥杯备赛)

笔记复习 1.对象的初始化和清理 对象的初始化和清理是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或者变量,没有及时清理,也会造成一定的安全问题 构造函数&…

网络安全防护指南:筑牢网络安全防线(5/10)

一、网络安全的基本概念 (一)网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…

【最新鸿蒙开发——应用导航设计】

大家好,我是小z,不知道大家在开发过程中有没有遇到模块间跳转的问题,今天给大家分享关于模块间跳转的三种方法 文章目录 1. 命名路由(ohos.router)使用步骤 2. 使用navigation组件跳转。步骤缺点 3. 路由管理模块1. 路由管理模块…

Wireshark常用功能使用说明

此处用于记录下本人所使用 wireshark 所可能用到的小技巧。Wireshark是一款强大的数据包分析工具,此处仅介绍常用功能。 Wireshark常用功能使用说明 1.相关介绍1.1.工具栏功能介绍1.1.1.时间戳/分组列表概况等设置 1.2.Windows抓包 2.wireshark过滤器规则2.1.wiresh…

【进阶篇-Day15:JAVA线程-Thread的介绍】

目录 1、进程和线程1.1 进程的介绍1.2 并行和并发1.3 线程的介绍 2、JAVA开启线程的三种方法2.1 继承Thread类:2.2 实现Runnable接口2.3 实现Callable接口2.4 总结: 3、线程相关方法3.1 获取和设置线程名字的方法3.2 线程休眠方法:3.3 线程优…

组播基础实验

当需要同时发给多个接受者或者接收者ip未知时使用组播 一、组播IP地址 1、组播IP地址范围 组播地址属于D类地址:224.0.0.0/4(224.0.0.0-239.255.255.255) 2、分类 (1)链路本地地址(link-local&#xf…

EasyDarwin搭建直播推流服务

学习链接 easydarwin官网 - 这里看介绍 easydarwin软件下载地址 - 百度网盘 easydarwin视频 B站 文章目录 学习链接使用下载EasyDarwin压缩包,并解压到目录启动EasyDarwin点播直播easyplayer.jsapidocffmpeg推流rtsp & ffplay拉流 使用 下载EasyDarwin压缩包…

Java有关数组的相关问题

Java中的栈和堆的含义 栈 存储局部变量:栈主要用于存储方法中的局部变量,包括基本数据类型(int、double、boolean等)和对象的引用(不包含对象本身)。 遵循后进先出原则:当一个方法被调用时&…

眼部按摩仪WT2605音频蓝牙语音芯片方案 单芯片实现语音提示及控制/手机无线音频传输功能

随着科技的快速发展,人们的生活方式也在不断改变,智能化、便捷化的产品逐渐成为市场的主流。眼部按摩仪作为一种结合了现代科技与健康生活理念的产品,受到了广大消费者的青睐。而在众多眼部按摩仪中,采用WT2605音频蓝牙芯片的方案…

ESP32-S3模组上跑通ES8388(12)

接前一篇文章:ESP32-S3模组上跑通ES8388(11) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第5段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在…

C#VB.NET开发整体一键国际化显示

第一章链接 第二章 窗口多国语言显示 在第一章时我们已经了解如何对内容进行多语言化下面讲解如何对窗口多语言显示 在实际开发中单个窗体内可能有很多控件,如果我们对每个控件使用Mu方法进行赋值是异常繁琐的如下 Button1.Text"显示".Mu(); 在对窗口进行多语言化SG…

Linux---对时/定时服务

文章目录 目录 文章目录 前言 一.对时服务 服务端配置 客户端配置 二.定时服务 单次定时任务 循环定时任务 前言 在当今信息化高速发展的时代,时间的准确性和任务的定时执行对于各种系统和服务来说至关重要。Linux操作系统,凭借其强大的功能和灵活的…

centos更换源文件,换源,替换源

期初怎么折腾就是不行,换了源也是不能使用的,最后发现不是换的源不行,而是之前的源文件不行,然后给所有的源文件在yum源统一放在了bak目录下,随后我们再去下载安装源文件。 您将yum源下载之后,先将您的其他…

分布式系统中的Dapper与Twitter Zipkin:链路追踪技术的实现与应用

目录 一、什么是链路追踪? 二、核心思想Dapper (一)Dapper链路追踪基本概念概要 (二)Trace、Span、Annotations Trace Span Annotation 案例说明 (三)带内数据与带外数据 带外数据 带…

【深度学习基础】一篇入门模型评估指标(分类篇)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 模…

零拷贝相关知识点(一)

前言 大家好,我是程序员田螺。 零拷贝是老生常谈的问题啦,大厂非常喜欢问。比如Kafka为什么快,RocketMQ为什么快等,都涉及到零拷贝知识点。最近技术讨论群几个伙伴分享了阿里、虾皮的面试真题,也都涉及到零拷贝。因此…

React+TS+css in js 练习

今天分享的内容是动态规划的经典问题--0-1 背包问题 0-1背包问题的描述如下:给定一组物品,每种物品都有自己的重量和价值,背包的总容量是固定的。我们需要从这些物品中挑选一部分,使得背包内物品的总价值最大,同时不超过背包的总容量。 举个例子:假设这组物品的质量…

【人工智能基础03】机器学习(练习题)

文章目录 课本习题监督学习的例子过拟合和欠拟合常见损失函数,判断一个损失函数的好坏无监督分类:kmeans无监督分类,Kmeans 三分类问题变换距离函数选择不同的起始点 重点回顾1. 监督学习、半监督学习和无监督学习的定义2. 判断学习场景3. 监…

【数据结构计数排序】计数排序

非比较排序概念 非比较排序是一种排序算法,它不是通过比较元素大小进行排序的,而是基于元素的特征和属性排序。这种排序方法在特定情况下,可以做到比元素比较排序(快排,归并)更有效率。尤其是在处理大量数…

JavaEE-经典多线程样例

文章目录 单例模式设计模式初步引入为何存在单例模式饿汉式单例模式饿汉式缺陷以及是否线程安全懒汉式单例模式基础懒汉式缺陷以及是否线程安全懒汉式单例模式的改进完整代码(变量volatile) 阻塞队列生产者消费者模型生产者消费者模型的案例以及优点请求与响应案例解耦合 单例模…