Python机器学习13——主成分分析

本系列所有的代码和数据都可以从陈强老师的个人主页上下载: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 mplot3d

audiometric = pd.read_csv('audiometric.csv')
audiometric.shape

audiometric.head()

数据长这样

Python机器学习13——主成分分析

计算其相关系数

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

Python机器学习13——主成分分析

画出相关系数矩阵热力图

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

Python机器学习13——主成分分析

数据标准化

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')

Python机器学习13——主成分分析

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

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')

Python机器学习13——主成分分析

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)

Python机器学习13——主成分分析

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

画图展示

Visualize pca loadings

fig, 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))

Python机器学习13——主成分分析

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

PCA Scores

pca_scores = model.transform(X)
pca_scores = pd.DataFrame(pca_scores, columns=columns)
pca_scores.shape
pca_scores.head()
#前两个主成分的可视化
visualize pca scores via biplot

sns.scatterplot(x='PC1', y='PC2', data=pca_scores)
plt.title('Biplot')

Python机器学习13——主成分分析

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

Visualize pca scores via triplot

fig = 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')

Python机器学习13——主成分分析

利用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机器学习13——主成分分析

主成分回归Python案例

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

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

Python机器学习13——主成分分析

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

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

Python机器学习13——主成分分析

划分训练测试集,手工划分,前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)
index

plt.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()

Python机器学习13——主成分分析

主成分个数为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()

Python机器学习13——主成分分析

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

Original: https://blog.csdn.net/weixin_46277779/article/details/125533173
Author: 阡之尘埃
Title: Python机器学习13——主成分分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/726929/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 描述性统计分析

    使用Python进行数据分析——描述性统计分析 描述性统计分析主要是指求一组数据的平均值、中位数、众数、极差、方差和标准差等指标,通过这些指标来发现这组数据的分布状态、数字特征等内…

    Python 2023年9月4日
    043
  • python如何打印id_找到唯一值的行ID并打印整行(Python/Pandas)

    我正在创建一个python脚本,检查CSV文件中的列中是否存在值,而另一个列中是否没有值。目前,我已经按预期使用了这个功能,脚本从CSV文件中的列返回唯一值。下一步是让脚本返回该唯…

    Python 2023年8月21日
    053
  • scrapy环境搭建使用小结

    scrapy环境搭建使用小结 最近研究了一下网页爬虫相关技术,在此进行一下总结,详情如下。 最开始研究爬取数据,是纯手工python实现,使用requests获取网页内容,再使用B…

    Python 2023年10月5日
    047
  • 猿创征文|零基础python学习之旅(简短又漫长)

    自我介绍 兴趣的产生 写在最后 自我介绍 笔者目前即将本科大三开学,学的专业是 经管学院下的物流工程专业(文科偏理工的专业吧),准备考研软件工程,本科中的课程学过高等数学、线性代数…

    Python 2023年8月2日
    043
  • python操作redis

    Python操作Redis之普通连接 1. 下载模块 pip install redis 2. 简单使用 from redis import Redis conn = Redis(…

    Python 2023年8月4日
    047
  • Scrapy入门(一)

    文章目录 一、Scrapy是什么? 二、安装步骤 * 1.mac系统 2.win系统 三、基本使用方法 * 1.创建一个工程 2. 在spiders子目录中创建一个爬虫文件 3. …

    Python 2023年10月3日
    039
  • python制作射击游戏_用python3从零开始开发一款烧脑射击游戏#2

    上回说到用pygame绘制一个静止的小方块,今天将会实现通过鼠标或者键盘来控制小方块的移动 在这之前,首先我们需要考虑一个问题: 我们怎样才会认为一个物体在运动?风动,幡动还是仁者…

    Python 2023年9月22日
    044
  • Photoshop 2023 (ps 2023) for Mac/Win(图像处理必备软件)支持M1最新版

    Original: https://www.cnblogs.com/aurora-123/p/16815687.htmlAuthor: 佛系女孩Title: Photoshop 2…

    Python 2023年10月28日
    028
  • CSAPP-BombLab详解

    Bomb Lab 引言:主要任务是”拆炸弹”。所谓炸弹,其实就是一个二进制的可执行文件,要求输入六个字符串,每个字符串对应一个phase。如果字符串输入错误…

    Python 2023年10月17日
    074
  • 性能达1.5+倍!昇腾AI助力分子动力学模拟研究

    摘要:在异构计算架构CANN的助力下,AI预测性能达到现有产品的1.5+倍,可预测规模较传统方法提升10000+倍,为光伏材料、新能源电池、半导体材料研究带来巨大的商业应用价值。 …

    Python 2023年10月29日
    030
  • Pandas数据结构分析

    1、pandas中有两个主要的数据结构,分别是:Series和DataFrame。 2、Series:它是一个类似一维数组的对象,它能够保存任何类型的数据,主要由一组数据(各种Nu…

    Python 2023年8月29日
    032
  • Python中利用FFT(快速傅里叶变换)进行频谱分析

    本文将从实例的角度出发讲解fft函数的基本使用,不包含复杂的理论推导。 一、基本条件 要对一个信号进行频谱分析,首先需要知道几个基本条件。 采样频率fs 信号长度N(信号的点数) …

    Python 2023年8月23日
    0146
  • python使用vosk进行中文语音识别

    操作系统:Windows10 Python版本:3.9.2 vosk是一个离线开源语音识别工具,它可以识别16种语言,包括中文。 这里记录下使用vosk进行中文识别的过程,以便后续…

    Python 2023年5月24日
    076
  • 爬虫:python如何获得天气数据

    1.先安装以下库 import requests from bs4 import BeautifulSoup as bs import pandas as pd from pand…

    Python 2023年8月1日
    049
  • 基于旋转高频注入法的永磁同步电机无位置传感器控制

    基于旋转高频注入法的永磁同步电机无位置传感器控制 一、原理解说 PMSM 无位置传感器控制主要分为两类:一种是在中高速范围内利用反电动势和电角速度的关系,通过计算反电动势获取转子位…

    Python 2023年9月16日
    045
  • python月球和地球体重_地球和月球围绕太阳运行,与Python玩游戏

    我想在pygame中用python代码使太阳系只有两个性质:地球绕太阳转,月球绕地球连续运行。这是我的代码:import sys, random, math import pyga…

    Python 2023年9月21日
    047
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球