主成分分析python代码实现

版本一:使用numpy、panda

python 复制代码
import numpy as np
import pandas as pd

#PCA:principal component analysis 主成分分析法

#读取数据,以outcome.xlsx为例
data=pd.read_excel('outcome.xlsx',sheet_name='人均消费(元)')
data=data.set_index('省份')

#获取样本数量、指标数量
n,p=data.shape
print(f'样本数量:{n},指标数量:{p}')

#1、Z标准化{消除量纲影响}
data_Z=(data-data.mean(axis=0))/data.std(axis=0)

#2、计算协方差矩阵[相关系数矩阵]
data_cov=data_Z.cov()


#1、2 等价于计算相关系数矩阵
# data_corr=data.corr()

#3、计算相关系数矩阵的特征值与特征向量
eigValues,eigVectors=np.linalg.eig(data_cov)

# 获取特征值的排序索引
sorted_indices = np.argsort(eigValues)[::-1]

# 使用排序索引重新排列特征值和特征向量
sorted_eigValues = eigValues[sorted_indices]
sorted_eigVectors = eigVectors[:, sorted_indices]
#特征向量标准化
sorted_eigVectors = sorted_eigVectors / np.linalg.norm(sorted_eigVectors, axis=0)

#4、计算特征值贡献率与累计贡献率
sorted_eigValues_rate = sorted_eigValues/sorted_eigValues.sum()
sorted_eigVectors_cumrate=sorted_eigValues_rate.cumsum()

print(f'贡献率为   {sorted_eigValues_rate}')
print(f'累计贡献率为  {sorted_eigVectors_cumrate}')

#5、决定主成分数量
m=int(input('选择你需要的主成分数量:'))

#6、获取各主成分中各指标线性组合系数
Reduce_Matrix=sorted_eigVectors[:,0:m]
print(Reduce_Matrix)

版本二:使用sklearn库中的PCA模块

python 复制代码
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 读取数据,以outcome.xlsx为例
data = pd.read_excel('outcome.xlsx', sheet_name='人均消费(元)')
data = data.set_index('省份')

# 获取样本数量、指标数量
n, p = data.shape
print(f'样本数量: {n}, 指标数量: {p}')

# 1、Z标准化{消除量纲影响}
scaler = StandardScaler()
data_Z = scaler.fit_transform(data)

# 2、使用PCA进行主成分分析
pca = PCA()
pca.fit(data_Z)

# 3、计算特征值贡献率与累计贡献率
explained_variance_ratio = pca.explained_variance_ratio_
cumulative_explained_variance_ratio = np.cumsum(explained_variance_ratio)

print(f'贡献率为   {explained_variance_ratio}')
print(f'累计贡献率为  {cumulative_explained_variance_ratio}')

# 4、决定主成分数量
m = int(input('选择你需要的主成分数量:'))

# 5、获取主成分中各指标线性组合的系数
components = pca.components_.T[:,:m]
# 将系数转换为DataFrame以便更好地查看
components_df = pd.DataFrame(components, index=data.columns, columns=[f'主成分{i+1}' for i in range(m)])
print(components_df)

# 6、计算降维后的矩阵并输出
pca = PCA(n_components=m)
Reduce_Matrix = pca.fit_transform(data_Z)
col = [f'主成分{i+1}' for i in range(m)]
New_outcome = pd.DataFrame(data=Reduce_Matrix, index=data.index, columns=col)
print(New_outcome)
相关推荐
§ꦿCFོ༉9 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
投图匠9 小时前
十种不同风格的 CTP接口 框架
开发语言·python
2601_9679801111 小时前
深入理解词向量算法及其在Python中的实践
python·word2vec·glove·fasttext·词向量
129Lab11 小时前
电池循环测试数据自动化分析:用Python+AI工具构建一键式寿命评估流水线
python·数据分析·电池测试·数据自动化·寿命评估
treasure14011 小时前
【复古】浅尝Django前后端不分离
前端·css·python·django·bootstrap·html·web
Dmz丶12 小时前
前端转 AI 100 天 Day 44:前端集成实战——用 React 给 Agent 做个正式界面
python
jay神12 小时前
基于 YOLOv8 的手势识别系统(Web 版)
前端·人工智能·python·深度学习·yolo·计算机视觉·计算机毕业设计
DeepVisionary13 小时前
阿里云上线旗舰多模态新模型,不公布跑分且限时14天退役
python·自动化
东莞市云毅网络有限公司13 小时前
FAQ 覆盖度打分:TF-IDF 与向量嵌入双路召回的 Python 实现
python·数据清洗·rag·企业知识库·文档解析
爱笑的k1113 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm