机器学习 | 基于wine数据集的KMeans聚类和PCA降维案例

news2024/11/15 10:29:39

KMeans聚类:K均值聚类是一种无监督的学习算法,它试图根据数据的相似性对数据进行聚类。无监督学习意味着不需要预测结果,算法只是试图在数据中找到模式。在k均值聚类中,我们指定希望将数据分组到的聚类数。该算法将每个观察随机分配到一个集合,并找到每个集合的质心。然后,该算法通过两个步骤进行迭代:将数据点重新分配到质心最近的聚类。计算每个簇的新质心。重复这两个步骤,直到集群内的变化不能进一步减少。聚类内偏差计算为数据点与其各自聚类质心之间的欧几里得距离之和。

在本文中,我们将对葡萄酒数据集进行聚类,并在使用PCA进行降维后对其进行可视化。

导入所需库

我们将首先导入一些有用的Python库,如Pandas,Seaborn,Matplotlib和SKlearn,以执行复杂的计算任务。

import pandas as pd
import seaborn as sns 
import matplotlib.pyplot as plt 
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_wine
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

导入数据集

这些数据是对生长在意大利同一地区但来自三个不同品种的葡萄酒进行化学分析的结果。分析确定了三种葡萄酒中每种葡萄酒中13种成分的含量。

df = load_wine(as_frame=True)
df = df.frame
df.head()

输出

在这里插入图片描述

因为我们在这里做的是无监督学习。因此,我们从数据集中删除目标Customer_Segment列。

df.drop('target', axis =1, inplace=True)
 
# Check the data informations
df.info()

输出

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 178 entries, 0 to 177
Data columns (total 13 columns):
 #   Column                        Non-Null Count  Dtype  
---  ------                        --------------  -----  
 0   alcohol                       178 non-null    float64
 1   malic_acid                    178 non-null    float64
 2   ash                           178 non-null    float64
 3   alcalinity_of_ash             178 non-null    float64
 4   magnesium                     178 non-null    float64
 5   total_phenols                 178 non-null    float64
 6   flavanoids                    178 non-null    float64
 7   nonflavanoid_phenols          178 non-null    float64
 8   proanthocyanins               178 non-null    float64
 9   color_intensity               178 non-null    float64
 10  hue                           178 non-null    float64
 11  od280/od315_of_diluted_wines  178 non-null    float64
 12  proline                       178 non-null    float64
dtypes: float64(13)
memory usage: 18.2 KB

数据标准化

scaler =StandardScaler()

features =scaler.fit(df)
features =features.transform(df)

# Convert to pandas Dataframe
scaled_df =pd.DataFrame(features,columns=df.columns)
# Print the scaled data
scaled_df.head(2)

输出

在这里插入图片描述
一般来说,K-Means需要未标记的数据才能运行。
因此,使用没有标签的数据来执行K-means聚类。

X=scaled_df.values

肘部方法用于确定聚类的数量

wcss = {} 
for i in range(1, 11): 
	kmeans = KMeans(n_clusters = i, init = 'k-means++', random_state = 42)
	kmeans.fit(X) 
	wcss[i] = kmeans.inertia_
	
plt.plot(wcss.keys(), wcss.values(), 'gs-')
plt.xlabel("Values of 'k'")
plt.ylabel('WCSS')
plt.show()

在这里插入图片描述
从上图中我们可以看到,在k=3时,它像一个肘部一样转动。因此,我们可以说给定数据集的正确聚类数是3。

KMeans聚类

让我们对n_clusters=3执行KMeans聚类。

kmeans=KMeans(n_clusters=3)
kmeans.fit(X)

各个聚类中心坐标:

kmeans.cluster_centers_

输出

array([[ 0.16490746,  0.87154706,  0.18689833,  0.52436746, -0.07547277,
        -0.97933029, -1.21524764,  0.72606354, -0.77970639,  0.94153874,
        -1.16478865, -1.29241163, -0.40708796],
       [-0.92607185, -0.39404154, -0.49451676,  0.17060184, -0.49171185,
        -0.07598265,  0.02081257, -0.03353357,  0.0582655 , -0.90191402,
         0.46180361,  0.27076419, -0.75384618],
       [ 0.83523208, -0.30380968,  0.36470604, -0.61019129,  0.5775868 ,
         0.88523736,  0.97781956, -0.56208965,  0.58028658,  0.17106348,
         0.47398365,  0.77924711,  1.12518529]])

labels_每个样本所属的聚类的索引。

kmeans.labels_

输出

array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0])

应用PCA降维

主成分分析是一种将高维数据转换为低维数据,同时保留尽可能多的信息的技术。

  • 它用于解释和可视化数据。
  • 变量的数量减少,这简化了进一步的分析。

然后,我们可以查看PCA分量,即特征空间中的主轴,它们表示数据集中最大方差的方向。这些分量按explained_variance_排序。
使用主成分分析(PCA)将数据集从15个特征最小化为2个特征。

pca=PCA(n_components=2)
 
reduced_X=pd.DataFrame(data=pca.fit_transform(X),columns=['PCA1','PCA2'])
 
#Reduced Features
reduced_X.head()

输出

在这里插入图片描述
使用PCA减少聚类中心

centers=pca.transform(kmeans.cluster_centers_)
 
# reduced centers
centers

输出

array([[-2.72003575, -1.12565126],
       [-0.03695661,  1.77223945],
       [ 2.2761936 , -0.93205403]])

绘制基于PCA 1和PCA 2的聚类图


plt.figure(figsize=(7,5))
 
# Scatter plot
plt.scatter(reduced_X['PCA1'],reduced_X['PCA2'],c=kmeans.labels_)
plt.scatter(centers[:,0],centers[:,1],marker='x',s=100,c='red')
plt.xlabel('PCA1')
plt.ylabel('PCA2')
plt.title('Wine Cluster')
plt.tight_layout()

在这里插入图片描述

PCA 1和PCA 2对聚类的影响

如果我们真的想减少数据集的大小,主成分的最佳数量要比原始数据集中的变量数量少得多。

pca.components_

输出

array([[ 0.1443294 , -0.24518758, -0.00205106, -0.23932041,  0.14199204,
         0.39466085,  0.4229343 , -0.2985331 ,  0.31342949, -0.0886167 ,
         0.29671456,  0.37616741,  0.28675223],
       [-0.48365155, -0.22493093, -0.31606881,  0.0105905 , -0.299634  ,
        -0.06503951,  0.00335981, -0.02877949, -0.03930172, -0.52999567,
         0.27923515,  0.16449619, -0.36490283]])

基于PCA1-2特征的热力图

component_df=pd.DataFrame(pca.components_,index=['PCA1',"PCA2"],columns=df.columns)
# Heat map
sns.heatmap(component_df)
plt.show()

在这里插入图片描述

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

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

相关文章

四大消息队列:Kafka、ActiveMQ、RabbitMQ、RocketMQ对比

四大消息队列&#xff1a;Kafka、ActiveMQ、RabbitMQ、RocketMQ对比 1. 社区活跃度2. 持久化消息3. 技术实现4. 高并发性能5. RabbitMQ与Kafka对比 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在软件开发中&#xff0c;消息队列&#xf…

【Redis】Redis数据结构——Hash 哈希

哈希 命令hsethgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloat命令小结 内部编码使用场景缓存⽅式对⽐ ⼏乎所有的主流编程语⾔都提供了哈希&#xff08;hash&#xff09;类型&#xff0c;它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中&#…

Python furl库:一键搞定复杂URL操作

更多Python学习内容&#xff1a;ipengtao.com 在Web开发和数据处理的过程中&#xff0c;URL的解析、修改和构建是不可避免的操作。然而&#xff0c;直接操作URL字符串不仅繁琐&#xff0c;而且容易出错。Python的furl库提供了一种简单且强大的方法来处理URL&#xff0c;使得URL…

简易的 Websocket + 心跳机制 + 尝试重连

文章目录 演示大纲基础 WebSocket前端: 添加心跳机制前端: 尝试重新连接历史代码 还没有写完&#xff0c;bug 是有的&#xff0c;我在想解决办法了… 演示 大纲 基础的 webSocket 连接前后端&#xff1a;添加心跳机制后端无心跳反应&#xff0c;前端尝试重新连接设置重新连接…

Java 日常反常识踩坑

作者&#xff1a;若渝 本文主要是日常业务开发中自身碰到过跟常识不一致的坑&#xff0c;问题虽然基础&#xff0c;但却可能造成比较大的线上问题。 一、转 BigDecimal 类型时精度丢失 public class Test { public static void main(String[] args) { BigDecimal bi…

算法-分隔链表

一、题目描述 (一) 题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。 (二) 示例 示例 1&#xff1a; 输入&#xff1a;…

用Python实现9大回归算法详解——07. 支持向量机回归算法

1. 支持向量机回归的基本概念 支持向量机回归&#xff08;Support Vector Regression, SVR&#xff09;是支持向量机&#xff08;SVM&#xff09;的一个应用&#xff0c;主要用于回归任务。与分类任务中的 SVM 类似&#xff0c;SVR 通过找到一个最大化边界&#xff08;即支持向…

[WUSTCTF2020]spaceclub

上sublime txt 每一行的长短对应一个二进制位&#xff0c;长空格是1&#xff0c;短空格是0&#xff0c;全部替换掉得到 上python脚本 import binasciiwith open(attachment_5.txt, r) as file:lines file.readlines() # 逐行读取文本内容output # 初始化输出字符串# 遍历…

vscode 写了未定义的方法不报错,配置全局ESLint

最近接触了一个旧的vue2的项目&#xff0c;里面没有ts和eslint配置 在正在维护的页面里复制了其他页面的一个方法&#xff0c;方法里面包含lodash的cloneDeep&#xff0c;cloneDeep在这个页面并没有引入&#xff0c;但是vscode却没有提示&#xff0c;很不友好&#xff0c;容易…

JUC阻塞队列(五):SynchronousQueue

1、SynchronousQueue介绍 SynchronousQueue与前边的其他几个阻塞队列的差异是挺大的&#xff0c;在一般逻辑中队列是一个用 来存储数据的中间容器&#xff08;前边几个阻塞队列也是用来存放数据的&#xff09;&#xff0c;但SynchronousQueue 却不是用来存放数据的&#xff0c;…

自动控制——用描述函数法分析非线性系统的稳定性与自激振荡

用描述函数法分析非线性系统的稳定性与自激振荡 引言 在控制系统中&#xff0c;非线性系统的稳定性和自激振荡&#xff08;self-oscillation&#xff09;问题往往较线性系统更为复杂。为了分析这些问题&#xff0c;描述函数法&#xff08;Describing Function Method&#xf…

QtWebEngineView加载本地网页

直接加载放在exe同级目录下的资源是不行的&#xff0c;需要把资源通过qrc放到exe里面&#xff0c;然后通过类似qrc:/robotHtml/index.html这样的路径加载才行。 mWebView new QWebEngineView(parent);// mWebView->load(QUrl::fromLocalFile("./robotHtml/index.html&…

Vue3集成高德离线地图实践

1. 离线地图效果预览 2. 地图下载器下载离线地图 根据需要选择地图&#xff0c;我这边选择高德地图&#xff0c;层级选择0-15级别即可&#xff0c;进行下载 3. 放到nginx内网服务器 注意配置允许跨域 4. Vue3核心代码 // main.js // 初始化vue-amap initAMapApiLoader({o…

联想LJ2405打印机清零方法

联想LJ2405D_LJ2455D_LJ2605D硒鼓清零方法 在设备待机状态下&#xff0c;打开前盖&#xff0c;然后按住开始键不松手&#xff0c;直到所有指示灯全部亮起后再松开手&#xff0c;然后将硒鼓取出再装回&#xff0c;盖上前盖&#xff0c;清零操作完成。 联想LJ2405打印机碳粉清零…

编程学习之路:如何克服挫折感,成为更好的自己

目录 编程学习之路&#xff1a;如何克服挫折感&#xff0c;成为更好的自己 一、小瓜有话说 1、学习的广度可以带动深度 2、清空大脑和清空代码都是解决问题的方式 ①清空大脑&#xff1a;睡个觉&#xff0c;拉个屎&#xff0c;吃顿饭。 ②清空代码&#xff1a;换一种思维…

花钱买不到系列-深刻理解进程地址空间

花钱买不到系列—linux虚拟地址空间-CSDN博客https://blog.csdn.net/weixin_49529507/article/details/141272458?spm1001.2014.3001.5501 在上一篇文章中&#xff0c;引出了虚拟地址这块&#xff0c;也用大富翁给儿子们画饼的例子解释&#xff0c;通过大富翁的例子&…

内存管理篇-03物理内存管理-32位

正片从现在开始了。 1.结构体关联 当DDR初始化后&#xff0c;整个内存就可以访问了。但是需要合理的管理&#xff0c;防止内存碎片以及安全相关的问题。因此需要对物理内存进行严格的管理。 物理内存分为&#xff1a;页&#xff0c; 分区&#xff0c;内存节点。DMA需要连续的内…

配置PXE预启动执行环境:Kickstart自动化无人值守安装

文章目录 实现 Kickstart 无人值守安装1. 安装Kickstart和配置应答文件&#xff08;图形化界面&#xff09;2. 配置 PXE 菜单支持 Kickstart 无人值守安装3. 验证 Kickstart 无人值守安装4. 拓展&#xff1a;命令行配置应答文件&#xff08;命令行界面&#xff09; 实现 Kickst…

猜数3次-python

题目要求&#xff1a; 定一个数字&#xff08;1-10&#xff0c;随机产生&#xff0c;通过3次判断来猜出数字&#xff09; 数字随机产生&#xff0c;范围1-10有三次机会猜测数字&#xff0c;通过3层嵌套判断实现每次猜不中会提示大了或者小了 ps&#xff1a;补充随机函数 imp…

client网络模块的开发和client与server端的部分联动调试

客户端网络模块的开发 我们需要先了解socket通信的流程 socket通信 server端的流程 client端的流程 对于closesocket()函数来说 closesocket()是用来关闭套接字的,将套接字的描述符从内存清除,并不是删除了那个套接字,只是切断了联系,所以我们如果重复调用,不closesocket()…