本系列所有的代码和数据都可以从陈强老师的个人主页上下载:Python数据程序

参考书目:陈强.机器学习及Python应用. 北京:高等教育出版社, 2021.

本系列基本不讲数学原理,只从代码角度去让读者们利用最简洁的Python代码实现机器学习方法。


无监督学习就是没有y,让算法从特征变量x里面自己寻找特征。

本节开始无监督学习的方法,经典统计学的主成分分析,可以将数据进行线性变化从而进行降维,用少数几个变量代替原始的很多的变量。但是主成分不能进行变量筛选,因为新的变量是原始变量的线性组合,失去了原有的含义。而和主成分很像的因子分析可以进行部分解释。

主成分分析的Python案例

采用一个听力的数据集,导入包和数据:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import LeaveOneOut
from mpl_toolkits import mplot3daudiometric = pd.read_csv('audiometric.csv')
audiometric.shapeaudiometric.head()

数据长这样

计算其相关系数

pd.options.display.max_columns = 10
round(audiometric.corr(), 2)

画出相关系数矩阵热力图

sns.heatmap(round(audiometric.corr(), 2),annot=True)

数据标准化

scaler = StandardScaler()
scaler.fit(audiometric)
X = scaler.transform(audiometric)

主成分pca拟合

model = PCA()
model.fit(X)
#每个主成分能解释的方差
model.explained_variance_
#每个主成分能解释的方差的百分比
model.explained_variance_ratio_
#可视化
plt.plot(model.explained_variance_ratio_, 'o-')
plt.xlabel('Principal Component')
plt.ylabel('Proportion of Variance Explained')
plt.title('PVE')

画累计百分比,这样可以判断选几个主成分

plt.plot(model.explained_variance_ratio_.cumsum(), 'o-')
plt.xlabel('Principal Component')
plt.ylabel('Cumulative Proportion of Variance Explained')
plt.axhline(0.9, color='k', linestyle='--', linewidth=1)
plt.title('Cumulative PVE')

4个主成分能解释到90%以上了

主成分核载矩阵

#主成分核载矩阵
model.components_columns = ['PC' + str(i) for i in range(1, 9)]pca_loadings = pd.DataFrame(model.components_, columns=audiometric.columns, index=columns)
round(pca_loadings, 2)

该矩阵展示了每个主成分是原始数据的线性组合,以及线性的系数

画图展示

# Visualize pca loadingsfig, ax = plt.subplots(2, 2)
plt.subplots_adjust(hspace=1, wspace=0.5)
for i in range(1, 5):ax = plt.subplot(2, 2, i)ax.plot(pca_loadings.T['PC' + str(i)], 'o-')ax.axhline(0, color='k', linestyle='--', linewidth=1)ax.set_xticks(range(8))ax.set_xticklabels(audiometric.columns, rotation=30)ax.set_title('PCA Loadings for PC' + str(i))

计算每个样本的主成分得分

# PCA Scorespca_scores = model.transform(X)
pca_scores = pd.DataFrame(pca_scores, columns=columns)
pca_scores.shape
pca_scores.head()
#前两个主成分的可视化
# visualize pca scores via biplotsns.scatterplot(x='PC1', y='PC2', data=pca_scores)
plt.title('Biplot')

三个主成分的可视化,三维图

# Visualize pca scores via triplotfig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(pca_scores['PC1'], pca_scores['PC2'], pca_scores['PC3'], c='b')
ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
ax.set_zlabel('PC3')

利用K均值聚类对三个主成分聚类,可视化


from sklearn.cluster import KMeans
model = KMeans(n_clusters=3, random_state=1, n_init=20)
model.fit(X)
model.labels_fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(pca_scores['PC1'], pca_scores['PC2'], pca_scores['PC3'],c=model.labels_, cmap='rainbow')
ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
ax.set_zlabel('PC3')


主成分回归Python案例

使用中国香港的季度增长率的数据集进行主成分回归,读取数据,考察形状

growth = pd.read_csv('growth.csv')
growth.shape
growth.head(3)
growth.tail(3)

x为和中国香港相邻或有密切来往的24个国家的经济增长率。

#设置时间索引
growth.index = growth['Quarter']
growth = growth.drop(columns=['Quarter'])
#计算香港和其他地区的相关系数
# Correlation between HK's growth rate and other countries
growth.corr().iloc[:, 0]

划分训练测试集,手工划分,前44个数据作为训练集,后面测试集。然后标准化

X_train = growth.iloc[:44, 1:]
X_train.shape
X_test = growth.iloc[44:, 1:]
X_test.shape
y_train = growth.iloc[:44, 0]
y_test = growth.iloc[44:, 0]scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

使用留一交叉验证选择误差最小的时候的主成分个数

scores_mse = []
for k in range(1, 24):model = PCA(n_components=k)model.fit(X_train)X_train_pca = model.transform(X_train)loo = LeaveOneOut()mse = -cross_val_score(LinearRegression(), X_train_pca, y_train, cv=loo, scoring='neg_mean_squared_error')scores_mse.append(np.mean(mse))
min(scores_mse)index = np.argmin(scores_mse)
indexplt.plot(range(1, 24), scores_mse)
plt.axvline(index + 1, color='k', linestyle='--', linewidth=1)
plt.xlabel('Number of Components')
plt.ylabel('Mean Squared Error')
plt.title('Leave-one-out Cross-validation Error')
plt.tight_layout()

主成分个数为6时最小,下面使用六个主成分回归

model = PCA(n_components = index + 1)
model.fit(X_train)
#得到主成分得分
X_train_pca = model.transform(X_train)
X_test_pca = model.transform(X_test)
X_train_pca#进行线性回归拟合
reg = LinearRegression()
reg.fit(X_train_pca, y_train)#全样本预测
X_pca = np.vstack((X_train_pca, X_test_pca))
X_pca.shape
pred = reg.predict(X_pca)y = growth.iloc[:, 0]#可视化
plt.figure(figsize=(10, 5))
ax = plt.gca()
plt.plot(y, label='Actual', color='k')
plt.plot(pred, label='Predicted', color='k', linestyle='--')
plt.xticks(range(1, 62))
ax.set_xticklabels(growth.index, rotation=90)
plt.axvline(44, color='k', linestyle='--', linewidth=1)
plt.xlabel('Quarter')
plt.ylabel('Growth Rate')
plt.title("Economic Growth of HongKong_CN")
plt.legend(loc='upper left')
plt.tight_layout()

在44之前没有政策,曲线拟合效果好,44之后开始 政策实施,真实值大于拟合值,说明政策有效,促进了中国香港经济的发展。

Python机器学习13——主成分分析相关推荐

  1. Python 机器学习/深度学习/算法专栏 - 导读目录

    目录 一.简介 二.机器学习 三.深度学习 四.数据结构与算法 五.日常工具 一.简介 Python 机器学习.深度学习.算法主要是博主从研究生到工作期间接触的一些机器学习.深度学习以及一些算法的实现 ...

  2. python机器学习——主成分分析理论简介

    主成分分析理论简介 一.特征降维 1.1什么是特征降维? 1.2为什么要进行特征降维? 1.3特征选择和特征抽取 二.主成分分析(PCA)理论 2.1 算法描述 2.2 PCA 在图像识别的应用 2. ...

  3. PCA主成分分析算法专题【Python机器学习系列(十五)】

    PCA主成分分析算法专题[Python机器学习系列(十五)] 文章目录 1. PCA简介 2. python 实现 鸢尾花数据集PCA降维 3. sklearn库实现 鸢尾花数据集PCA降维案例    ...

  4. Python机器学习方向企业面试题(三)

    到这我们已经分享第三期Python机器学习方向的面试题了,是不是感觉前两期的面试题非常有用呢?最后一期20道题送给大家. 1.人工智能与机器学习的区别? 基于经验数据的特性而设计和开发的算法被称为机器 ...

  5. Python机器学习基础篇三《无监督学习与预处理》

    前言 前期回顾: Python机器学习基础篇二<为什么用Python进行机器学习> 上面这篇里面写了文本和序列相关. 我们要讨论的第二种机器学习算法是无监督学习算法.无监督学习包括没有已知 ...

  6. Python机器学习笔记 使用scikit-learn工具进行PCA降维...

    Python机器学习笔记 使用scikit-learn工具进行PCA降维 之前总结过关于PCA的知识:深入学习主成分分析(PCA)算法原理.这里打算再写一篇笔记,总结一下如何使用scikit-lear ...

  7. Python机器学习笔记 使用scikit-learn工具进行PCA降维

    Python机器学习笔记 使用scikit-learn工具进行PCA降维 之前总结过关于PCA的知识:深入学习主成分分析(PCA)算法原理.这里打算再写一篇笔记,总结一下如何使用scikit-lear ...

  8. Python 机器学习实战 —— 无监督学习(下)

    前言 在上篇< Python 机器学习实战 -- 无监督学习(上)>介绍了数据集变换中最常见的 PCA 主成分分析.NMF 非负矩阵分解等无监督模型,举例说明使用使用非监督模型对多维度特征 ...

  9. Python 机器学习实战 —— 无监督学习(上)

    ​​​ 前言 在上篇<Python 机器学习实战 -- 监督学习>介绍了 支持向量机.k近邻.朴素贝叶斯分类 .决策树.决策树集成等多种模型,这篇文章将为大家介绍一下无监督学习的使用. 无 ...

最新文章

  1. 《Arduino开发实战指南:机器人卷》一3.3 直流电机驱动电路原理
  2. adf开发_了解ADF Faces clientComponent属性
  3. 上一篇的改进!!!!!
  4. 查询oracle 表达小,oracle中sql语句小练习(使用连接查询)
  5. CentOS系统里如何正确取消或者延长屏幕保护自动锁屏功能(图文详解)
  6. 《算法导论》读书笔记之第10章 基本数据结构之二叉树
  7. Android实现图片宽度100%ImageView宽度且高度按比例自动伸缩
  8. chrome内核浏览器调用本地exe客户端
  9. pygame教程:第一课 初始化和主循环
  10. 中英文对照 —— 风景名胜、国家城市(专有名词)
  11. 2022年最新餐饮外卖行业市场研报合集(共45份)
  12. 美国高校代理服务器地址
  13. 【避免进程死锁】银行家算法
  14. 大学计算机基础 教学要求,《大学计算机基础》课程教学大纲
  15. js 选择本地图片并显示
  16. 基于matlab国内外水果自动分级方面,水果自动识别的BP神经网络方法
  17. 基于PHP+MySQL保险业务管理系统的设计与实现
  18. 【正点原子MP157连载】第四十一章 RGB转HDMI实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
  19. ibm tivoli_在Tivoli Access Manager v6.1 / WebSEAL和Tivoli Integrated Portal v1.1.x之间配置单点登录...
  20. http://f.lefeng.com/u/36033580/detail/r/t/tid/1010

热门文章

  1. 三星android获取root权限,三星S9 G9600 9.0 root教程_获取安卓9.0系统的root权限的方法...
  2. html5学生dw网页设计大作业,hbuilder仿茅台集团网页设计成品模板,图片轮播网页设计模板
  3. 性能指标:队列深度、IOPS与时延
  4. php绕过宝塔,一句命令绕过宝塔面板强制绑定账号
  5. 计算机开关键是什么符号,开关的符号是什么
  6. 【20保研】山东财经大学关于举办2019年优秀大学生夏令营的通知
  7. mac不断弹出提示 要信任此电脑吗
  8. linux是什么操作系统_Linux的优势
  9. matlab抓取网页信息,如何利用Matlab抓取网页数据
  10. win732位oracle,win7 32位安装oracle10g步骤