多元统计分析课程论文-聚类效果评价

数据集来源:Unsupervised Learning on Country Data (kaggle.com)

代码参考:Clustering: PCA| K-Means - DBSCAN - Hierarchical | | Kaggle

基于特征合成降维和主成分分析法降维的国家数据集聚类效果评价

目录

1.特征合成降维

2.PCA降维

3.K-Means聚类

3.1 对特征合成降维的数据聚类分析

3.2 对PCA降维的数据聚类分析


        摘要:本文主要探讨了特征合成降维和主成分分析法(PCA)降维在K-Means聚类中的效果评价。数据来源于HELP国际人道主义组织提供的168个国家的社会经济和健康领域的数据集,通过特征合成和PCA方法进行降维处理,再用K-Means聚类分析进行聚类,并使用轮廓系数对两种降维方法的数据集聚类效果进行评价。结果显示,特征合成降维的数据集的聚类效果优于PCA降维的数据集。尽管PCA降维保留了95.8%的原始信息,但其聚类效果较差,可能是由于数据失去原有结构等原因。

数据集变量及其解释

变量名

描述

country

国家名称

child_mort

每1000例活产婴儿中,5岁以下儿童死亡人数

exports

人均商品和服务出口。以占人均GDP的百分比给出

health

人均医疗总支出。以占人均GDP的百分比给出

imports

人均进口商品和服务。以占人均GDP的百分比给出

Income

人均净收入

Inflation

通货膨胀:衡量国内生产总值的年增长率

life_expec

寿命:按照目前的死亡率模式,新生儿的平均寿命

total_fer

按当前的年龄-生育率,每个妇女将生下的子女数量

gdpp

人均国内生产总值。以国内生产总值除以总人口计算

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
pd.options.display.float_format = '{:.2f}'.format
import warnings
warnings.filterwarnings('ignore')from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from mpl_toolkits.mplot3d import Axes3Dimport plotly.express as px
import kaleidodata = pd.read_csv(r'F:\Jupyter Files\Practice\kaggle-聚类\Country-data.csv')
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
ut = np.triu(data.corr())
lt = np.tril(data.corr())
colors = ['#FF781F','#2D2926']
fig,ax = plt.subplots(nrows = 1, ncols = 2,figsize = (15,5))
plt.subplot(1,2,1)
sns.heatmap(data.corr(),cmap = colors,annot = True,cbar = 'True',mask = ut);
plt.title('相关系数矩阵:上三角格式');plt.subplot(1,2,2)
sns.heatmap(data.corr(),cmap = colors,annot = True,cbar = 'True',mask = lt);
plt.title('相关矩阵:下三角格式');

1.特征合成降维

变量合成规则表

类别

合并变量

健康类

child_mort,Health, life_expecc, total_fer

贸易类

exports, imports

金融类

Income, Inflation, gdpp

df1 = pd.DataFrame()
df1['健康类'] = (data['child_mort'] / data['child_mort'].mean()) + (data['health'] / data['health'].mean()) +(data['life_expec'] / data['life_expec'].mean()) + (data['total_fer'] / data['total_fer'].mean())
df1['贸易类'] = (data['imports'] / data['imports'].mean()) + (data['exports'] / data['exports'].mean())
df1['经济类'] = (data['income'] / data['income'].mean()) + (data['inflation'] / data['inflation'].mean()) + (data['gdpp'] / data['gdpp'].mean())
fig,ax = plt.subplots(nrows = 1,ncols = 1,figsize = (5,5))
plt.subplot(1,1,1)
sns.heatmap(df1.describe().T[['mean']],cmap = 'Oranges',annot = True,fmt = '.2f',linecolor = 'black',linewidths = 0.4,cbar = False);
plt.title('Mean Values');
fig.tight_layout(pad = 4)

col = list(df1.columns)
numerical_features = [*col]
fig, ax = plt.subplots(nrows = 1,ncols = 3,figsize = (12,4))
for i in range(len(numerical_features)):plt.subplot(1,3,i+1)sns.distplot(df1[numerical_features[i]],color = colors[0])title = '变量 : ' + numerical_features[i]plt.title(title)
plt.show()

#归一化处理
from sklearn.preprocessing import MinMaxScaler,StandardScaler
mms = MinMaxScaler() # Normalization
ss = StandardScaler() # Standardization
df1['健康类'] = mms.fit_transform(df1[['健康类']])
df1['贸易类'] = mms.fit_transform(df1[['贸易类']])
df1['经济类'] = mms.fit_transform(df1[['经济类']])
df1.insert(loc = 0, value = list(data['country']), column = 'Country')
df1.head()
Country健康类贸易类经济类
0Afghanistan0.630.140.08
1Albania0.130.200.09
2Algeria0.180.190.21
3Angola0.660.280.24
4Antigua and Barbuda0.120.280.15

2.PCA降维

col = list(data.columns)
col.remove('country')
categorical_features = ['country']
numerical_features = [*col]
print('Categorical Features :',*categorical_features)#分类型变量
print('Numerical Features :',*numerical_features)#数据型变量
Categorical Features : country
Numerical Features : child_mort exports health imports income inflation life_expec total_fer gdpp
fig, ax = plt.subplots(nrows = 3,ncols = 3,figsize = (15,15))
for i in range(len(numerical_features)):plt.subplot(3,3,i+1)sns.distplot(data[numerical_features[i]],color = colors[0])title =  numerical_features[i]
plt.show()

#对health变量做标准化处理,对其余变量进行归一化处理
df2 = data.copy(deep = True)
col = list(data.columns)
col.remove('health'); col.remove('country')
df2['health'] = ss.fit_transform(df2[['health']]) # Standardization
for i in col:df2[i] = mms.fit_transform(df2[[i]]) # Normalization
df2.drop(columns = 'country',inplace = True) 

利用 SPSS 软件对处理后的数据进行检验,由表3得,KMO值为 0.678(>0.5),达到主成分分析的标准,且 Bartlett检验显著性水平值为 0.000 小于 0.05,说明样本数据适宜做主成分分析。

from sklearn.decomposition import PCA
pca = PCA()
pca_df2 = pd.DataFrame(pca.fit_transform(df2))
pca.explained_variance_
array([1.01740511, 0.13090418, 0.03450018, 0.02679822, 0.00979752,0.00803398, 0.00307055, 0.00239976, 0.00179388])
fig,ax = plt.subplots(nrows = 1,ncols = 1,figsize = (10,5),dpi=80)
plt.step(list(range(1,10)), np.cumsum(pca.explained_variance_ratio_))
# plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('主成分个数')
plt.ylabel('主成分累计贡献率')
plt.show()

3.K-Means聚类

m1 = df1.drop(columns = ['Country']).values # Feature Combination : Health - Trade - Finance
m2 = pca_df2.values # PCA Data
3.1 对特征合成降维的数据聚类分析
sse = {};sil = [];kmax = 10
fig = plt.subplots(nrows = 1, ncols = 2, figsize = (20,5))# Elbow Method 肘部法则:
plt.subplot(1,2,1)
for k in range(1, 10):kmeans = KMeans(n_clusters=k, max_iter=1000).fit(m1)sse[k] = kmeans.inertia_ # Inertia: Sum of distances of samples to their closest cluster center
sns.lineplot(x = list(sse.keys()), y = list(sse.values()));
plt.title('Elbow Method')
plt.xlabel("k : Number of cluster")
plt.ylabel("Sum of Squared Error")
plt.grid()# Silhouette Score Method
plt.subplot(1,2,2)
for k in range(2, kmax + 1):kmeans = KMeans(n_clusters = k).fit(m1)labels = kmeans.labels_sil.append(silhouette_score(m1, labels, metric = 'euclidean'))
sns.lineplot(x = range(2,kmax + 1), y = sil);
plt.title('Silhouette Score Method')
plt.xlabel("k : Number of cluster")
plt.ylabel("Silhouette Score")
plt.grid()plt.show()

model = KMeans(n_clusters = 3,max_iter = 1000,algorithm="elkan")
model.fit(m1)
cluster = model.cluster_centers_
centroids = np.array(cluster)
labels = model.labels_
data['Class'] = labels; df1['Class'] = labelsfig = plt.figure(dpi=100)
ax = Axes3D(fig)
x = np.array(df1['健康类'])
y = np.array(df1['贸易类'])
z = np.array(df1['经济类'])
ax.scatter(centroids[:,0],centroids[:,1],centroids[:,2],marker="X", color = 'b')
ax.scatter(x,y,z,c = y)
plt.title('健康类-贸易类-经济类数据聚类结果可视化')
ax.set_xlabel('健康类')
ax.set_ylabel('贸易类')
ax.set_zlabel('经济类')
plt.show();

fig, ax = plt.subplots(nrows = 1, ncols = 2, figsize = (15,5))
plt.subplot(1,2,1)
sns.boxplot(x = 'Class', y = 'child_mort', data  = data, color = '#FF781F');
plt.title('child_mort vs Class')
plt.subplot(1,2,2)
sns.boxplot(x = 'Class', y = 'income', data  = data, color = '#FF781F');
plt.title('income vs Class')
plt.show()

df1['Class'].loc[df1['Class'] == 0] =  'Might Need Help'
df1['Class'].loc[df1['Class'] == 1] ='No Help Needed'
df1['Class'].loc[df1['Class'] == 2] = 'Help Needed'fig = px.choropleth(df1[['Country','Class']],locationmode = 'country names',locations = 'Country',title = 'Needed Help Per Country (World)',color = df1['Class'],  color_discrete_map = {'Help Needed':'Red','No Help Needed':'Green','Might Need Help':'Yellow'})
fig.update_geos(fitbounds = "locations", visible = True)
fig.update_layout(legend_title_text = 'Labels',legend_title_side = 'top',title_pad_l = 260,title_y = 0.86)
fig.show(engine = 'kaleido')

3.2 对PCA降维的数据聚类分析
sse = {};sil = [];kmax = 10
fig = plt.subplots(nrows = 1, ncols = 2, figsize = (20,5))# Elbow Method 肘部法则 :
plt.subplot(1,2,1)
for k in range(1, 10):kmeans = KMeans(n_clusters=k, max_iter=1000).fit(m2)sse[k] = kmeans.inertia_ # Inertia: Sum of distances of samples to their closest cluster center
sns.lineplot(x = list(sse.keys()), y = list(sse.values()));
plt.title('Elbow Method')
plt.xlabel("k : Number of cluster")
plt.ylabel("Sum of Squared Error")
plt.grid()# Silhouette Score Method
plt.subplot(1,2,2)
for k in range(2, kmax + 1):kmeans = KMeans(n_clusters = k).fit(m2)labels = kmeans.labels_sil.append(silhouette_score(m2, labels, metric = 'euclidean'))
sns.lineplot(x = range(2,kmax + 1), y = sil);
plt.title('Silhouette Score Method')
plt.xlabel("k : Number of cluster")
plt.ylabel("Silhouette Score")
plt.grid()plt.show()

model = KMeans(n_clusters = 3,max_iter = 1000,algorithm="elkan")
model.fit(m2)
cluster = model.cluster_centers_
centroids = np.array(cluster)
labels = model.labels_
data['Class'] = labels; pca_df2['Class'] = labelsfig = plt.figure(dpi=100)
ax = Axes3D(fig)
ax.scatter(centroids[:,0],centroids[:,1],centroids[:,2],marker="X", color = 'b')
plt.title('PCA降维数据聚类结果可视化')
ax.set_xlabel('第一主成分')
ax.set_ylabel('第二主成分')
ax.set_zlabel('第三主成分')
ax.scatter(x,y,z,c = y)
plt.show();

fig, ax = plt.subplots(nrows = 1, ncols = 2, figsize = (15,5))
plt.subplot(1,2,1)
sns.boxplot(x = 'Class', y = 'child_mort', data  = data, color = '#FF781F');
plt.title('child_mort vs Class')
plt.subplot(1,2,2)
sns.boxplot(x = 'Class', y = 'income', data  = data, color = '#FF781F');
plt.title('income vs Class')
plt.show()

pca_df2['Class'].loc[pca_df2['Class'] == 0] = 'Might Need Help'
pca_df2['Class'].loc[pca_df2['Class'] == 1] = 'No Help Needed'
pca_df2['Class'].loc[pca_df2['Class'] == 2] = 'Help Needed' fig = px.choropleth(pca_df2[['Country','Class']],locationmode = 'country names',locations = 'Country',title = 'Needed Help Per Country (World)',color = pca_df2['Class'],  color_discrete_map = {'Help Needed':'Red','Might Need Help':'Yellow','No Help Needed': 'Green'})
fig.update_geos(fitbounds = "locations", visible = True)
fig.update_layout(legend_title_text = 'Labels',legend_title_side = 'top',title_pad_l = 260,title_y = 0.86)
fig.show(engine = 'kaleido')

3.3 轮廓系数效果评价

        轮廓系数是一种用于评估聚类效果的指标。它是对每个样本来定义的,它能够同时衡量样本与其自身所在的簇中的其他样本的相似度a和样本与其他簇中的样本的相似度b,其中,a等于样本与同一簇中所有其他点之间的平均距离;b等于样本与下一个最近的簇中得所有点之间的平均距离。单个样本的轮廓系数计算为:

根据聚类的要求“簇内差异小,簇外差异大”,当轮廓系数越接近1表示样本与自己所在的簇中的样本很相似,并且与其他簇中的样本不相似。如果一个簇中的大多数样本具有比较高的轮廓系数,则簇会有较高的总轮廓系数,即整个数据集的平均轮廓系数越高,则聚类效果是合适的。

#特征合成降维的数据集
cluster_1=KMeans(n_clusters=3,random_state=0).fit(m1)
silhouette_score(m1,cluster_1.labels_) #0.452
#PCA降维的数据集
cluster_2=KMeans(n_clusters=3,random_state=0).fit(m2)
silhouette_score(m2,cluster_2.labels_) #0.384
两种降维方法数据的轮廓系数

特征合成降维的数据集

PCA降维的数据集

轮廓系数

0.452

0.384

ps:低价出课程论文-多元统计分析论文、R语言论文、stata计量经济学课程论文(论文+源代码+数据集)

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

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

相关文章

集结低代码/零代码行业大咖,2024年领域内首场重磅峰会火热开启!

低代码/零代码技术是一种创新的软件开发方法,旨在简化程序开发过程,使得即便是非专业开发者也能快速构建和部署应用程序。通过图形化界面和拖拽式操作,用户可以无需编写复杂的代码,就能完成应用程序的设计、开发和部署&#xff0c…

tsmc12:boundary cell/tap cell的align VIA0 grid

更多学习内容请关注「拾陆楼」知识星球 拾陆楼知识星球入口 往期文章链接: tsmc12:via0的spacing问题(Via0.S.1) tsmc12 OD.L.5 DRC tsmc12:boundary cell注意事项

2024年【R1快开门式压力容器操作】考试及R1快开门式压力容器操作考试内容

题库来源:安全生产模拟考试一点通公众号小程序 R1快开门式压力容器操作考试参考答案及R1快开门式压力容器操作考试试题解析是安全生产模拟考试一点通题库老师及R1快开门式压力容器操作操作证已考过的学员汇总,相对有效帮助R1快开门式压力容器操作考试内…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Marquee组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Marquee组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Marquee组件 跑马灯组件,用于滚动展示一段单行文本,仅当…

在 Python 中,通过列表字典创建 DataFrame 时,若字典的 key 的顺序不一样以及部分字典缺失某些键,pandas 将如何处理?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ pandas 是一个快速、强大、灵活且易于使用的开源数据分析和处理工具,它是建立在 Python 编程语言之上的。 pandas 官方文档地址:https://pandas.pydata.org/ 在 Python 中&…

多模态基础--- word Embedding

1 word Embedding 原始的单词编码方式: one-hot,维度太大,不同单词之间相互独立,没有远近关系区分。 wordclass,将同一类单词编码在一起,此时丢失了类别和类别间的相关信息,比如class1和class3…

小游戏和GUI编程(7) | SimpleNN 界面源码解析

小游戏和GUI编程(7) | SimpleNN 界面源码解析 0. 简介 SimpleNN 是 AdamYuan 在高中一年级时用 1 天时间写出来的简易 CNN, 使用 SFML 做 UI, 用于交互式输入手写数字,这个数字被训练好的 CNN 网络执行推理得到识别结果, 它的运行效果如下: 这一篇我们…

java客运管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java客运管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&#…

安装Joplin Server私有化部署(docker)

安装Joplin Server私有化部署(docker) 前言: 老规矩官方文档链接 1. 首先拥有一个自己的云服务器(如果没有外网访问需求的话就随意吧) 安装docker安装方式 这里Joplin是使用PostgreSQL数据库的形式, 如果没有PostgreSQL库的话, Joplin默认使用的是SQLLite数据库 我这里使用的是…

Shiro-11-web 介绍

配置 将Shiro集成到任何web应用程序的最简单方法是在web.xml中配置一个Servlet ContextListener和过滤器,该Servlet了解如何读取Shiro的INI配置。 INI配置格式本身的大部分是在配置页面的INI部分中定义的,但是我们将在这里介绍一些额外的特定于web的部…

入门级10寸加固行业平板—EM-I10J

亿道信息以其坚固耐用的智能终端设备而闻名,近日发布了一款理想入门级 10 英寸加固平板电脑—I10J。 EM-I10J​​ 这是一款 10 英寸的平板电脑,主要运行 Windows 10操作系统,带有硬化塑料外壳,具有 IP65 防水防尘功能和 MIL-STD 8…

【Java EE初阶十七】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制,都是在保证 tcp 的可靠性; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了); 滑动窗口,就让可靠传输对性能的影响,更…

【大模型 知识图谱】ChatKBQA:KBQA知识图谱问答 + 大模型

ChatKBQA:KBQA知识图谱问答 大模型 提出背景传统方法处理流程ChatKBQA处理流程对比优势 总结ChatKBQA框架概览特征1:逻辑形式生成特征2:无监督实体和关系检索特征3:参数高效的微调特征4:GQoT 可解释的查询执行特征5&a…

实心陶瓷电阻器的基本原理?

什么是陶瓷电阻器? 陶瓷组合电阻器由精细研磨的绝缘体和导体的混合物组成,被压缩成圆柱形。连接端子,并在电阻器的外壳上涂上绝缘涂层。电阻根据绝缘体与导体混合物的比例进行控制。 陶瓷是一种优良的电绝缘体,也是一种极好的导热…

【Linux】---Linux下基本指令(2)

目录 一、指令详细介绍1.1 cat 指令1.2 echo 指令1.3 more 指令1.4 less 指令1.5 head 指令1.6 tail 指令1.7 date 指令1.8 cal 指令1.9 find 指令1.10 grep 指令1.11 zip/unzip 指令1.12 tar 指令1.13 uname –r 指令: 一、指令详细介绍 1.1 cat 指令 语法&#…

学习Android的第十六天

目录 Android 自定义 Adapter Adapter 接口 SpinnerAdapter ListAdapter BaseAdapter 自定义 BaseAdapter 参考文档 Android ListView 列表控件 ListView 的属性和方法 表头表尾分割线的设置 列表从底部开始显示 android:stackFromBottom 设置点击颜色 cacheColorH…

在SpringBoot中@PathVariable与@RequestParam的区别

PathVariable GetMapping("/{userId}")public R<User> getUserById(PathVariable Long userId) {return userService.getUserById(userId);} // 根据id获取一条数据 function getStudentDataByIdAndDisplayInput(id) {// 发送 AJAX 请求$.ajax({url: /dorm/st…

政安晨:【完全零基础】认知人工智能(二)【超级简单】的【机器学习神经网络】—— 底层算法

如果小伙伴第一次看到这篇文章&#xff0c;可以先浏览一下我这个系列的上一篇文章&#xff1a; 政安晨&#xff1a;【完全零基础】认知人工智能&#xff08;一&#xff09;【超级简单】的【机器学习神经网络】 —— 预测机https://blog.csdn.net/snowdenkeke/article/details/…

数码管扫描显示-单片机通用模板

数码管扫描显示-单片机通用模板 一、数码管扫描的原理二、display.c的实现1、void Display(void) 各模式界面定义数据2、void BackupRamToDisRam(void)从缓存区刷新显示映射Ram3、void FreshDisplay(void) 映射显示Ram到主控的IO口4、void LcdDisplay_8bit(void) 映射显示Ram到…

数据结构——单链表专题

目录 1. 链表的概念及结构2. 实现单链表初始化尾插头插尾删头删查找在指定位置之前插入数据在指定位置之后插入数据删除指定位之前的节点删除指定位置之后pos节点销毁链表 3. 完整代码test.cSList.h 4. 链表的分类 1. 链表的概念及结构 在顺序表中存在一定的问题&#xff1a; …