数据分析实战 | K-means算法——蛋白质消费特征分析

news2025/1/17 0:03:44

目录

一、数据及分析对象

二、目的及分析任务

三、方法及工具

四、数据读入

五、数据理解

六、数据准备

七、模型训练

​编辑 八、模型评价

九、模型调参与预测


一、数据及分析对象

txt文件——“protein.txt”,主要记录了25个国家的9个属性,主要属性如下:

(1)ID:国家的ID。

(2)Country(国家类别):该数据涉及25个欧洲国家肉类和其他食品之间的关系。

(3)关于肉类和其他食品的9个数据包括RedMeat(红肉)、WhiteMeat(白肉)、Eggs(蛋类)、Milk(牛奶)、Fish(鱼类)、Cereals(谷类)、Starch(淀粉类)、Nuts(坚果类)、Fr&Veg(水果和蔬菜)。

二、目的及分析任务

理解机器学习方法在数据分析中的应用——采用k-means方法进行聚类分析。

(1)将数据集导入后,在初始化阶段随机选择k个类簇进行聚类,确定初始聚类中心。

(2)以初始化后的分类模型为基础,通过计算每一簇的中心点重新确定聚类中心。

(3)迭代重复“计算距离——确定聚类中心——聚类”的过程。

(4)通过检验特定的指标来验证k-means模型聚类的正确性和合理性。

三、方法及工具

scikit-learn、pandas和matplotlib等Python工具包。

四、数据读入

import pandas as pd
protein=pd.read_table("D:\\Download\\JDK\\数据分析理论与实践by朝乐门_机械工业出版社\\第5章 聚类分析\\protein.txt",
                     sep='\t')
protein.head()

五、数据理解

对数据框protein进行探索性分析,这里采用的实现方式为调用pandas包中数据框(DataFrame)的describe()方法。

protein.describe()

除了describe()方法,还可以调用shape属性和pandas_profiling包对数据框进行探索性分析。

protein.shape
(25, 10)

六、数据准备

在进行不同国家蛋白质消费结果分析时,要把对信息分析有用的数据提取出来,即关于肉类和其他食品的9列。具体实现方式为调用pandas包中数据框的drop()方法,删除列名“Country”的数据。

sprotein=protein.drop(['Country'],axis=1)
sprotein.head()

将待聚类数据提取后,需要对该数据集进行以均值为中心的标准化处理,在此采用的是统计学中的Z-Score标准化方法。

from sklearn import preprocessing
sprotein_scaled=preprocessing.scale(sprotein)
sprotein_scaled
array([[ 0.08294065, -1.79475017, -2.22458425, -1.1795703 , -1.22503282,
         0.9348045 , -2.29596509,  1.24796771, -1.37825141],
       [-0.28297397,  1.68644628,  1.24562107,  0.40046785, -0.6551106 ,
        -0.39505069, -0.42221774, -0.91079027,  0.09278868],
       [ 1.11969872,  0.38790475,  1.06297868,  0.05573225,  0.06479116,
        -0.5252463 ,  0.88940541, -0.49959828, -0.07694671],
       [-0.6183957 , -0.52383718, -1.22005113, -1.2657542 , -0.92507375,
         2.27395937, -1.98367386,  0.32278572,  0.03621022],
       [-0.03903089,  0.96810416, -0.12419682, -0.6624669 , -0.6851065 ,
         0.19082957,  0.45219769, -1.01358827, -0.07694671],
       [ 0.23540507,  0.8023329 ,  0.69769391,  1.13303099,  1.68457011,
        -0.96233157,  0.3272812 , -1.21918427, -0.98220215],
       [-0.43543839,  1.02336124,  0.69769391, -0.86356267,  0.33475432,
        -0.71124003,  1.38907137, -1.16778527, -0.30326057],
       [-0.10001666, -0.82775116, -0.21551801,  2.38269753,  0.45473794,
        -0.55314536,  0.51465594, -1.06498727, -1.5479868 ],
       [ 2.49187852,  0.55367601,  0.33240914,  0.34301192,  0.42474204,
        -0.385751  ,  0.3272812 , -0.34540128,  1.33751491],
       [ 0.11343353, -1.35269348, -0.12419682,  0.07009624,  0.48473385,
         0.87900638, -1.29663317,  2.4301447 ,  1.33751491],
       [-1.38071781,  1.24438959, -0.03287563, -1.06465843, -1.19503691,
         0.73021139, -0.17238476,  1.19656871,  0.03621022],
       [ 1.24167025,  0.58130455,  1.61090584,  1.24794286, -0.62511469,
        -0.76703815,  1.20169663, -0.75659327, -0.69930983],
       [-0.25248108, -0.77249407, -0.03287563, -0.49009911, -0.26516381,
         0.42332173, -1.35909141,  0.63117972,  1.45067184],
       [-0.10001666,  1.57593211,  0.60637272,  0.90320726, -0.53512697,
        -0.91583314, -0.04746827, -0.65379528, -0.24668211],
       [-0.13050955, -0.88300824, -0.21551801,  0.88884328,  1.62457829,
        -0.86003502,  0.20236471, -0.75659327, -0.81246676],
       [-0.89283166,  0.63656164, -0.21551801,  0.31428395, -0.38514744,
         0.35822393,  1.0143219 , -0.55099728,  1.39409338],
       [-1.10628185, -1.15929368, -1.67665709, -1.75412962,  2.97439408,
        -0.48804755,  1.0143219 ,  0.83677571,  2.12961342],
       [-1.10628185, -0.44095155, -1.31137232, -0.86356267, -0.98506557,
         1.61368162, -0.73450896,  1.14516971, -0.75588829],
       [-0.83184589, -1.24217931,  0.14976676, -1.22266225,  0.81468882,
        -0.28345445,  0.88940541,  1.45356371,  1.73356417],
       [ 0.02195488, -0.0265234 ,  0.51505153,  1.08993904,  0.96466835,
        -1.18552405, -0.35975949, -0.85939127, -1.20851601],
       [ 0.99772718,  0.60893309,  0.14976676,  0.96066319, -0.59511878,
        -0.61824316, -0.9218837 , -0.34540128,  0.43225947],
       [ 2.30892121, -0.60672281,  1.61090584,  0.50101573,  0.00479935,
        -0.73913909,  0.26482296,  0.16858872, -0.47299597],
       [-0.16100243, -0.91063679, -0.76344517, -0.07354359, -0.38514744,
         1.05570042,  1.32661312,  0.16858872, -0.69930983],
       [ 0.47934814,  1.27201813,  1.06297868,  0.24246404, -0.26516381,
        -1.26922123,  0.57711418, -0.80799227, -0.19010364],
       [-1.65515377, -0.80012261, -1.5853359 , -1.0933864 , -1.10504919,
         2.19956187, -0.79696721,  1.35076571, -0.52957443]])

七、模型训练

在使用k-means算法对其数据集进行聚类之前,我们在初始化阶段产生一个随机的k值作为类簇的个数。在scikit-learn框架中,使用“决定系数’作为性能评估的分数(score),该参数可以判断不同分类情况的统计模型对数据的拟合能力。这里采用的实现方式是调用sklearn.cluster模块的k-means.fit().score()方法。

#K值得选择
from sklearn.cluster import KMeans
NumberOfClusters=range(1,20)
kmeans=[KMeans(n_clusters=i) for i in NumberOfClusters]
score=[kmeans[i].fit(sprotein_scaled).score(sprotein_scaled) for i in range(len(kmeans))]
score
[-225.00000000000003,
 -139.5073704483181,
 -110.40242709032155,
 -93.99077697163418,
 -77.34315775475405,
 -64.22779496320605,
 -52.68794493054983,
 -46.148487504020046,
 -41.95277071693863,
 -35.72656669867341,
 -30.429164116494334,
 -26.430420929243024,
 -22.402609200395787,
 -19.80060035995764,
 -16.86466531666006,
 -13.979313757304398,
 -11.450822978023083,
 -8.61897844282252,
 -6.704106008601115]

上面的输出结果为每一个kmeans(n_clusters=i)(1<=i<=19)的预测值,为更直观地观察每个值的变化情况,可绘制一个ROC曲线。具体实现方式是调用matplotlib包的pyplot()方法。

import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(NumberOfClusters,score)
plt.xlabel('Number of Clusters')
plt.ylabel('Score')
plt.title('Elbow Curve')
plt.show()

接着,随机设定聚类的数目为5,并以此为基础在数据矩阵上执行均值聚类,并查看模型预测结果,这里的具体实现方式是调用scikit-learn包的KMeans()方法和predict()方法,其中KMeans()方法需要设置的主要参数如下:

(1)algorithm使用默认值"auto",表示使用k-means中的elkan或full算法,由样本数据的稠密程度决定。

(2)n_clusters表示分类簇的数量。

(3)n_init表示运行该算法的尝试初始化次数。

(4)max_iter表示最大的迭代次数。

(5)verbose表示日志信息,这里使用默认“0”值,不输出日志信息。

myKMeans=KMeans(algorithm="auto",
               n_clusters=5,
               n_init=10,
               max_iter=200,
               verbose=0)
myKMeans.fit(sprotein_scaled)
y_kmeans=myKMeans.predict(sprotein)
print(y_kmeans)
[2 4 4 2 4 4 4 3 4 2 2 4 2 4 4 4 0 2 2 4 4 4 2 4 2]

通过以上分析,由确定的k=5,将数据集protein划分成5个类簇,类簇编号为0,1,2,3,4.接下来,显示每个样本所属的类簇编号。

protein["所隶属的类簇"]=y_kmeans
protein

 八、模型评价

可见,k-means算法可以完成相对应的聚类输出。接下来,引入轮廓系数对宣发聚类结果进行评价。这里采用的实现方式为调用Bio包Cluster模块的kcluster()方法,并调用silhouette_score()方法返回所有样本的轮廓系数,取值范围为[-1,1],轮廓系数值越大越好。

from sklearn.metrics import silhouette_score
silhouette_score(sprotein,y_kmeans)
0.2222236683250513
number=range(2,20)
myKMeans_list=[KMeans(algorithm="auto",
               n_clusters=i,
               n_init=10,
               max_iter=200,
               verbose=0) for i in number]
y_kmeans_list=[myKMeans_list[i].fit(sprotein_scaled).
               predict(sprotein_scaled) for i in range(len(number))]
score=[silhouette_score(sprotein,y_kmeans_list[i]) for i in range(len(number))]
score
[0.4049340501486218,
 0.31777138102456476,
 0.16996270462188423,
 0.21041645106099247,
 0.1943500298289292,
 0.16862742616667453,
 0.1868090290661263,
 0.08996856437394235,
 0.10531808817576255,
 0.13528249120860153,
 0.07381598489593617,
 0.09675173868153258,
 0.056460835203354785,
 0.10871862224667578,
 0.04670651599769748,
 0.03724019668260051,
 0.0074356180520073045,
 0.013165944671952217]
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.plot(number,score)
plt.xlabel("k值")
plt.ylabel("轮廓系数")

九、模型调参与预测

通过轮廓系数的分析,我们可以确定聚类中心的数量为2,并以此为基础在样本数据集protein上执行聚类。

estimator=KMeans(algorithm="auto",
               n_clusters=2,
               n_init=10,
               max_iter=200,
               verbose=0)
estimator.fit(sprotein_scaled)
y_pred=estimator.predict(sprotein_scaled)
print(y_pred)
[1 0 0 1 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 0 0 0 1 0 1]

 绘制聚类图:

x1=[]
y1=[]
x2=[]
y2=[]
for i in range(len(y_pred)):
    if y_pred[i]==0:
        x1.append(sprotein['RedMeat'][i])
        y1.append(sprotein['WhiteMeat'][i])
    if y_pred[i]==1:
        x2.append(sprotein['RedMeat'][i])
        y2.append(sprotein['WhiteMeat'][i])
plt.scatter(x1,y1,c="red")
plt.scatter(x2,y2,c="orange")
plt.show()

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

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

相关文章

3.30每日一题(多元函数微分学)

1、判断连续&#xff1a;再分界点的极限值等于该点的函数值&#xff1b; 如何求极限值&#xff1a; 初步判断&#xff1a;分母都为二次幂开根号&#xff0c;所以分母为一次幂&#xff1b;分子为二次&#xff0c;一般来说整体为0&#xff1b; 如何说明极限为零&#xff08;常用…

Git 命令详解

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 C技能系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream we…

【教3妹学编程-算法题】2923. 找到冠军 I

3妹&#xff1a;2哥2哥&#xff0c;你看到新闻了吗&#xff1f;襄阳健桥医院院长 公然“贩卖出生证明”&#xff0c; 真是太胆大包天了吧。 2哥 : 我也看到新闻了&#xff0c;7人被采取刑事强制措施。 就应该好好查查他们&#xff0c; 一查到底&#xff01; 3妹&#xff1a;真的…

华为ensp:为vlan配置ip

配置对应vlan的ip vlan1 interface Vlanif 1 进入vlan1 ip address 192.168.1.254 24配置IP为192.168.1.254 子网掩码为24位 这样就配置上ip了 vlan2 interface Vlanif 2 ip address 192.168.2.254 24 vlan3 interface Vlanif 3 ip address 192.168.3.254 24 查看结果 …

【C++入门】构造函数析构函数

目录 前言 1. 类的默认成员函数 2. 构造函数 2.1 什么是构造函数 2.2 构造函数的特性 3. 析构函数 3.1 什么是析构函数 3.2 析构函数的特性 前言 前边我们已经了解了类和对像的基本概念&#xff0c;今天我们将继续深入了解类。类有6个默认成员函数&#xff0c;即使类中什么都…

赛氪助力全国大学生数学竞赛山东赛区圆满举办

近日&#xff0c;全国大学生数学竞赛山东赛区比赛有序进行&#xff0c;赛氪已连续6年助力本项赛事蓬勃发展。在中国高等教育学会高校竞赛评估与管理体系研究专家工作组发布的《2022全国普通高校大学生竞赛分析报告》中&#xff0c;本赛事荣登观察目录。 全国大学生数学竞赛旨在…

Leetcode2834. 找出美丽数组的最小和

Every day a Leetcode 题目来源&#xff1a;2834. 找出美丽数组的最小和 解法1&#xff1a;贪心 从最小正整数 1 开始枚举&#xff0c;设当前数为 num&#xff0c;如果 nums 里没有 target - num&#xff0c;就说明可以添加 num&#xff0c;依次填满直到有 n 个数即可。 用…

2023年【危险化学品经营单位主要负责人】免费试题及危险化学品经营单位主要负责人证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年危险化学品经营单位主要负责人免费试题为正在备考危险化学品经营单位主要负责人操作证的学员准备的理论考试专题&#xff0c;每个月更新的危险化学品经营单位主要负责人证考试祝您顺利通过危险化学品经营单位主…

【2024提前批/秋招笔试汇总2】——大疆-嵌入式软件-2023.08.06

一、 单选题&#xff08;40分&#xff09; 1. 以下关于GPU的特点描述不准确的是&#xff1a; A.GPU无法使用共享内存结构&#xff0c;提高通信速度 B.GPU的并行数据处理可以大幅度提高运算能力 C.GPU使用高速全局内存可以进一步提升运算速度 D.GPU的计算能力比CPU强 2.下列关…

【PyQt】(自制类)处理鼠标点击逻辑

写了个自认为还算不错的类&#xff0c;用于简化mousePressEvent、mouseMoveEvent和mouseReleaseEvent中的鼠标信息。 功能有以下几点&#xff1a; 鼠标当前状态&#xff0c;包括鼠标左/中/右键和单击/双击/抬起鼠标防抖(仅超出一定程度时才判断鼠标发生了移动)&#xff0c;灵…

Java面向对象(进阶)-- 面向对象特征之三:多态性

文章目录 一、多态的形式和体现&#xff08;1&#xff09;为什么需要多态性(polymorphism)&#xff1f;&#xff08;2&#xff09; 对象的多态性 二、 多态的理解&#xff08;1&#xff09;如何理解多态性&#xff08;2&#xff09;Java中多态性的体现&#xff08;3&#xff09…

SpringMvc 常见面试题

1、SpringMvc概述 1.1、什么是Spring MVC &#xff1f;简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&am…

CentOs7 NAT模式连接网络

1.配置动态网络 1.1 检查主机网卡配置 检查主机的网络设置 进入控制面板&#xff0c;找到网络共享中心 查看适配器是否都已经开启 1.2 设置虚拟机的网络配置 打开虚拟机网络配置设置&#xff0c;对网卡VMnet8 进行设置 记住网关 全部选择应用&#xff0c;确定 1.3 设置…

操作系统(一)基础知识及操作系统启动

文章目录 前言前置基础知识计算机组成CPU磁盘内核中断、异常、系统调用局部性原理 启动操作系统计算机加电是如何正常执行服务的&#xff1f;开机自检BIOS&#xff08;Basic Input/Output System&#xff09;BootLoader 小结 前言 本文主要涉及操作系统的简介、硬件结构、内存…

从Hadoop到对象存储,抛弃Hadoop,数据湖才能重获新生?

Hadoop与数据湖的关系 1、Hadoop时代的落幕2、Databricks和Snowflake做对了什么3、Hadoop与对象存储&#xff08;OSD&#xff09;4、Databricks与Snowflake为什么选择对象存储5、对象存储面临的挑战 1、Hadoop时代的落幕 十几年前&#xff0c;Hadoop是解决大规模数据分析的“白…

C++17中std::optional的使用

模版类std::optional管理一个可选的(optional)存储值(contained value)&#xff0c;即可能存在也可能不存在的值。std::optional的一个常见用例是存储可能失败的函数的返回值。与其它方法相反(例如std::pair<T, bool>),std::optional可以很好地处理构造成本高昂的对象&am…

ETW HOOK原理探析

ETW HOOK研究 文章目录 ETW HOOK研究前言原理探究内核开启ETW日志HOOK ETW修改ETW日志上下文代理GetCpuClock函数寻找SSDT和SSDT Shadow 总结参考 前言 关于ETW是什么我就不多说了&#xff0c;可以通过微软的相关文档了解到。据网上得知这项技术最早被披露于2345的驱动中&…

Netty--ByteBuffer

2. ByteBuffer 有一普通文本文件 data.txt&#xff0c;内容为 1234567890abcd 使用 FileChannel 来读取文件内容 Slf4j public class ChannelDemo1 {public static void main(String[] args) {// FileChannel// 1. 输入输出流&#xff0c; 2. RandomAccessFile// try (F…

反转链表 --- 递归回溯算法练习三

目录 1. 分析题意 2. 分析算法原理 2.1. 递归思路&#xff1a; 1. 挖掘子问题&#xff1a; 3. 编写代码 3.1. step 1&#xff1a; 3.2. step 2&#xff1a; 3.3. step 3&#xff1a; 3.4. 递归代码&#xff1a; 1. 分析题意 力扣原题链接如下&#xff1a; 206. 反转链…

组件的设计原则

目录 插槽的基本概念 基础用法 具名插槽 使用场景 布局控制 嵌套组件 组件的灵活性 高级用法 作用域插槽 总结 前言 Vue 的 slot 是一项强大的特性&#xff0c;用于组件化开发中。它允许父组件向子组件传递内容&#xff0c;使得组件更加灵活和可复用。通过 slot&…