今天一个学姐拿了一篇论文,问我怎么去实现论文里的那个方法。简要的看了看,还是比较简单的。大体上就是将全国不同省份的经济数据做一个平行坐标轴可视化,流程就是先将数据标准化,然后PCA降维,然后再聚类,然后再用平行坐标可视化。我叭叭叭的讲了半天她还是不明白。让她用SPSS她不会,让她用Python,结果连代码和注释都搞不明白。。。各种问,问的头都大了两三个。。。实在是受不了就自己亲自写了一个。。。

PCA和聚类的基本原理《多元统计分析》这本书里讲的很明白,这里就不再赘述。话不多说,先上马,no code no bb。

from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import k_meansdef standard_pca_kmeans(file_path, sheetname, n_component, k, save=True):# 读取目标文件中相应的表df = pd.read_excel(file_path, sheet_name=sheetname)# 获取需要进行处理的数据,保留第一列,并转化为numpy数组data_useful = np.array(df.iloc[:, 1:])# 对数据进行标准化处理以进行PCA(相关阵法)scaler = StandardScaler().fit(data_useful)data_scaled = scaler.transform(data_useful)# 对数据进行PCA降维处理pca = PCA(n_components=n_component).fit(data_scaled)data_pca = np.dot(pca.components_, data_scaled.T).Tprint('当选取%s个主成分时,累计方差贡献率为%s' % (n_component, sum(pca.explained_variance_ratio_)))# 对降维后的数据进行聚类kmeans = k_means(data_pca, k)labels = kmeans[1]# 整合成一个表print(data_pca.shape)result = pd.DataFrame(data_pca, columns=['第%s主成分' % (i+1) for i in range(n_component)])result['类别'] = labelsresult.insert(0, 'index', df.iloc[:, 0])#print('前5行数据为:', result.head(5))if save:result.to_excel('结果.xlsx')return result, data_pca, data_scaledif __name__ == '__main__':path = '园区数据.xlsx'sheet_name = 'Sheet1'result, data_pca, data_scaled = standard_pca_kmeans(path, sheet_name, 6, 6)# 求各主成分与原始特征的相关系数,即因子负荷,可以用来解释各变量对各主成分的重要性corrcoef = []for i in range(len(data_pca.T)):each_corr = []for j in range(len(data_scaled.T)):each_corr.append(np.corrcoef(data_pca.T[i], data_scaled.T[j])[0][1])corrcoef.append(each_corr)print(np.array(corrcoef))

一、数据和任务

数据:数据来源为某示范区某年某月不同园区的财务指标:共17个园区,16个不同指标,如下所示(保险起见随便打个码吧哈哈):

问题和任务:用平行坐标图对十七个园区进行可视化展示,并对园区进行聚类表示。问题时指标过多而难以用这种方法去可视化,于是想到用先对16个指标进行PCA降维,然后利用K-means进行聚类。

二、流程

1、首先导入要用的python库:

from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import k_means

2、读取数据

# 读取目标文件中相应的表df = pd.read_excel(file_path, sheet_name=sheetname)# 获取需要进行处理的数据,保留第一列,并转化为numpy数组data_useful = np.array(df.iloc[:, 1:])

这里我们把数据部分摘出来,便于进行运算,最后再把第一列的园区类别插入,便于我们去观察处理

file_path为excel表格存放的位置;sheetname为对应的表名字

3、数据标准化

# 对数据进行标准化处理便于进行PCAscaler = StandardScaler().fit(data_useful)data_scaled = scaler.transform(data_useful)

因为不同特征之间的差别较大,所以进行标准化,用相关阵法

4、PCA降维

 # 对数据进行PCA降维处理pca = PCA(n_components=n_component).fit(data_scaled)data_pca = np.dot(pca.components_, data_scaled.T).Tprint('当选取%s个主成分时,累计方差贡献率为%s' % (n_component, sum(pca.explained_variance_ratio_)))

这里解释下PCA方法的参数。其中n_components为要保留的主成分个数,可以是int 1,2,3......等,也可以设置为‘mle’,系统会自动选择主成分个数。个人建议在维度和数据量不大的情况下手动设置,通过观察累积误差贡献率的大小来设置主成分个数。

注意用PCA训练数据后并不是直接返回结果,而是在模型的属性里获得我们想要的结果。这里pca.components_为分解出来的正交特征向量,并不是最总的结果,最终的变换Y=UX,U即为pca.components_。PCA的结果即为data_pca。方差贡献率pca.explained_variance_ratio_是一个1-D矩阵,里边是每个主成分的方差贡献率,我们要的是设置的主成分的贡献率之和,即累计方差贡献率,该值大于0.85即可。

如果我们想找出各原始变量对各主成分的重要性,则可以计算出每个主成分与每个变量(即特征)的相关系数,即因子负荷量,因子负荷量的绝对值越大,说明该变量对该主成分越重要。且不可将变换系数的大小来衡量变量对主成分的重要性:

# 求各主成分与原始特征的相关系数,即因子负荷量,可以用来解释各变量对各主成分的重要性corrcoef = []for i in range(len(data_pca.T)):each_corr = []for j in range(len(data_scaled.T)):each_corr.append(np.corrcoef(data_pca.T[i], data_scaled.T[j])[0][1])corrcoef.append(each_corr)print(np.array(corrcoef))

5、 聚类

# 对降维后的数据进行聚类kmeans = k_means(data_pca, k)labels = kmeans[1]

这里k是我们要聚的类别数。注意,k_means方法返回的是一个元组,第二项数据才是我们要的聚类后的类别标签。

6、将想要的结果整合成一个excel表

    result = pd.DataFrame(data_pca, columns=['第%s主成分' % (i+1) for i in range(n_component)])result['类别'] = labels   # 插入类别标签result.insert(0, 'index', df.iloc[:, 0])  # 插入园区名称#print('前5行数据为:', result.head(5))if save:result.to_excel('结果.xlsx') # 存入当前目录

7、实战

if __name__ == '__main__':path = '园区数据.xlsx'sheet_name = 'Sheet1'result, data_pca, data_scaled = standard_pca_kmeans(path, sheet_name, 6, 6)

这里我们设主成分个数为6,聚类类别数为6,最终输出大概就是这个样子:

8、可视化

算了,懒得搞,交给她自己做吧,我已经仁至义尽了。。。

从PCA到K-means的一次实际运用(python实现)相关推荐

  1. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  2. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  3. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  4. 文献记录(part89)--I-k-means-+:An iterative clustering algorithm based on an enhanced k -means

    学习笔记,仅供参考,有错必究 关键词:k均值:解决方案改进:准确的k均值:迭代改进 I-k-means-+:An iterative clustering algorithm based on an ...

  5. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

  6. 为了联盟还是为了部落 | K means

    1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...

  7. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  8. 聚类算法中 K均值聚类(KMeans)的python实现

    ** 聚类算法中 K均值聚类(KMeans)的python实现 ** import numpy as np import matplotlib.pyplot as plt from sklearn.d ...

  9. 【LeetCode】863. All Nodes Distance K in Binary Tree 解题报告(Python)

    [LeetCode]863. All Nodes Distance K in Binary Tree 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http ...

  10. python 聚类分析 k means

    Kmeans 是一种动态聚类方法,其基本思想是:首先随机选取 K 个点作为初始凝聚点,按照距离最近原则划分为 K 类:然后重新计算 K 个类的重心作为新的凝聚点,再按照距离最近原则重新分类:重复这一过 ...

最新文章

  1. iOS 高德导航按返回后报错 解决
  2. usb serial converter驱动安装_让你到期的机顶盒再发挥余热,终极办法任意安装软件,三网可用...
  3. 动态规划——入门(1)
  4. GridView绑定数据源 绑定DataReader /DataSet /DataTable
  5. Linux网络DNS配置反向解析与构建主从域名服务器
  6. 安心加科技打造多维度全场景式安心加物联平台
  7. c语言如何控制电脑串口,C语言直接驱动硬件实现PC机的串口操作
  8. jq请求Ajax数据
  9. 敏捷开发日常跟进系列之三:故事板,看板
  10. qgraphicsview鼠标移动图片_交互式QGraphicsView(平移/缩放/旋转)-阿里云开发者社区...
  11. ZYNQ研究----(2)基于开发板制作串口测试程序
  12. python知网下载_GitHub - ppho99/CNKI-download: 知网(CNKI)文献下载及文献速览爬虫
  13. USB-HID游戏手柄的数据通信
  14. [Swift]LeetCode1088. 易混淆数 II | Confusing Number II
  15. 京东图书详情页定价获取
  16. MWC 2018火热开幕,AI取代手机成主角,华为超越苹果称霸!
  17. 但行好事,去他妈的前程
  18. 制造生产模式的演变与敏捷制造
  19. Django 使用手册
  20. matlab结果中有虚数,Matlab数值积分结果是虚数

热门文章

  1. C-S结构和B-S结构的区别
  2. php curl 502 bad gateway,LNMP 常见502 Bad Gateway问题汇总
  3. java 压缩/解压【tar.gz】
  4. Pandas 分析斐波那契数列模整数的周期问题
  5. php一年节日,自动获取节日日期并显示灯笼效果的PHP源码
  6. 中国人民大学计算机考研资料汇总
  7. 根据出生年份判断生肖
  8. 雅可比矩阵机器学习_机器学习微积分中的雅可比和海森
  9. C#中的Attribute详解(下)
  10. AttributeError: Can‘t get attribute ‘SPPF‘