【机器学习】自定义数据集,使用scikit-learn 中K均值包 进行聚类

news2025/3/7 2:10:41

一、K 均值算法简介

K 均值算法的目标是将数据集划分为 K 个簇,使得每个数据点属于离它最近的簇中心(centroid)所代表的簇。

K均值聚类算法步骤

① 初始化

        随机选择原始数据的K个数据点作为初始质心(聚类中心)。

② 分配

        将每个数据点划分到距离最近的质心所对应的簇中,即计算每个数据点到每个质心的距离,选择距离最近的质心作为该数据点所属的

③ 更新

        重新计算每个簇的质心,即将该簇中所有数据点的坐标取平均值,得到新的质心

④ 迭代

        重复第②步和第③步,直到簇内的数据点相似度达到一定程度,或者达到预设的最大迭代次数

二、scikit-learn 中的 KMeans 类

sklearn.cluster.KMeans 是 scikit-learn 中实现 K 均值算法的类。以下是它的主要参数和方法:

1. 主要参数

n_clusters

        聚类的数量(K 值)。

        默认值为 8。

② init

        初始化簇中心的方法。

        可选值:'k-means++'(默认,一种智能初始化方法)或 'random'(随机初始化)。

③ n_init

        使用不同的初始簇中心运行算法的次数。

        最终选择最优的结果(即簇内误差平方和最小的结果)。

        默认值为 10。

④ max_iter

        单次运行算法的最大迭代次数。

        默认值为 300。

⑤ random_state

        随机种子,用于确保结果可重复。

        默认值为 None

2. 主要属性

cluster_centers_

        每个簇的中心坐标。

        形状为 (n_clusters, n_features)

② labels_

        每个样本的聚类标签。

        形状为 (n_samples,)

③ inertia_

        簇内误差平方和(SSE,Sum of Squared Errors),表示簇内数据点到簇中心的距离平方和。

        越小表示聚类效果越好。

④ n_iter_

        实际运行的迭代次数。

3. 主要方法

fit(X)

         训练模型,对输入数据 X 进行聚类。

   X 是形状为 (n_samples, n_features) 的数组。

② predict(X)

        预测输入数据 X 的聚类标签。

        返回形状为 (n_samples,) 的数组。

③ fit_predict(X)

        先调用 fit 训练模型,然后调用 predict 返回聚类标签。

④ transform(X)

        将输入数据 X 转换到簇中心距离空间。

        返回形状为 (n_samples, n_clusters) 的数组,表示每个样本到每个簇中心的距离。

⑤ score(X)

        返回簇内误差平方和的相反数(即 -inertia_)。

4. 示例代码

以下是一个使用 KMeans 进行聚类的示例代码:

import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 1. 自定义数据集
# 生成 200 个样本,每个样本有 2 个特征
np.random.seed(42)
X = np.random.randn(200, 2)

# 2. 初始化 K 均值模型
kmeans = KMeans(n_clusters=3, random_state=42)

# 3. 训练模型
kmeans.fit(X)

# 4. 获取聚类结果
labels = kmeans.labels_
centroids = kmeans.cluster_centers_

# 5. 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50, alpha=0.8)
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X', s=200, label='聚类中心')
plt.title("K均值聚类")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.legend()
plt.show()

三、数据点与聚类中心距离

1. 欧式距离(Euclidean Distance)

① 定义

欧式距离是两点之间的直线距离,计算公式为:

d(x, y)=\sqrt{\sum_{i=1}^{n}(x_{i}-y_{i})^{2}}

其中:

        x 和 y 是两个数据点。

        n 是特征的数量。

② 特点

        适用于连续型数据。

        对数据的尺度敏感,因此在使用前通常需要对数据进行标准化。

③ 在 K 均值中的使用

  scikit-learn 的 KMeans 默认使用欧式距离。

     无需额外设置。

④ 代码示例

import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 1. 自定义数据集
np.random.seed(42)
X = np.random.randn(200, 2)

# 2. 初始化 K 均值模型(默认使用欧式距离)
kmeans = KMeans(n_clusters=3, random_state=42)

# 3. 训练模型
kmeans.fit(X)

# 4. 获取聚类结果
labels = kmeans.labels_
centroids = kmeans.cluster_centers_

# 5. 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50, alpha=0.8)
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X', s=200, label='聚类中心')
plt.title("K均值聚类(欧式距离)")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.legend()
plt.show()

2. 曼哈顿距离(Manhattan Distance)

① 定义

曼哈顿距离是两点在各维度上绝对差值的总和,计算公式为:

d(x, y)=\sum_{i=1}^{n}\left |x_{i}-y_{i}\right |

其中:

        x 和 y 是两个数据点。

        n 是特征的数量。

② 特点

        适用于离散型数据或高维稀疏数据。

        对异常值不敏感。

③ 在 K 均值中的使用

   scikit-learn 的 KMeans 默认不支持曼哈顿距离。

        可以通过自定义距离度量或使用其他库(如 scipy.spatial.distance)来实现。

④ 代码示例

import numpy as np
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt

# 1. 自定义数据集
np.random.seed(42)
X = np.random.randn(200, 2)

# 2. 自定义 K 均值算法(使用曼哈顿距离)
def kmeans_manhattan(X, n_clusters, max_iter=300, random_state=42):
    np.random.seed(random_state)
    # 随机初始化聚类中心
    centroids = X[np.random.choice(X.shape[0], n_clusters, replace=False)]
    
    for _ in range(max_iter):
        # 计算曼哈顿距离
        distances = cdist(X, centroids, metric='cityblock')
        # 分配样本到最近的簇
        labels = np.argmin(distances, axis=1)
        # 更新聚类中心
        new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(n_clusters)])
        # 判断是否收敛
        if np.all(centroids == new_centroids):
            break
        centroids = new_centroids
    
    return labels, centroids

# 3. 训练模型
labels, centroids = kmeans_manhattan(X, n_clusters=3)

# 4. 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50, alpha=0.8)
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X', s=200, label='聚类中心')
plt.title("K均值聚类(曼哈顿距离)")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.legend()
plt.show()

四、自定义数据集,使用scikit-learn 中K均值包 进行聚类

1. 代码示例

import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 1. 自定义数据集
# 生成 200 个样本,每个样本有 2 个特征
np.random.seed(42)  # 设置随机种子以确保结果可重复
X = np.random.randn(200, 2).astype(np.float32)

# 2. 初始化 K 均值模型
# 设置聚类数为 3
kmeans = KMeans(n_clusters=3, random_state=42)

# 3. 训练模型
kmeans.fit(X)

# 4. 获取聚类结果
# 获取每个样本的聚类标签
labels = kmeans.labels_
# 获取聚类中心
centroids = kmeans.cluster_centers_

# 5. 可视化聚类结果
# 绘制样本点,按聚类标签着色
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50, alpha=0.8)
# 绘制聚类中心
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X', s=200, label='聚类中心')
plt.title("K均值聚类")
plt.xlabel("特征1")
plt.ylabel("特征2")
plt.legend()
plt.show()

2. 代码解释

① 自定义数据集

  • X = np.random.randn(200, 2).astype(np.float32)

         生成 200 个样本,每个样本有 2 个特征。

         使用 np.random.randn 生成符合标准正态分布的随机数。

   astype(np.float32) 将数据类型转换为 32 位浮点数。

  • np.random.seed(42)

        设置随机种子,确保每次运行代码时生成的数据集相同。

② 初始化 K 均值模型

  • kmeans = KMeans(n_clusters=3, random_state=42)

         使用 KMeans 初始化 K 均值模型。

   n_clusters=3 表示将数据分为 3 个簇。

   random_state=42 确保每次运行代码时聚类结果一致。

  • 这里默认使用了欧式距离

③ 训练模型

  • kmeans.fit(X)

        使用数据集训练 K 均值模型。

        模型会计算每个样本的聚类标签和聚类中心。

④ 获取聚类结果

  • labels = kmeans.labels_

        获取每个样本的聚类标签(0、1 或 2)。

  • centroids = kmeans.cluster_centers_

        获取每个簇的中心点。

⑤ 使用 matplotlib 绘制聚类结果:

  • plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=50, alpha=0.8)

         绘制样本点,按聚类标签着色。

   cmap='viridis' 指定颜色映射。

   s=50 设置点的大小。

   alpha=0.8 设置点的透明度。

  • plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X', s=200, label='Centroids')

         绘制聚类中心,用红色 X 标记。

   s=200 设置标记的大小。

   label=聚类中心' 添加图例标签。

  • plt.title("K均值聚类"):设置图表标题。

  • plt.xlabel(特征1"") 和 plt.ylabel("特征2"):设置坐标轴标签。

  • plt.legend():显示图例。

  • plt.show():显示图表。

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

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

相关文章

进阶数据结构——高精度运算

目录 前言一、高精度运算的定义与背景二、高精度运算的实现方式三、高精度运算的算法实现四、高精度运算的应用场景五、代码模版(c)六、经典例题1.[高精度加法](https://www.lanqiao.cn/problems/1516/learning/?page1&first_category_id1&name…

设计模式Python版 原型模式

文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对…

用 JavaScript 打造交互式表格:添加与删除行功能

前言 在网页开发中,创建交互式表格是很常见的。今天我们通过一个示例,来展示如何使用 HTML、CSS 和 JavaScript 实现一个能够动态添加和删除行的表格,并详细解释其中 JavaScript 部分的代码逻辑。 功能展示 初始状态:页面加载后…

Linux02——Linux的基本命令

目录 ls 常用选项及功能 综合示例 注意事项 cd和pwd命令 cd命令 pwd命令 相对路径、绝对路径和特殊路径符 特殊路径符号 mkdir命令 1. 功能与基本用法 2. 示例 3. 语法与参数 4. -p选项 touch-cat-more命令 1. touch命令 2. cat命令 3. more命令 cp-mv-rm命…

服务器虚拟化实战:架构、技术与最佳实践

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 服务器虚拟化是现代 IT 基础设施的重要组成部分,通过虚拟化技术可以提高服务器资源利用率、降低硬件成本&am…

AI大模型开发原理篇-1:语言模型雏形之N-Gram模型

N-Gram模型概念 N-Gram模型是一种基于统计的语言模型,用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说,N-Gram模型通过将文本切分为长度为N的词序列来进行建模。 注意:这…

Python从零构建macOS状态栏应用(仿ollama)并集成AI同款流式聊天 API 服务(含打包为独立应用)

在本教程中,我们将一步步构建一个 macOS 状态栏应用程序,并集成一个 Flask 服务器,提供流式响应的 API 服务。 如果你手中正好持有一台 MacBook Pro,又怀揣着搭建 AI 聊天服务的想法,却不知从何处迈出第一步,那么这篇文章绝对是你的及时雨。 最终,我们将实现以下功能: …

leetcode 2080. 区间内查询数字的频率

题目如下 数据范围 示例 这题十分有意思一开始我想对每个子数组排序二分结果超时了。 转换思路:我们可以提前把每个数字出现的位置先记录下来形成集合, 然后拿着left和right利用二分查找看看left和right是不是在集合里然后做一个相减就出答案了。通过…

深入了解 SSRF 漏洞:原理、条件、危害

目录 前言 SSRF 原理 漏洞产生原因 产生条件 使用协议 使用函数 漏洞影响 防御措施 结语 前言 本文将深入剖析 SSRF(服务端请求伪造)漏洞,从原理、产生原因、条件、影响,到防御措施,为你全面梳理相关知识&am…

11.QT控件:输入类控件

1. Line Edit(单行输入框) QLineEdit表示单行输入框,用来输入一段文本,但是不能换行。 核心属性: 核心信号: 2. Text Edit(多行输入框) QTextEdit表示多行输入框,也是一个富文本 & markdown编辑器。并且能在内容超…

Cesium+Vue3教程(011):打造数字城市

文章目录 Cesium打造数字城市创建项目加载地球设置底图设置摄像头查看具体位置和方向添加纽约建筑模型并设置样式添加纽约建筑模型设置样式划分城市区域并着色地图标记显示与实现实现飞机巡城完整项目下载Cesium打造数字城市 创建项目 使用vite创建vue3项目: pnpm create v…

Windows系统本地部署deepseek 更改目录

本地部署deepseek 无论是mac还是windows系统本地部署deepseek或者其他模型的命令和步骤是一样的。 可以看: 本地部署deepsek 无论是ollama还是部署LLM时候都默认是系统磁盘,对于Windows系统,我们一般不把应用放到系统盘(C:)而是…

基于Python的药物相互作用预测模型AI构建与优化(下.代码部分)

四、特征工程 4.1 分子描述符计算 分子描述符作为量化分子性质的关键数值,能够从多维度反映药物分子的结构和化学特征,在药物相互作用预测中起着举足轻重的作用。RDKit 库凭借其强大的功能,为我们提供了丰富的分子描述符计算方法,涵盖了多个重要方面的分子性质。 分子量…

[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题)

[Python学习日记-79] socket 开发中的粘包现象(解决模拟 SSH 远程执行命令代码中的粘包问题) 简介 粘包问题底层原理分析 粘包问题的解决 简介 在Python学习日记-78我们留下了两个问题,一个是服务器端 send() 中使用加号的问题&#xff0c…

origin如何在已经画好的图上修改数据且不改变原图像的画风和格式

例如我现在的.opju文件长这样 现在我换了数据集,我想修改这两个图表里对应的算法里的数据,但是我还想保留这图像现在的形式,可以尝试像下面这样做: 右击第一个图,出现下面,选择Book[sheet1] 选择工作簿 出…

5.3.2 软件设计原则

文章目录 抽象模块化信息隐蔽与独立性衡量 软件设计原则:抽象、模块化、信息隐蔽。 抽象 抽象是抽出事物本质的共同特性。过程抽象是指将一个明确定义功能的操作当作单个实体看待。数据抽象是对数据的类型、操作、取值范围进行定义,然后通过这些操作对数…

【ArcGIS遇上Python】批量提取多波段影像至单个波段

本案例基于ArcGIS python,将landsat影像的7个波段影像数据,批量提取至单个波段。 相关阅读:【ArcGIS微课1000例】0141:提取多波段影像中的单个波段 文章目录 一、数据准备二、效果比对二、python批处理1. 编写python代码2. 运行代码一、数据准备 实验数据及完整的python位…

Spring Security(maven项目) 3.0.2.9版本 --- 改

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…

仿真设计|基于51单片机的温度与烟雾报警系统

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 (1)LCD1602实时监测及显示温度值和烟雾浓度值; (2…

深入剖析 CSRF 漏洞:原理、危害案例与防护

目录 前言 漏洞介绍 漏洞原理 产生条件 产生的危害 靶场练习 post 请求csrf案例 防御措施 验证请求来源 设置 SameSite 属性 双重提交 Cookie 结语 前言 在网络安全领域,各类漏洞层出不穷,时刻威胁着用户的隐私与数据安全。跨站请求伪造&…