2024最新分别利用sklearn和Numpy实现c均值对鸢尾花数据集进行聚类(附完整代码和注释)

C均值聚类算法(K-Means Clustering)是一种非常流行的聚类算法,用于将数据点分成多个簇,使得簇内的点尽可能相似,簇间的点尽可能不同。以下是K-Means算法的基本步骤:

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

2. 分配:将每个数据点分配到最近的质心所属的簇中。

3. 更新:计算每个簇中所有点的均值,更新质心为这个均值。

4. 迭代:重复步骤2和3,直到满足某个终止条件(例如,达到最大迭代次数,或者质心的变化小于某个阈值)。

5. 终止:当满足终止条件时,算法结束,最终的簇划分就是聚类结果。

sklearn方法

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 定义不同的K值
k_values = [2, 3, 4, 5]# 评估不同K值的聚类效果
for k in k_values:kmeans = KMeans(n_clusters=k, random_state=42)kmeans.fit(X_scaled)labels = kmeans.labels_# 计算轮廓系数silhouette_avg = silhouette_score(X_scaled, labels)print(f"For n_clusters = {k}, silhouette score is {silhouette_avg}")# 可视化聚类效果plt.figure(figsize=(8, 6))plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis', marker='o', label='Cluster')centers = kmeans.cluster_centers_plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='*', label='Centroids')plt.title(f'K-Means Clustering with n_clusters = {k}')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.legend()plt.show()# 评估不同初始化方法的聚类效果
k = 3
#
init_methods = ['random', 'k-means++']
for init in init_methods:kmeans = KMeans(n_clusters=k, init=init, random_state=42)kmeans.fit(X_scaled)labels = kmeans.labels_# 计算轮廓系数silhouette_avg = silhouette_score(X_scaled, labels)print(f"For n_clusters = {k}, init method = {init}, silhouette score is {silhouette_avg}")# 可视化聚类效果plt.figure(figsize=(8, 6))plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis', marker='o', label='Cluster')centers = kmeans.cluster_centers_plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='*', label='Centroids')plt.title(f'K-Means Clustering with n_clusters = {k}, init method = {init}')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.legend()plt.show()

Numpy方法

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler#使用 NumPy 实现 K-Means 算法
def kmeans(X, k, max_iters=100):n_samples, n_features = X.shapecentroids = X[np.random.choice(n_samples, k, replace=False)]for _ in range(max_iters):distances = np.sqrt((X[:, np.newaxis] - centroids) ** 2).sum(axis=2)labels = np.argmin(distances, axis=1)new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(k)])if np.all(centroids == new_centroids):breakcentroids = new_centroidsreturn labels, centroids#加载鸢尾花数据集并对其进行标准化
iris = datasets.load_iris()
X = iris.data
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)#评估不同 c 值的聚类效果
from sklearn.metrics import silhouette_score
k_values = [2, 3, 4]
for k in k_values:labels, centers = kmeans(X_scaled, k)silhouette_avg = silhouette_score(X_scaled, labels)print(f"For n_clusters = {k}, silhouette score is {silhouette_avg}")
#可视化每个 k 值的聚类结果。
for k in k_values:labels, centers = kmeans(X_scaled, k)plt.figure(figsize=(8, 6))plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis', marker='o', label='Cluster')plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='*', label='Centroids')plt.title(f'K-Means Clustering with n_clusters = {k}')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.legend()plt.show()#评估不同初始化方法对聚类效果的影响
def kmeans_plusplus(X, k, max_iters=100):n_samples, n_features = X.shapecentroids = [X[np.random.choice(n_samples)]]for _ in range(1, k):distances = np.sqrt((X[:, np.newaxis] - centroids) ** 2).sum(axis=2)probabilities = distances.min(axis=1) ** 2cumulative_probabilities = probabilities.cumsum()r = np.random.rand() * cumulative_probabilities[-1]new_centroid_index = np.searchsorted(cumulative_probabilities, r)centroids.append(X[new_centroid_index])centroids = np.array(centroids)for _ in range(max_iters):distances = np.sqrt((X[:, np.newaxis] - centroids) ** 2).sum(axis=2)labels = np.argmin(distances, axis=1)new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(k)])if np.all(centroids == new_centroids):breakcentroids = new_centroidsreturn labels, centroidsfor k in k_values:labels, centers = kmeans_plusplus(X_scaled, k)silhouette_avg = silhouette_score(X_scaled, labels)print(f"For n_clusters = {k}, silhouette score (k-means++) is {silhouette_avg}")plt.figure(figsize=(8, 6))plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis', marker='o', label='Cluster')plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='*', label='Centroids')plt.title(f'K-Means++ Clustering with n_clusters = {k}')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.legend()plt.show()

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

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

相关文章

网络断开导致SSH会话和服务端任务终止的原因及使用screen详解

在进行深度学习任务时,常常在本地通过ssh连接远程服务器进行炼丹任务。当我在pycharm上远程连接到服务器上进行训练时,由于网络不稳定使得SSH断开连接,我原以为服务器不会受影响。通过nvidia-smi命令发现GPU占用为0,这才发现任务终…

稀土阻燃协效剂 - 阻燃

金士镧稀土阻燃协效剂的技术衬垫: 金士镧KingCela 稀土阻燃协效剂KCL-FR-06xx系列产品,凭借独特的稀土4f电子层结构, 可协效磷氮阻燃剂,卤系阻燃剂阻燃剂在高分子材料(橡胶,塑料,涂层,胶黏剂&a…

『网络游戏』服务器启动逻辑【16】

新建Visual Studio工程命名为NetGameServer 重命名为ServerStart.cs 创建脚本: 编写脚本:ServerRoot.cs 编写脚本:ServerStart.cs 新建文件夹 调整脚本位置 新建文件夹 新建文件夹网络服务 创建脚本:NetSvc.cs 编写脚本&#xff1…

使用 KVM 在 Xubuntu 上创建 Windows 10 虚拟机

目录 前言说明注意准备 iso官网思博主(嘻嘻)拖动到虚拟机里面启动 virt-manager创建虚拟机选择本地安装介质选择 iso配置 内存 和 CPU选择 创建的虚拟机 保存的位置启动虚拟机看到熟悉的 Win10界面前言 XUbuntu安装OpenSSH远程连接服务器 远程连接之MobaXterm安装使用 虚拟化技…

DS线性表之队列的讲解和实现(5)

文章目录 前言一、队列的概念及结构二、队列的实现队列节点和队列初始化销毁判断是否为空入队列出队列获取队头队尾数据获取队列元素个数 三、实际使用效果总结 前言 队列实现源代码   队列是我们遇到的第二个实用数据结构,栈和队列地位等同 一、队列的概念及结构…

一篇python常见的Pandas的数据功能的使用

当我们学习了如何使用 Pandas 进行数据的导入与导出,这为我们后续的数据处理打下了基础.此次我们将重点讨论数据选择与过滤.通过掌握这一部分的知识,你将能够轻松地从复杂的数据集中提取出所需的信息.接下来,我们将通过一些实例来逐步了解这些操作. 这里插播一条粉丝福利&#…

前端技巧汇总

保持盒子在中间位置&#xff1a; 中间盒子设置位绝对定位 上下左右都设置为0 margin为auto中间 <!doctype html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width,…

三、AOP

文章目录 1. AOP&#xff08;概念&#xff09;2. AOP&#xff08;底层原理&#xff09;2.1 AOP 底层使用动态代理2.2 AOP&#xff08;JDK动态代理&#xff09; 3. AOP&#xff08;术语&#xff09;3.1 连接点3.2 切入点3.3 通知&#xff08;增强&#xff09;3.4 切面 4. AOP操作…

Element中el-table组件设置max-height右侧出现空白列的解决方法

之前就出现过这个情况&#xff0c;没理过&#xff0c;因为不影响啥除了不美观...但今天看着实在是难受&#xff0c;怎么都不顺眼(可能是我自己烦躁--) 试了很多网上的方法&#xff0c;都不得行&#xff0c;后面发现了这篇文章&#xff0c;解决了! 感谢&#xff01; Element中t…

深度学习:生成对抗网络(Generative Adversarial Network, GAN)

生成对抗网络&#xff08;Generative Adversarial Network, GAN&#xff09; 生成对抗网络&#xff08;GAN&#xff09;是一种深度学习模型&#xff0c;最初由Ian Goodfellow于2014年提出。这种模型框架通过让两个神经网络——生成器&#xff08;Generator&#xff09;和判别器…

SpringBoot人事系统:企业人才资源的智能管家

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

fastadmin 多商户模式下侧边栏跳转路径BUG

记录&#xff1a;仅作自己项目记录&#xff0c;在一个域名下部署多套项目时&#xff0c;若是多商户模式项目会出现跳转路径问题。 修改 \manystore\library\Auth.php 文件的 getSidebar 方法 // 1 改为&#xff1a; $v[url] isset($v[url]) && $v[url] ? $v[url] :…

霍尼C200系统CC-TUIO31通用输入输出模块电厂用

霍尼C200系统CC-TUIO31通用输入输出模块电厂用,CC-TUIO31技术参数,CC-TUIO31说明书,霍尼韦尔官网,霍尼韦尔代理商,Honeywell官网,Honeywell代理商, gnote: , titlecolor: , description: 易于维护&#xff1a;模块化设计&#xff0c;便于安装、维护和更换&#xff0c;减少停机时…

JavaSE

线程 1. 区分程序、进程、线程 程序&#xff1a;为实现某种功能&#xff0c;使用计算机语言编写的一系列指令的集合。 进程&#xff1a;是运行中的程序&#xff08;如运行中的原神&#xff09;进程是操作系统进行资源分配的最小单位。 线程&#xff1a;进程可以进一步细化为线…

斯坦福UE4 C++课学习补充25:AI感知组件

文章目录 一、引入感知组件并绑定委托二、优化角色旋转 一、引入感知组件并绑定委托 PawnSensingComponent是UE中用于感知其他 Pawn&#xff08;或 Actor&#xff09;存在的一个组件&#xff0c;常用于 AI 角色的视觉、听觉等感知功能。它为 AI 提供了基础的感知能力&#xff…

关于WPF(Windows Presentation Foundation)中Grid控件

本文将从Grid控件的基础概念开始&#xff0c;逐步深入探讨其特性、用法、实例代码&#xff0c;以及最佳实践。 1. WPF和布局简介 WPF是一种用于构建Windows桌面应用程序的UI框架&#xff0c;它通过XAML&#xff08;Extensible Application Markup Language&#xff09;使开…

PDF编辑不求人!4款高效工具,内容修改从此变得简单又快捷

咱们现在生活在一个数字时代&#xff0c;PDF文件可不就是工作、学习还有日常生活中经常要用的东西嘛。但遇到那些需要改动的PDF文件&#xff0c;是不是就觉得有点头疼啊&#xff1f; 因为传统的PDF文件真的不好编辑&#xff0c;这确实挺烦人的。不过呢&#xff0c;我今天要给你…

文本语义检索系统的搭建过程,涵盖了召回、排序以及Milvus召回系统、短视频推荐等相关内容

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下本文详细介绍了文本语义检索系统的搭建过程&#xff0c;涵盖了召回、排序以及Milvus召回系统的相关内容。通过使用PyTorch框架&#xff0c;我们提供了样例代码&#xff0c;以帮助读者更好地理解和实践。该系统具有广…

systemd实现seatunnel自动化启停

在 systemd 中,您可以通过配置服务单元文件来设置服务在失败或退出后自动重启。这对于确保关键服务在意外退出时能够自动恢复运行非常有用。下面是实现 systemd 自动重启服务的步骤: 通用操作 1. 创建或编辑服务单元文件 假设服务单元文件位于 /etc/systemd/system/my-ser…

深入解析Vue中的双向数据绑定机制

文章目录 一、双向数据绑定的概念单向绑定与双向绑定的区别双向绑定的实例 二、双向绑定的原理MVVM架构ViewModel的工作原理 三、Vue中的双向绑定实现双向绑定流程实现双向绑定的关键代码 一、双向数据绑定的概念 单向绑定与双向绑定的区别 单向绑定是将模型&#xff08;Mode…