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

news2024/12/27 7:22:28

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.coloradmin.cn/o/2252079.html

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

相关文章

智慧银行反欺诈大数据管控平台方案(一)

智慧银行反欺诈大数据管控平台建设方案的核心在于通过整合先进的大数据技术和深度学习算法,打造一个全面、智能且实时的反欺诈系统,以有效识别、预防和应对各类金融欺诈行为。该方案涵盖数据采集、存储、处理和分析的全流程,利用多元化的数据…

搭建业务的性能优化指南

这是一篇搭建业务优化的心路历程,也是写给搭建业务的性能优化指南。 前言 直到今天,淘内的页面大多都迁移到了 SSR,从我们终端平台 - 搭建研发团队的视角看,业务大致可以分为两类 —— 搭建派 和 源码派。 这两者互不冲突&#xf…

【Db First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

搭建私有云存储

1、安装LNMP环境 yum install nginx -y yum install -y nginx mariadb-server php php-fpm php-mysqlnd systemctl restart nginx.service --- 启动Nginx systemctl start mariadb.service ---启动数据库 mysql -e create database lxdb character set utf8 ---创建数据库 my…

YOLO 标注工具 AutoLabel 支持 win mac linux

常见的标注工具,功能基础操作繁琐,无复制粘贴,标签无法排序修改,UI不美观,bug修正不及时,没有集成识别、训练、模型导出… 怎么办呢?AutoLabel它来了 Quick Start 一图胜千言 图像标注 支持YOL…

qt QGraphicsPolygonItem详解

1、概述 QGraphicsPolygonItem是Qt框架中QGraphicsItem的一个子类,它提供了一个可以添加到QGraphicsScene中的多边形项。通过QGraphicsPolygonItem,你可以定义和显示一个多边形,包括其填充颜色、边框样式等属性。QGraphicsPolygonItem支持各…

Linux网络_网络协议_网络传输_网络字节序

一.协议 1.概念 协议(Protocol) 是一组规则和约定,用于定义计算机网络中不同设备之间如何进行通信和数据交换。协议规定了数据的格式、传输方式、传输顺序等详细规则,确保不同设备和系统能够有效地互联互通。 在网络通信中&#…

MySQL查看日志

目录 1. 日志 1.1 错误日志 1.2 二进制日志 1.2.1 介绍 1.2.2 格式 1.2.3 查看 1.2.4 删除 1.3 查询日志 1.4 慢查询日志 1. 日志 1.1 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过…

【深度学习】四大图像分类网络之AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever(均为Hinton的学生)和Geoffrey Hinton(被誉为”人工智能教父“,首先将反向传播用于多层神经网络)在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。AlexNet在…

MySQL数据库做题笔记

题目链接https://leetcode.cn/problems/invalid-tweets-ii/description/https://leetcode.cn/problems/invalid-tweets-ii/description/ # Write your MySQL query statement below SELECT tweet_id FROM Tweets where LENGTH(content)>140 OR (length(content)-length(rep…

ansible使用说明

将安装包拷贝到主控端主机 在主控端主机安装ansible,sh setup.sh 确认安装成功后,编辑hosts文件(按步骤逐个添加主机组,不要一开始全部配置好) [site-init]下的主机列表为被控制的主机(按照当前ai建模方案…

EDA软件研发的DevOps平台

1:什么是DevOps DevOps是十几年前,在互联网比较火的词,实际上就是ci/cd平台的另外一种说法,核心是说打破研发,测试,运维的边界,能够将整个产品开发的流程快速循环起来,随时可发版&a…

Linux命令进阶·如何切换root以及回退、sudo命令、用户/用户组管理,以及解决创建用户不显示问题和Ubuntu不显示用户名只显示“$“符号问题

目录 1. root用户(超级管理员) 1.1 用于账户切换的系统命令——su 1.2 退回上一个用户命令——exit 1.3 普通命令临时授权root身份执行——sudo 1.3.1 为普通用户配置sudo认证 2. 用户/用户组管理 2.1 用户组管理 2.2 用户管理 2.2.1 …

网络安全-AAA介绍与配置

前言 AAA是Authentication(认证)、Authorization(授权)和Accounting(计费)的简称,它提供了认证、授权、计费三种安全功能。AAA可以通过多种协议来实现,目前华为设备支持基于RADIUS&a…

[ACTF2020 新生赛]BackupFile--详细解析

信息搜集 让我们寻找源文件,目录扫描: 找到了/index.php.bak文件,也就是index.php的备份文件。 后缀名是.bak的文件是备份文件,是文件格式的扩展名。 我们访问这个路径,就会直接下载该备份文件。 我们把.bak后缀删掉…

软考高项经验分享:我的备考之路与实战心得

软考,尤其是信息系统项目管理师(高项)考试,对于众多追求职业提升与专业认可的人士来说,是一场充满挑战与机遇的征程。我在当年参加软考高项的经历,可谓是一波三折,其中既有成功的喜悦&#xff0…

Kubernetes常见问题解答

云原生学习路线导航页(持续更新中) 快捷链接 Kubernetes架构原则和对象设计 本文对Kubernetes学习中常见的一些问题,进行解答 1.什么时候使用公有云,什么时候使用自建k8s 看公司规模,规模小使用公有云,规…

基于C#+SQLite开发数据库应用的示例

SQLite数据库,小巧但功能强大;并且是基于文件型的数据库,驱动库就是一个dll文件,有些开发工具 甚至不需要带这个dll,比如用Delphi开发,用一些三方组件;数据库也是一个文件,虽然是个文…

C++高阶算法[汇总]

(一)高精度算法概述 高精度算法是指能够处理超出常规数据类型表示范围的数值的算法。在 C 中,标准数据类型通常有固定的位数和精度限制,而高精度算法可以解决大数运算、金融计算和科学计算等领域的问题。 (二&#x…

JS API事件监听(绑定)

事件监听 语法 元素对象.addEventListener(事件监听,要执行的函数) 事件监听三要素 事件源:那个dom元素被事件触发了,要获取dom元素 事件类型:用说明方式触发,比如鼠标单击click、鼠标经过mouseover等 事件调用的函数&#x…