python主成分分析法

数据集如下:
在这里插入图片描述

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math

pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel("xyh.xlsx")
print(df)
n = len(df.columns)
R = df.corr()
print('相关系数矩阵为:')
print(R)
w, v = np.linalg.eig(R)
# argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。
# [1,4,3,-1,6,9]
# x[3]=-1最小,所以y[0]=3,x[5]=9最大,所以y[5]=5。
sorted_indices = np.argsort(w)
topk_evecs = v[:, sorted_indices[::-1]]
sorted_indices = sorted_indices[::-1]
w = w[sorted_indices]
print('特征值为{}\n特征向量为{}'.format(w, topk_evecs))
S = sum(w)
print("每个维度的方差贡献率")
print(w / S)
print("使用R得到的累积方差贡献率为:")
print(np.cumsum(w) / S)
print("-" * 100)
x = [i + 1 for i in range(n)]
print(x)
print(w)
plt.plot(x, w)
plt.title("碎石图")
plt.xlabel("主成分个数")
plt.ylabel("主成分特征值")
plt.grid()
plt.show()
# 可以得到要划分为2个主成分
# 计算因子载荷矩阵和贡献率

# 一般情况需要通过碎石图判断
PC1 = pd.DataFrame(topk_evecs[:, 0].reshape(1, n))
PC2 = pd.DataFrame(topk_evecs[:, 1].reshape(1, n))
PC1 = PC1 * math.sqrt(w[0])
PC2 = PC2 * math.sqrt(w[1])
pc = pd.concat([PC1, PC2])
pc.columns = df.columns
pc.index = [i + 1 for i in range(len(pc))]
Y = []
for i in range(len(pc.columns)):
    Y.append(math.pow(pc.iloc[0, i], 2) + math.pow(pc.iloc[1, i], 2))
Y = np.array(Y).reshape(1, n)
Y = pd.DataFrame(Y)
Y.index = ["贡献率"]
Y.columns = pc.columns
pc = pd.concat([pc, Y])
print('因子载荷矩阵和贡献率如下:')
print(pc)
# 由此可以看出主成分1主要反映学生的偏科状况,主成分2主要反映学生的总体成绩

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

抽象带篮子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值