机器学习经典无监督算法——聚类K-Means算法

news2025/1/19 21:08:56

目录

算法原理

算法步骤

算法API

算法导入

API参数理解

算法实现


算法原理

Kmeans 算法是一种无监督的聚类算法,目的是将数据集中的样本划分到 K 个不同的簇中。

聚类:将数据集中相似的数据点归为一组或一个簇的过程。

数据集:一组相关的数据的集合。

样本:数据集中的单个数据点。

:通过聚类算法划分出来的具有相似特征的数据点的集合。

img

img

算法步骤

  1. 初始化:随机选择 K 个数据点作为初始的簇中心(也称为质心)。

  2. 分配数据点:对于数据集中的每个数据点,计算它到 K 个质心的距离,将其分配到距离最近的质心所代表的簇。

  3. 更新质心:对于每个簇,重新计算质心,即该簇中所有数据点的均值。

  4. 重复步骤 2 和 3,直到质心不再发生明显变化或者达到预定的迭代次数。

img

算法API

算法导入
from sklearn.cluster import KMeans
API参数理解

class sklearn.cluster.KMeans(n_clusters=8, init=’k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm=’auto’)[[source]]

n_clusters:类中心的个数,就是要聚成几类。【默认是8个】

init:参初始化的方法,默认为k-means++

(1)k-means++: 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛.

(2) random: 随机从训练数据中选取初始质心。

(3) 如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

n_init: 整形,缺省值=10,用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。

max_iter:int,default=300,执行一次k-means算法所进行的最大迭代数。

Tol:与inertia结合来确定收敛条件。

precompute_distances:三个可选值,‘auto’,True 或者 False。

预计算距离,计算速度更快但占用更多内存。

(1)‘auto’:如果样本数乘以聚类数大于12million 的话则不预计算距离。

(2)True:总是预先计算距离。

(3)False:永远不预先计算距离。

verbose:整形,默认值=0

random_state :随机状态

copy_x:布尔型,默认值=True

当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

algorithm:'auto','full' or 'elkan'.默认为'auto' full:采用经典的EM算法 elkan:通过使用三角不等式从而更有效,但不支持稀疏数据 auto:数据稀疏选择full模式,数据稠密选择elkan模式

【属性】

cluster_centers_: 一个n-clusters*n_features的矩阵,表示聚类中心的坐标

Labels_:每个点的分类标签。

inertia_:float形每个点到其簇的质心的距离之和。

n_iter_ : int迭代次数。

算法实现

下面是一个啤酒数据集data.txt为例子,请用K-Means算法根据不同啤酒的不同指标对啤酒进行聚类

思路:

  • 从文件中读取数据,提取特征,然后使用 KMeans 算法对不同的 k 值(从 2 到 9)进行聚类,并计算每个 k 值下的轮廓系数得分,存储在 scores 列表中。

  • 绘制出 k 值和轮廓系数得分的关系图,以直观地观察不同 k 值下的聚类效果。

  • 接着,使用 max(scores) 找到 scores 列表中的最大值,scores.index(max(scores)) 找到该最大值在 scores 列表中的索引。由于 k 从 2 开始,而列表索引从 0 开始,所以需要将索引加 2 得到最优的 k 值,存储在 best_k_index 中。

  • 最后,使用 KMeans 算法进行聚类,将 n_clusters 参数设置为 best_k_index 进行聚类,并将聚类结果存储在 beer 数据集的 cluster 列中。然后计算聚类结果的轮廓系数得分,以评估聚类的质量。

import pandas as pd
from sklearn.cluster import KMeans
from sklearn import metrics
import matplotlib.pyplot as plt
​
# 读取文本文件 data.txt,文件中数据使用空格分隔,编码为 utf8,使用 python 引擎解析
beer = pd.read_table('data.txt', sep=' ', encoding='utf8', engine='python')
# 选取 beer 数据集中的 "calories","sodium","alcohol","cost" 列作为特征
X = beer[["calories", "sodium", "alcohol", "cost"]]
# 打印 beer 数据集的前几行
print(beer.head())
​
# 根据分成不同的簇,自动计算轮廓系数得分
scores = []
# 尝试不同的簇数量,从 2 到 9
for k in range(2, 10):
    # 使用 KMeans 算法进行聚类,聚类簇的数量为 k
    labels = KMeans(n_clusters=k).fit(X).labels_
    # 计算轮廓系数得分
    score = metrics.silhouette_score(X, labels)
    # 将得分添加到 scores 列表中
    scores.append(score)
print(scores)
​
# 绘制得分结果
# 绘制簇数量从 2 到 9 与对应的轮廓系数得分的折线图
plt.plot(list(range(2, 10)), scores)
# 设置 x 轴标签
plt.xlabel('Number of Clusters Initialized')
# 设置 y 轴标签
plt.ylabel('Sihouette Score')
# 显示图形
plt.show()
​
# 找到最优的簇数量
best_k_index = scores.index(max(scores)) + 2
print(f"最优的簇数量: {best_k_index}")
​
# 使用 KMeans 算法进行聚类,聚类簇的数量为最优的簇数量
km = KMeans(n_clusters=best_k_index).fit(X)
# 将聚类结果存储在 beer 数据集的 'cluster' 列中
beer['cluster'] = km.labels_
# 对聚类结果进行评分
# 计算轮廓系数得分,使用 beer['cluster'] 来访问 cluster 列的数据
score = metrics.silhouette_score(X, beer['cluster'])
print(f'最优的簇数量得分:{score}')

 

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

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

相关文章

【MySQL索引:B+树与页的深度解析】

文章目录 MySQL索引:B树与页的深度解析1. 索引使用的数据结构——B树1.1 B树介绍1.2 B树的特点1.3 B树和B树的对比 2. MySQL中的页2.1 页的介绍2.2 页主体2.3 页目录2.4 B树在MySQL索引中的应用 MySQL索引:B树与页的深度解析 在MySQL数据库中&#xff0…

新阿里云买服务器配置需手动配置80端口

新买阿里云服务器需手动配置80,端口才可以访问nginx CentOS系统 安装nginx 1. 安装 Nginx yum install nginx 2. 启动 Nginx 服务 systemctl start nginx 3. 修改默认网页 cd /usr/share/nginx/ echo "666" >index.html cat index.html 访问ngin最后…

机器学习——什么是代价函数? 下

“上次课讲了机器学习的模型表示,讲了一个线性模型的例子,那怎样在可能的拟合直线里选择一条最合适的呢?有没有数学的方法让这个直线合适还是不合适变得可以量化呢?这就要说代价函数了。” 本次课前半段内容非常简单,带领我们一起复习初中平面几何的知识,后半段给出了代价…

LeetCode - #187 Swift 实现重复的DNA序列

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…

ReactiveReactor Core

Reactive&Reactor Core 一、概述1、问题2、优势3、发展 二、Reactive Streams1、依赖2、API 三、Project Reactor1、概述2、并发模型3、入门1、依赖2、Flux和Mono3、空流&错误流 4、订阅响应式流1、常见订阅2、自定义订阅 5、API1、index2、timestamp3、any4、map5、fi…

STL容器-- list的模拟实现(附源码)

STL容器-- list的模拟实现(附源码) List的实现主要考察我们对list这一容器的理解,和代码的编写能力,通过上节对list容器的使用,我们对list容器已经有了一些基本的了解,接下来就让我们来实现一些list容器常见…

【转】厚植根基,同启新程!一文回顾 2024 OpenHarmony 社区年度工作会议精彩瞬间

在数字化浪潮奔腾不息的今天,开源技术已成为推动科技创新与产业发展的强大引擎。2025年1月10日-11日,OpenAtom OpenHarmony(开放原子开源鸿蒙,以下简称“OpenHarmony”或“开源鸿蒙”)社区2024年度工作会议于深圳盛大启…

蓝桥杯备考:堆和priority queue(优先级队列)

堆的定义 heap堆是一种特殊的完全二叉树,对于树中的每个结点,如果该结点的权值大于等于孩子结点的权值,就称它为大根堆,小于等于就叫小根堆,如果是大根堆,每个子树也是符合大根堆的特征的,如果是…

力扣682

from typing import Listclass Solution:def calPoints(self, operations: List[str]) -> int:a [] # 用于存储有效得分的列表for op in operations:if op.isdigit() or (op[0] - and op[1:].isdigit()): # 如果是整数(包括负数)a.append(int(op)…

考研计算机组成原理——零基础学习的笔记

第一章 研究计算机硬件的学科。 1.计算机系统概述 计算机系统硬件软件(系统软件:比如操作系统、数据库管理系统、标准程序库等,应用软件:QQ等) 1.2计算机的层次结构 1.2.1计算机硬件的基本组成 冯诺伊曼计算机&a…

海康工业相机的应用部署不是简简单单!?

作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 笔者使用的设备及环境:WSL2-Ubuntu22.04MV-CS016-10UC 不会吧?不会吧?不会还有人拿到海康工业相机还是一脸懵叭?不会还有人…

计算机网络 (49)网络安全问题概述

前言 计算机网络安全问题是一个复杂且多维的领域,它涉及到网络系统的硬件、软件以及数据的安全保护,确保这些元素不因偶然的或恶意的原因而遭到破坏、更改或泄露。 一、计算机网络安全的定义 计算机网络安全是指利用网络管理控制和技术措施,保…

STM32 FreeRTOS中断管理

目录 FreeRTOS的中断管理 1、STM32中断优先级管理 2、FreeRTOS任务优先级管理 3、寄存器和内存映射寄存器 4、BASEPRI寄存器 5、FreeRTOS与STM32中断管理结合使用 vPortRaiseBASEPRI vPortSetBASEPRI 6、FromISR后缀 7、在中断服务函数中调用FreeRTOS的API函数需注意 F…

操作系统 期末重点复习

操作系统 期末重点复习 必会 课后题摘要 第二章: 在操作系统中为什么要引入进程概念?它会产生什么样的影响? 为了使程序在多道程序环境下能并发执行,并对并发执行的程序加以控制和描述,在操作系统中引入了进程概念。影响: 使程…

7.5.4 MVCC优化测试

作者: h5n1 原文来源: https://tidb.net/blog/4e02d900 1. 背景 由于MVCC 版本数量过多导致rocksdb扫描key数量过多影响SQL执行时间是tidb经常出现问的问题,tidb也一直在致力于优化该问题。 一些优化方式包括比: (1) 从传统…

2024年AI与大数据技术趋势洞察:跨领域创新与社会变革

目录 引言 技术洞察 1. 大模型技术的创新与开源推动 2. AI Agent 智能体平台技术 3. 多模态技术的兴起:跨领域应用的新风口 4. 强化学习与推荐系统:智能化决策的底层驱动 5. 开源工具与平台的快速发展:赋能技术创新 6. 技术安全与伦理:AI技术的双刃剑 7. 跨领域技…

vulnhub靶场【Lampiao靶机】,主要考察提权,脏牛提权

前言 靶机:lampiao,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 该靶机目前只剩下一个了,之前记得是有两台构成系列的。 文章中涉及的靶机,来源于v…

ASP .NET Core 学习(.NET9)配置接口访问路由

新创建的 ASP .NET Core Web API项目中Controller进行请求时,是在地址:端口/Controller名称进行访问的,这个时候Controller的默认路由配置如下 访问接口时,是通过请求方法(GET、Post、Put、Delete)进行接口区分的&…

构建core模块

文章目录 1.环境搭建1.sunrays-common下新建core模块2.引入依赖,并设置打包常规配置 2.测试使用1.启动!1.创建模块2.引入依赖3.application.yml 配置MySQL和Minio4.创建启动类5.启动测试 2.common-web-starter1.目录2.WebController.java3.结果 3.common…

VRTK4 记录抓取错误

左手原本可以正常抓取,但是当右手拿起一个物体时,左手抓取右手的线性驱动器,只有部分区域可以抓取 原因是左手的判定物体的层级错误 应该在Collections下,之前错误的和Collections同一层级,导致抓取有时可以有时不可以…