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

server/2024/10/18 5:58:18/

本文为🔗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 KMeansk = 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.ppmy.cn/server/114848.html

相关文章

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细…

MyBatis中Collection和Association的底层实现原理

MyBatis中Collection和Association的底层实现原理 Hi &#x1f44b;, Im shy 有人见尘埃&#xff0c;有人见星辰 技术咨询 引言 在 MyBatis 中&#xff0c;<collection> 和 <association> 标签用于处理一对多和一对一的关系。这两个标签在底层通过缓存、对象创…

Filebeat中间件监控指标解读

监控易是一款强大的系统监控工具&#xff0c;它能够全面监控IT系统的运行状态&#xff0c;及时发现问题并预警&#xff0c;确保系统的稳定性和高效运行。在本次解读中&#xff0c;我们将重点关注Filebeat中间件的监控指标。 Filebeat是一个轻量级的日志采集器&#xff0c;用于收…

Newtonsoft.Json (Json.NET)使用笔记

Newtonsoft.Json 简单介绍许可证功能特点 代码示例基本类型的序列化和反序列化对象与集合的序列化和反序列化对象的序列化与反序列化集合的序列化和反序列化 自定义转换器的使用自定义日期格式自定义转换器处理特殊类型 动态类型和 LINQ to JSON使用动态类型解析未知结构的 JSO…

SprinBoot+Vue二手回收微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

Python Pandas数据处理利器query方法解析

大家好&#xff0c;在数据分析中&#xff0c;数据过滤是常见且重要的操作。Pandas库提供了多种方法来筛选数据&#xff0c;其中 query 方法因其简洁和强大的表达能力受到广泛欢迎。本文将详细介绍Pandas query 方法的高级应用&#xff0c;助力大家在复杂数据过滤时更加得心应手…

vim 安装与配置教程(详细教程)

vim就是一个功能非常强大的文本编辑器&#xff0c;可以自己DIY的那种 &#xff0c;不但可以写代码 &#xff0c;还可编译 &#xff0c;可以让你手不离键盘的完成鼠标的所有操作。 如果想要了解vim的的发展历史和详细解说&#xff0c;可以自行上网搜索&#xff0c;我主要是记录一…

创建Hive表后,查看表结构发现中文注释乱码

问题描述&#xff1a; 创建Hive表后&#xff0c;查看表结构发现中文注释乱码 解决方法&#xff1a; 进入mysql,执行如下命令 use hive; #修改表字段注解编码 alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8; #修改表注解编码 alter table …