k均值聚类将数据分成多个簇

 人工智能例子汇总:AI常见的算法和例子-CSDN博客 

K-Means 聚类并将数据分成多个簇,可以使用以下方法:

实现思路

  1. 随机初始化 K 个聚类中心
  2. 计算每个点到聚类中心的距离
  3. 将点分配到最近的簇
  4. 更新聚类中心
  5. 重复上述过程直到收敛

完整代码:

import torch
import matplotlib.pyplot as plt

def kmeans(X, k, max_iters=100, tol=1e-4):
    """
    使用 PyTorch 实现 K-Means 聚类,并返回聚类结果
    :param X: (n, d) 输入数据
    :param k: 簇的个数
    :param max_iters: 最大迭代次数
    :param tol: 收敛阈值
    :return: (最终聚类中心, 每个样本的簇索引)
    """
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    X = X.to(device)

    n, d = X.shape
    indices = torch.randperm(n)[:k]  # 随机选择 k 个数据点作为初始聚类中心
    centroids = X[indices].clone()

    for i in range(max_iters):
        distances = torch.cdist(X, centroids)  # 计算所有点到聚类中心的欧式距离
        cluster_assignments = torch.argmin(distances, dim=1)  # 分配每个点到最近的簇

        new_centroids = torch.stack([
            X[cluster_assignments == j].mean(dim=0) if (cluster_assignments == j).sum() > 0
            else centroids[j]  # 避免空簇
            for j in range(k)
        ])

        shift = torch.norm(new_centroids - centroids, p=2)  # 计算变化量
        if shift < tol:
            print(f'K-Means 提前收敛于第 {i+1} 轮')
            break

        centroids = new_centroids

    return centroids.cpu(), cluster_assignments.cpu()

# 生成数据
torch.manual_seed(42)
X = torch.randn(200, 2)  # 200 个 2D 点
k = 3

# 运行 K-Means
centroids, labels = kmeans(X, k)

# 输出最终结果
print("最终聚类中心:")
print(centroids)

# 统计每个簇的样本数量
for i in range(k):
    count = (labels == i).sum().item()
    print(f"簇 {i} 的数据点数量: {count}")

# 可视化聚类结果
def plot_kmeans(X, labels, centroids, k):
    """
    可视化 K-Means 聚类结果
    :param X: 数据点
    :param labels: 聚类标签
    :param centroids: 聚类中心
    :param k: 簇的个数
    """
    X = X.numpy()
    labels = labels.numpy()
    centroids = centroids.numpy()

    plt.figure(figsize=(8, 6))

    # 画出每个簇的点
    colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']
    for i in range(k):
        plt.scatter(X[labels == i, 0], X[labels == i, 1],
                    c=colors[i % len(colors)], label=f'Cluster {i}', alpha=0.6)

    # 画出聚类中心
    plt.scatter(centroids[:, 0], centroids[:, 1],
                c='black', marker='X', s=200, label='Centroids')

    plt.legend()
    plt.title("K-Means Clustering using PyTorch")
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")
    plt.grid()
    plt.show()

# 绘制聚类结果
plot_kmeans(X, labels, centroids, k)

备注:

  • 初始化
    • 采用 torch.randperm(n)[:k] 选择 k 个数据点作为初始聚类中心。
  • 计算距离
    • torch.cdist(X, centroids) 计算所有点到各个聚类中心的欧式距离。
  • 分配簇
    • torch.argmin(distances, dim=1) 选择最近的聚类中心。
  • 更新中心
    • X[cluster_assignments == j].mean(dim=0) 计算每个簇的新中心。
    • 如果某个簇为空,保持原来的中心不变,避免空簇问题。
  • 判断收敛
    • torch.norm(new_centroids - centroids, p=2) 计算中心点的移动量,若小于阈值 tol,则提前终止。
  • 按簇分类数据
    • clusters = [X[labels == i] for i in range(k)] 将数据划分到不同簇。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python之Excel操作 - 写入数据

我们将使用 openpyxl 库&#xff0c;它是一个功能强大且易于使用的库&#xff0c;专门用于处理 Excel 文件。 1. 安装 openpyxl 首先&#xff0c;你需要安装 openpyxl 库。你可以使用 pip 命令进行安装&#xff1a; pip install openpyxl创建一个文件 example.xlsx&#xff…

【后端开发】字节跳动青训营之性能分析工具pprof

性能分析工具pprof 一、测试程序介绍二、pprof工具安装与使用2.1 pprof工具安装2.2 pprof工具使用 资料链接&#xff1a; 项目代码链接实验指南pprof使用指南 一、测试程序介绍 package mainimport ("log""net/http"_ "net/http/pprof" // 自…

2025开源DouyinLiveRecorder全平台直播间录制工具整合包,多直播同时录制、教学直播录制、教学视频推送、简单易用不占内存

一、DouyinLiveRecorder软件介绍&#xff08;文末提供下载&#xff09; 官方地址&#xff1a;GitHub - ihmily/DouyinLiveRecorder 本文信息来源于作者GitHub地址 一款简易的可循环值守的直播录制工具&#xff0c;基于FFmpeg实现多平台直播源录制&#xff0c;支持自定义配置录制…

大数据学习之SCALA分布式语言三

7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…

RAG是否被取代(缓存增强生成-CAG)吗?

引言&#xff1a; 本文深入研究一种名为缓存增强生成&#xff08;CAG&#xff09;的新技术如何工作并减少/消除检索增强生成&#xff08;RAG&#xff09;弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出&#xff0c;但是这样的工作方式很快就不能满足应用的需要: 因…

使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI&#xff0c;是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手&#xff0c;感觉收获还蛮多的&#xff0c;今天来分享下开发过程中的一些经验~ 为啥要做这个…

三甲医院大型生信服务器多配置方案剖析与应用(2024版)

一、引言 1.1 研究背景与意义 在当今数智化时代&#xff0c;生物信息学作为一门融合生物学、计算机科学和信息技术的交叉学科&#xff0c;在三甲医院的科研和临床应用中占据着举足轻重的地位。随着高通量测序技术、医学影像技术等的飞速发展&#xff0c;生物医学数据呈爆发式…

2025_2_1 C语言中关于字符串

1.字符串 C语言中的字符串都是字符数组&#xff0c;以空字符 ‘\0’结尾。 创建一个字符数组必须以空字符结尾&#xff0c;不然会访问非法区域&#xff0c;直到找到\0为止 char c[] {a, b, c, \0};长度为n的字符串字面值&#xff0c;会存储在虚拟内存中的只读数据段中&#…

Redis篇 Redis如何清理过期的key以及对应的解决方法

Redis设置Key过期时间 在 Redis 中&#xff0c;可以通过特定的命令为 Key 设置过期时间&#xff0c;使得 Key 在一定时间后自动删除&#xff0c;这对于管理缓存、验证码等临时数据非常有用。 解决方法 1. Redis过期删除策略 1.1 如何实现过期策略 对一个 key 设置了过期时间…

java练习(1)

两数之和&#xff08;题目来自力扣&#xff09; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相…

Python3 OS模块中的文件/目录方法说明十四

一. 简介 前面文章简单学习了 Python3 中 OS模块中的文件/目录的部分函数。 本文继续来学习 OS 模块中文件、目录的操作方法&#xff1a;os.statvfs() 方法&#xff0c;os.symlink() 方法。 二. Python3 OS模块中的文件/目录方法 1. os.statvfs() 方法 os.statvfs() 方法用…

从理论到实践:Linux 进程替换与 exec 系列函数

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在Linux中&#xff0c;进程替换&#xff08;Process Substitution&#xff09;是一个非常强大的特性&#xff0c;它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…

ZZNUOJ(C/C++)基础练习1041——1050(详解版)

1041 : 数列求和2 题目描述 输入一个整数n&#xff0c;输出数列1-1/31/5-……前n项的和。 输入 输入只有一个整数n。 输出 结果保留2为小数,单独占一行。 样例输入 3 样例输出 0.87注意sum 1相当于sumsum1 注意sum * 1相当于sumsum*1 C语言版 #include<stdio.h> // 包含…

2021 年 6 月大学英语四级考试真题(第 2 套)——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;目前中南大学MBA在读&#xff0c;也考取过HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &…

【Block总结】CPCA,通道优先卷积注意力|即插即用

论文信息 标题: Channel Prior Convolutional Attention for Medical Image Segmentation 论文链接: arxiv.org 代码链接: GitHub 创新点 本文提出了一种新的通道优先卷积注意力&#xff08;CPCA&#xff09;机制&#xff0c;旨在解决医学图像分割中存在的低对比度和显著…

grpc 和 http 的区别---二进制vsJSON编码

gRPC 和 HTTP 是两种广泛使用的通信协议&#xff0c;各自适用于不同的场景。以下是它们的详细对比与优势分析&#xff1a; 一、核心特性对比 特性gRPCHTTP协议基础基于 HTTP/2基于 HTTP/1.1 或 HTTP/2数据格式默认使用 Protobuf&#xff08;二进制&#xff09;通常使用 JSON/…

Qt常用控件 输入类控件

文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1&#xff0c;录入用户信息1.4 例子2&#xff0c;正则验证手机号1.5 例子3&#xff0c;验证输入的密码1.6 例子4&#xff0c;显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1&#xff0c;获取输入框的内容2.4 例…

[b01lers2020]Life on Mars1

打开题目页面如下 看了旁边的链接&#xff0c;也没有什么注入点&#xff0c;是正常的科普 利用burp suite抓包&#xff0c;发现传参 访问一下 http://5edaec92-dd87-4fec-b0e3-501ff24d3650.node5.buuoj.cn:81/query?searchtharsis_rise 接下来进行sql注入 方法一&#xf…

前端自动化测试(一):揭秘自动化测试秘诀

目录 [TOC](目录)前言自动化测试 VS 手动测试测试分类何为单元测试单元测试的优缺点优点缺点 测试案例测试代码 测试函数的封装实现 expect 方法实现 test 函数结语 正文开始 &#xff0c; 如果觉得文章对您有帮助&#xff0c;请帮我三连订阅&#xff0c;谢谢&#x1f496;&…

FFmpeg工具使用基础

一、FFmpeg工具介绍 FFmpeg命令行工具主要包括以下几个部分: ‌ffmpeg‌:编解码工具‌ffprobe‌:多媒体分析器‌ffplay‌:简单的音视频播放器这些工具共同构成了FFmpeg的核心功能,支持各种音视频格式的处理和转换‌ 二、在Ubuntu18.04上安装FFmpeg工具 1、sudo apt-upda…