问题: 有个三维数据,想降维成一维然后再用它进行表征。
数据如下:
image.png方法:用sklearn库中的pca
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
# 设置数据集要降低的维度
pca = PCA(n_components=None)
# 对数据框的1,2,3列进行降维
pca.fit(df[[1,2,3]])
# 贡献方差,即特征值
pca.explained_variance_
pca.explained_variance_ratio_ # 方差贡献率
[pca.components](http://pca.components/)_ # 成分矩阵
k1_spss = [pca.components](http://pca.components/)_ /np.sqrt(pca.explained_variance_.reshape(-1,1)) # 成分得分系数矩阵
结果如图:
image.png确定权重
# 确定权重
# 求指标在不同主成分线性组合中的系数
j=0
weights=[]
for j in range(len(k1_spss)):
for i in range(len(pca.explained_variance_)):
weights_coefficient = np.sum(100*(pca.explained_variance_ratio_[i]* (k1_spss[i][j]))/
np.sum(pca.explained_variance_ratio_))
j = j +1
weights.append(np.float(weights_coefficient))
print('weights:', weights)
from sklearn import preprocessing
#对权重进行归一化
weights= pd.DataFrame(weights)
weights1 = preprocessing.MinMaxScaler().fit(weights)
weights2 = weights1.transform(weights)
print('weights2:', weights2)
这个得出的是每个指标最后的权重。
自实现代码:
R = df1.corr() # 样本相关阵
l, T = np.linalg.eig(R) # 求特征值l与特征向量T,特征值默认从大到小排序
n, p = df1.shape
s=0
t=0
cr = [] # 累计贡献率
for i in range(len(l)):
t+=1
contri=l[i]/np.sum(l) # 第i主成分贡献率
cr.append(contri)
s+=contri
if s>=0.8: # 累计贡献率达80%即停止
break
pc=[]
for i in range(t):
Y=np.dot(df1, T[i].T) # 计算第i主成分
pc.append(Y)
factor_loading=[]
for i in range(t):
a = []
for j in range(p):
a.append(np.sqrt(l[i])*T[i][j]) # 计算第i 主成分在第j个变量上的载荷
factor_loading.append(a)
factor_loading=np.array(factor_loading)
print('主成分个数', t)
print('主成分', np.mat(pc))
print('贡献率', cr)
print('累计贡献率', s)
print('因子载荷', factor_loading)
结果不一样,得再查下原因。
参考:https://blog.csdn.net/weixin_43166884/article/details/109363740
https://blog.csdn.net/weixin_60737527/article/details/125144416
网友评论