python进行主成分分析

本文深入探讨了主成分分析(PCA)的全过程,包括数据标准化、相关系数矩阵计算、特征值分解、正交单位化及主成分得分计算。通过具体实例展示了如何使用Python进行PCA分析,适用于高维数据降维与特征提取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据:

序号x1x2x3x4
1402520
2101.5530
312031350
42504.5180
51203.5950
6101.51250
74011940
827041360
92803.51160
101703960
111803.51440
1213023050
132201.51720
141601.53560
152202.51430
1614022020
1722021410
18401100
192011260
201202200

 

数据标准化:

 

x1

x2

x3

x4

0

-1.102513

-0.308130

-1.347755

-0.708447

1

-1.440017

-0.782175

-1.347755

-0.251384

2

-0.202502

0.639961

-0.269551

0.662740

3

1.260015

2.062098

0.404327

-1.622571

4

-0.202502

1.114007

-0.808653

0.662740

5

-1.440017

-0.782175

-0.404327

0.662740

6

-1.102513

-1.256220

0.539102

0.205678

7

1.485017

1.588052

-0.269551

1.119803

8

1.597518

1.114007

-0.539102

1.119803

9

0.360004

0.639961

-0.808653

1.119803

10

0.472505

1.114007

-0.134776

0.205678

11

-0.090001

-0.308130

2.021633

0.662740

12

0.922511

-0.782175

0.269551

-0.708447

13

0.247503

-0.782175

2.695510

1.119803

14

0.922511

0.165916

-0.134776

-0.251384

15

0.022500

-0.308130

0.673878

-0.708447

16

0.922511

-0.308130

-0.134776

-1.165509

17

-1.102513

-1.256220

-0.673878

-1.622571

18

-1.327515

-1.256220

-0.404327

1.119803

19

-0.202502

-0.308130

0.673878

-1.622571

数据标准化:也可以用sklearn包

from sklearn import preprocessing 
#Z-Score标准化
#建立StandardScaler对象
zscore = preprocessing.StandardScaler()
# 标准化处理
data_zs = zscore.fit_transform(data)

注意:sklearn这种处理求标准差时分母为n,而我们下面的std计算时分母为n-1,Spss里的计算分母也为n-1。

sklearn降维:

pca=dp.PCA(n_components=2) #加载pca算法,设置降维后主成分数目为2

reduced_x=pca.fit_transform(x) #对原始数据进行降维,保存在reduced_x中

数据标准化代码:

import pandas as pd
import numpy as np

csv_data = pd.read_csv('C:/Users/admin/Desktop/2019.10.05/算法/主成分分析/data.csv')  # 读取训练数据
csv_data=csv_data.drop('序号', axis=1)  #去掉序号那一列

describe=csv_data.describe()  # 对每一列数据进行统计,包括计数,均值,std,各个分位数等。
mean=describe.loc['mean']
std=describe.loc['std']
m=csv_data.index.size         #行数
n=csv_data.columns.size       #列数
column=csv_data.columns.values    #['x1' 'x2' 'x3' 'x4']

#实现对数据框里的每个元素进行相关操作
for i in range(0,m):
    for j in range(0,n):
        csv_data.iloc[i,j]=(csv_data.iloc[i,j]-mean[j])/std[j]  #第i行,第j列

print("标准化后的数据:\n",csv_data)

主成分分析:

import pandas as pd
import math
import numpy as np
from scipy import linalg

csv_data = pd.read_csv('C:/Users/admin/Desktop/2019.10.05/算法/主成分分析/data.csv')  # 读取训练数据
csv_data=csv_data.drop('序号', axis=1)  #去掉序号那一列

corr = csv_data.corr()  #求变量之间的相关系数,判断是否可以进行主成分分析
print("原始数据:\n",csv_data)
print("\n相关系数矩阵:\n",corr)

describe=csv_data.describe()  # 对每一列数据进行统计,包括计数,均值,std,各个分位数等。
mean=describe.loc['mean']
std=describe.loc['std']

a=list(csv_data['x1'])
x11=[]
for i in range(0,20):
    x11.append((a[i]-mean['x1'])/std['x1'])
    
b=list(csv_data['x2'])
x22=[]
for i in range(0,20):
    x22.append((b[i]-mean['x2'])/std['x2'])
    
c=list(csv_data['x3'])
x33=[]
for i in range(0,20):
    x33.append((c[i]-mean['x3'])/std['x3'])
    
d=list(csv_data['x4'])
x44=[]
for i in range(0,20):
    x44.append((d[i]-mean['x4'])/std['x4'])

arr=np.array([x11,x22,x33,x44])  #中心化后的数据
print("\n标准化后的数据:\n",arr.T)

M=corr.values   #将相关系数转为矩阵

eig,vec=np.linalg.eig(M)   #计算矩阵的特征值、特征向量。eig是list类型,vec是<class 'numpy.ndarray'>类型

per=[]     #贡献率的计算
for i in range(0,4):
    per.append(eig[i]/sum(eig))

print("\n相关系数矩阵的特征值:\n",eig)

# vec1=vec[[:]][:,[1,3,2,0]]
per=sorted(per,reverse=True)  #贡献率排序(从大到小)
print("\n贡献率排序:\n",per)
print("\n累计贡献率:\n",np.array(per).cumsum())  #贡献率的累计计算

#定义单位正交化的函数
def gram_schmidt(A):
    """Gram-schmidt正交化"""
    global Q    #必须申明为全局变量,否则无法调用Q
    Q=np.zeros_like(A)
    cnt = 0
    for a in A.T:
        u = np.copy(a)
        for i in range(0, cnt):
            u -= np.dot(np.dot(Q[:, i].T, a), Q[:, i]) # 减去待求向量在已求向量上的投影
        e = u / np.linalg.norm(u)  # 归一化
        Q[:, cnt] = e
        cnt += 1
    R = np.dot(Q.T, A)
    print("\n正交单位化后的特征向量:")
    print(Q.T)

gram_schmidt(vec)
print("\n按特征值大小排列的正交单位化后的特征向量:")
print(Q.T[[1,3,2,0][:]])

y=np.dot(arr.T,Q.T[[1,3,2,0][:]].T)
Y=pd.DataFrame(y)

Y.rename(columns={0:'Y1',1:'Y2', 2:'Y3',3:'Y4'}, inplace = True)
print("\n主成分的值(得分):\n",Y)

print("\n主成分相关系数矩阵:")
corr1=Y.corr()
print(corr1)

result = csv_data.join(Y,how='inner')
print("\n原始数据和主成分得分:")
print(result)

corr2=result.corr()
print("\n原始数据和主成分得分之间的相关系数:")
print(corr2.iloc[0:4, 4:8])

输出结果:

相关系数矩阵:

 

x1

x2

x3

x4

x1

1.000000

0.694984

0.219456

0.024898

x2

0.694984

1.000000

-0.147955

0.135133

x3

0.219456

-0.147955

1.000000

0.071327

x4

0.024898

0.135133

0.071327

1.000000

相关系数矩阵的特征值:

 [0.20686561 1.71825161 0.98134701 1.09353577]


贡献率排序:

 [0.42956290217587323, 0.2733839423331357, 0.2453367536310203, 0.05171640185997065]


累计贡献率:

[0.4295629  0.70294684 0.9482836  1.        ]


正交单位化后的特征向量:

[[ 0.66588327 -0.66355498 -0.31889547  0.12083021]
 [-0.69996363 -0.6897981  -0.08793923 -0.16277651]
 [-0.24004879  0.05846333 -0.27031356  0.93053167]
 [ 0.09501037 -0.28364662  0.9041587   0.30498307]]


按特征值大小排列的正交单位化后的特征向量:

[[-0.69996363 -0.6897981  -0.08793923 -0.16277651]
 [ 0.09501037 -0.28364662  0.9041587   0.30498307]
 [-0.24004879  0.05846333 -0.27031356  0.93053167]
 [ 0.66588327 -0.66355498 -0.31889547  0.12083021]]


 

Y1

Y2

Y3

Y4

0

1.218105

-1.451999

-0.048273

-0.185493

1

1.706942

-1.210208

0.430341

-0.040449

2

-0.383874

-0.242355

0.775589

-0.393455

3

-2.075835

-0.594474

-1.801057

-0.854286

4

-0.663462

-0.864250

0.949030

-0.536093

5

1.475180

-0.078406

1.025942

-0.230850

6

1.557370

0.801735

0.236877

-0.047638

7

-2.293467

-0.211550

0.851241

0.156353

8

-2.021514

-0.310116

0.869385

0.631779

9

-0.804599

-0.536949

1.211598

0.208253

10

-1.120804

-0.330221

0.179526

-0.356740

11

-0.010115

2.108850

0.073817

-0.420080

12

-0.014567

0.337162

-0.999271

0.961740

13

-0.053019

3.024066

0.208238

-0.040456

14

-0.707401

-0.157940

-0.409237

0.516795

15

0.252856

0.482766

-0.864806

-0.081055

16

-0.231607

-0.302271

-1.287573

0.720896

17

1.961634

-0.852576

-1.136482

0.118267

18

1.649029

0.206141

1.396532

0.213845

19

0.559148

0.182595

-1.661416

-0.341334


主成分相关系数矩阵:

 

Y1

Y2

Y3

Y4

Y1

1.000000e+00

-2.120752e-16

-4.499891e-17

7.693762e-16

Y2

-2.120752e-16

1.000000e+00

1.974226e-16

-6.972072e-16

Y3

-4.499891e-17

1.974226e-16

1.000000e+00

2.075015e-16

Y4

7.693762e-16

-6.972072e-16

2.075015e-16

1.000000e+00


原始数据和主成分得分:

 

x1

x2

x3

x4

Y1

Y2

Y3

Y4

0

40

2.0

5

20

1.218105

-1.451999

-0.048273

-0.185493

1

10

1.5

5

30

1.706942

-1.210208

0.430341

-0.040449

2

120

3.0

13

50

-0.383874

-0.242355

0.775589

-0.393455

3

250

4.5

18

0

-2.075835

-0.594474

-1.801057

-0.854286

4

120

3.5

9

50

-0.663462

-0.864250

0.949030

-0.536093

5

10

1.5

12

50

1.475180

-0.078406

1.025942

-0.230850

6

40

1.0

19

40

1.557370

0.801735

0.236877

-0.047638

7

270

4.0

13

60

-2.293467

-0.211550

0.851241

0.156353

8

280

3.5

11

60

-2.021514

-0.310116

0.869385

0.631779

9

170

3.0

9

60

-0.804599

-0.536949

1.211598

0.208253

10

180

3.5

14

40

-1.120804

-0.330221

0.179526

-0.356740

11

130

2.0

30

50

-0.010115

2.108850

0.073817

-0.420080

12

220

1.5

17

20

-0.014567

0.337162

-0.999271

0.961740

13

160

1.5

35

60

-0.053019

3.024066

0.208238

-0.040456

14

220

2.5

14

30

-0.707401

-0.157940

-0.409237

0.516795

15

140

2.0

20

20

0.252856

0.482766

-0.864806

-0.081055

16

220

2.0

14

10

-0.231607

-0.302271

-1.287573

0.720896

17

40

1.0

10

0

1.961634

-0.852576

-1.136482

0.118267

18

20

1.0

12

60

1.649029

0.206141

1.396532

0.213845

19

120

2.0

20

0

0.559148

0.182595

-1.661416

-0.341334


原始数据和主成分得分之间的相关系数:

 

Y1

Y2

Y3

Y4

x1

-0.917527

0.099354

-0.237799

0.302860

x2

-0.904202

-0.296616

0.057916

-0.301801

x3

-0.115273

0.945499

-0.267781

-0.145042

x4

-0.213371

0.318928

0.921812

0.054957

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值