第L8周:机器学习|K-means聚类算法

news2024/9/22 21:15:51

本文为🔗365天深度学习训练营中的学习记录博客
🍖 原作者:K同学啊 | 接辅导、项目定制
🚀 文章来源:K同学的学习圈子深度学习

聚类算法的定义:

聚类就是将一个庞杂数据集中具有相似特征的数据自动归类到一起,称为一个簇,簇内的对象越相似,聚类的效果越好。“相似”这一概念,是利用距离标准来衡量的,我们通过计算对象与对象之间的距离远近来判断它们是否属于同一类别,即是否是同一个簇。

聚类是一种无监督学习(Unsupervised Learning)的方法,不需要预先标注好训练集。聚类与分类最大的区别就是分类的目标事先已知,对于一个动物集来说,你并不清楚这个数据集内部有多少种类的动物,你能做的只是利用聚类方法将它自动按照特征分为多类,然后人为给出这个聚类结果的定义(即簇识别)。例如,你将一个动物集分为了三簇(类),然后通过观察这三类动物的特征,你为每一个簇起一个名字,如大象、狗、猫等,这就是聚类的基本思想。

K-means就是一个聚类的算法,属于无监督学习算法,也是就样本没有标签。算法会根据某种规则进行“分割”,把相同的或者相近的数据放在一起。K-means算法的基本思想是通过不断更新簇的中心点,将数据集划分为预定数量的簇。这一过程涉及到计算数据点之间的距离,通常使用欧式距离作为相似性度量。在算法执行过程中,每个数据点被分配到距离最近的簇,然后更新簇的中心,迭代进行直至收敛。

聚类过程

K-means算法接受一个参数K用以决定结果中簇的数目。算法开始时,要在数据集中随机选择K个数据对象用来当做K个簇的初始中心,而将剩下的各个数据对象就根据他们和每个聚类簇心的距离选择簇心最近的簇分配到其中。然后重新计算各个聚类簇中的所有数据对象的平均值,并将得到的结果作为新的簇心;逐步重复上述的过程直至目标函数收敛为止。其步骤具体地:

  • 第一步:从N个样本数据中随机选取K个对象,作为初始的聚类中心;
  • 第二步:分别计算每个样本点到各个聚类中心的距离,并逐个分配到距离其最近的簇中;
  • 第三步:所有对象分配完成后,更新K个类中心位置,类中心定义为簇内所有对象在各个维度的均值;
  • 第四步:与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转至步骤2,否则转至步骤5;
  • 第五步:当类中心不再发生变化,停止并输出聚类结果,然后整理我们所需要的信息,如各个样本所属的类等等,进行后续的统计和分析。


聚类结束之前,类中心会不断移动,而随着类中心的移动,样本的划分情况也会持续发生改变。

代码

import time
import pandas as pd
import numpy  as np
import matplotlib.pyplot as plt
from numpy import nonzero, array
from sklearn.decomposition import PCA

# 数据保存在.csv文件中
iris = pd.read_csv("dataset/Iris.csv", header=0)  # 鸢尾花数据集 Iris  class=3
df   = iris  # 设置要读取的数据集
df
columns  = list(df.columns)  # 获取数据集的第一行,第一行通常为特征名,所以先取出
columns
# 数据集的特征名(去除了最后一列,因为最后一列存放的是标签,不是数据)
features = columns[:-1]  
features
# 预处理之后的数据,去除掉了第一行的数据(因为其为特征名,如果数据第一行不是特征名,可跳过这一步)
dataset  = df[features]
dataset
attributes      = len(df.columns) - 1   # 属性数量(数据集维度)
original_labels = list(df[columns[-1]]) # 原始标签
def draw_cluster(dataset, centers, labels, k):
    center_array = array(centers)
    if attributes > 2:
        # 将三维数据降为二维,方便进行可视化
        dataset      = PCA(n_components=2).fit_transform(dataset)  # 如果属性数量大于2,降维
        center_array = PCA(n_components=2).fit_transform(center_array)  # 如果属性数量大于2,降维
    else:
        dataset = array(dataset)
    # 做散点图
    label = array(labels)
    plt.scatter(dataset[:, 0], 
                dataset[:, 1], 
                marker='o', 
                c='black', s=7)  # 原图

    colors = np.array(
        ["#FF0000", "#0000FF", "#00FF00", "#FFFF00", "#00FFFF", "#FF00FF", "#800000", "#008000", "#000080", "#808000",
         "#800080", "#008080", "#444444", "#FFD700", "#008080"])
    
    # 循换打印k个簇,每个簇使用不同的颜色
    for i in range(k):
        plt.scatter(dataset[nonzero(label == i), 0], 
                    dataset[nonzero(label == i), 1], 
                    c=colors[i], 
                    s=7, marker='o')

    plt.show()
from sklearn.cluster import KMeans

k = 3

# 使用KMeans进行聚类
kmeans = KMeans(n_clusters=k, n_init=10).fit(dataset)  # 指定要分的簇数

import pandas as pd  
import numpy  as np  
import matplotlib.pyplot as plt  
from sklearn.cluster import KMeans  
  
# 提供的数据  
data = {  
    'K1': [3, 3, 4, 4, 1, 1, 2, 2],  
    'K2': [1, 2, 1, 2, 3, 4, 3, 4]  
}  
  
# 创建DataFrame  
df = pd.DataFrame(data)  
  
# 提取用于聚类的特征  
X = df[['K1', 'K2']]
  
# 初始化KMeans模型列表,并设定k的范围  
range_n_clusters = [1, 2, 3, 4, 5, 6, 7, 8]  # 扩大了k的范围  
inertia_scores = []  

# 对每个k值进行聚类并计算SSE值  
for n_clusters in range_n_clusters:  
    # 使用KMeans算法  
    kmeans = KMeans(n_init=10, 
                    n_clusters=n_clusters, 
                    random_state=123)  
    kmeans.fit(X)  
      
    # 获取SSE值
    inertia = kmeans.inertia_  
    inertia_scores.append(inertia) 
    
# 绘制惯性指标随聚类数量变化的图形  
plt.figure(figsize=(8, 4))   
plt.plot(range_n_clusters, inertia_scores, marker='o')  
plt.xlabel('Number of clusters')  
plt.ylabel('SSE')  
plt.title('SSE for Different Number of Clusters')  
plt.xticks(range_n_clusters)  # 显示所有x轴刻度  
plt.show()

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

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

相关文章

YOLOV5入门教学-common.py文件

在 YOLOv5 框架中,common.py 文件是一个核心组件,负责定义深度学习模型的基础模块和常用操作。无论是卷积层、激活函数、特征融合还是其他复杂的模型结构,common.py 都提供了灵活且高效的实现。在这篇文章中,我们将深入解析 commo…

【科普知识】一体化电机掉电后“位置精准复位“机制与规律

在工业自动化、机器人技术及精密控制领域,电机作为核心执行元件,其稳定运行和精确控制对于整个系统的性能至关重要。 然而,电机在运行过程中可能会遭遇突然断电的情况,这会导致电机失去驱动力并停止在当前位置,甚至在…

基于YOLOv10的垃圾检测系统

基于YOLOv10的垃圾检测系统 (价格90) 包含 [CardBoard, Glass, Metal, Paper, Plastic] 5个类 [纸板, 玻璃, 金属, 纸张, 塑料] 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的…

Minimax-秋招正式批-面经(计网)

6. websocket和http区别 websocket知识点总结_防火墙 websocket-CSDN博客 相同点 都是基于TCP协议,都是可靠性传输协议都是应用层协议 不同点 HTTP 类型: 请求-响应式的无状态协议,半双工通信,同一时刻只能一个方向上有动作通…

变阻箱和负载箱的区别

变阻箱和负载箱是两种常见的电力设备,它们在电力系统中起着重要的作用。虽然它们都是用来调节电流的,但是它们的工作原理和用途有很大的区别。 首先,我们来看看变阻箱。变阻箱是一种可以改变电阻值的设备,它的主要作用是调节电流…

el-table使用type=“expand”根据数据条件隐藏展开按钮

一&#xff1a;添加className <el-table :data"tableData" border :loading"loading" :row-class-name"getRowClass" expand-change"expandchange"><el-table-column type"expand"><template #default"…

基于51单片机的智能小车转向控制系统设计与实现

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

PCB散热设计

随着电子设备性能的不断提升&#xff0c;电路板上的元器件集成度越来越高&#xff0c;发热量也随之增加。如何有效管理这些热量&#xff0c;保证电路板在高温环境下的稳定运行&#xff0c;成为设计过程中一个不可忽视的问题。如果散热不佳&#xff0c;电子元件可能会因过热导致…

python3删除es 45天前索引,生产环境验证过

本人es版本 环境 pip install --upgrade elasticsearch==7.16.3代码 from datetime import datetime, timedelta from elasticsearch import Elasticsearch

通过15张图带你掌握网络抓包工具Wireshark必备使用技巧

学习TCP/IP等网络协议时异常枯燥&#xff0c;因为网络问题看不见摸不着&#xff0c;很难深入理解其工作原理&#xff0c;而Wireshark正是将这些知识以一种网络数据包、可视化的形式呈现给大家&#xff0c;接下来博主带大家掌握Wireshark的必备技能&#xff01;如有任何疑问&…

【GPT】Coze使用开放平台接口-【5】API 调用

我们在机器人里面引用工作流&#xff0c;当然也可以通过 API 直接调用工作流&#xff0c;coze 也提供了这一套的 API 接口。coze 的 API 接口肯定也不只是接入工作流&#xff0c;Bots&#xff0c;文件&#xff0c;知识库等&#xff0c;都有相关接口。这个文档我们也只专注在工作…

IntelliJ IDEA 中实现 Spring Boot 项目 的自动编译

要在 IntelliJ IDEA 中实现 Spring Boot 项目的自动编译&#xff0c;可以通过以下步骤进行设置&#xff1a; 1.添加 Spring Boot DevTools 依赖 在项目 pom.xml文件中添加Spring Boot DevTools依赖。这个依赖提供了自动编译和热更新的功能。依赖的配置如下&#xff1a; <d…

Word快速重复上一步操作的三种高效方法

在日常工作、学习和生活中&#xff0c;我们经常需要执行一系列重复性的操作。这些操作可能简单如复制粘贴、调整图片大小&#xff0c;也可能复杂如编辑文档、处理数据等。为了提高效率&#xff0c;掌握快速重复上一步操作的方法显得尤为重要。本文将介绍三种高效的方法&#xf…

【扩散模型(十)】IP-Adapter 源码详解 4 - 训练细节、具体训了哪些层?

系列文章目录 【扩散模型&#xff08;一&#xff09;】中介绍了 Stable Diffusion 可以被理解为重建分支&#xff08;reconstruction branch&#xff09;和条件分支&#xff08;condition branch&#xff09;【扩散模型&#xff08;二&#xff09;】IP-Adapter 从条件分支的视…

论文阅读 - Coordinated Activity Modulates the Behavior and Emotions ofOrganic Users

协调活动调节有机用户的行为和情绪&#xff1a;有关加沙冲突的推文案例研究 https://dl.acm.org/doi/pdf/10.1145/3589335.3651483 目录 摘要 1 INTRODUCTION 2 DATA 3 METHODOLOGY 3.1 Coordinated Activity Detection 3.3 用户互动动态特征 3.4 Organic Users’ Behav…

系统架构师考试学习笔记第三篇——架构设计高级知识(17)云原生架构设计理论与实践

本章知识考点&#xff1a; 第17课时主要学习云原生架构设计理论与实践。根据考试大纲&#xff0c;本课时知识点会涉及单选题型&#xff08;约占2~4分&#xff09;、案例题&#xff08;25分&#xff09;和论文题&#xff0c;本课时节内容偏重于方法掌握和应用&#xff0c;根据以…

KEIL中编译51程序 算法计算异常的疑问

KEIL开发 51 单片机程序 算法处理过程中遇到的问题 ...... by 矜辰所致前言 因为产品的更新换代&#xff0c; 把所有温湿度传感器都换成 SHT40 &#xff0c;替换以前的 SHT21。在 STM32 系列产品上的替换都正常&#xff0c;但是在一块 51 内核的无线产品上面&#xff0c;数据…

两个月冲刺软考——逻辑地址与物理地址的转换(例题+讲解);文件类型的考点

1.已知计算机系统页面大小和进程的逻辑地址&#xff0c;根据页面变换表(页号-物理块号)&#xff0c;求变换后的物理地址。 首先介绍几个公式&#xff1a; 逻辑地址 页号 页内地址 (默认为32机位) 物理地址 物理块号 物理地址的页内地址 其中&#xff1a;页内地址 物理地址…

Kubernetes--服务发布(Service、Ingress)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 出自B站博主教程笔记&#xff1a; 完整版Kubernetes&#xff08;K8S&#xff09;全套入门微服务实战项目&#xff0c;带你一站式深入掌握K8S核心能…

算法_栈专题---持续更新

文章目录 前言删除字符中的所有相邻重复项题目要求题目解析代码如下 比较含退格的字符串题目要求题目解析代码如下 基本计算器II题目要求题目解析 字符串解码题目要求题目解析代码如下 验证栈序列题目要求题目解析代码如下 前言 本文将会向你介绍有关栈的相关题目&#xff1a;…