PCA 将数据投射到一个低维子空间实现降维,是数据规约的一种常用方法。
PCA 的计算步骤如下所示:
(1)原始数据标准化;
(2)计算标准化变量间的相关系数矩阵;
(3)计算相关系数矩阵的特征值和特征向量;(4)计算主成分变量值;
(5)统计结果分析,提取所需的主成分;
(6)将原始数据投影到新的基下。
对数据进行标准化来实现非量纲化,本实验采用 z-score 规范化(零均值规
范化),标准化后的数据就会服从均值为 0、方差为 1 的正态分布(标准正态分
布)。其中,
协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。
协方差矩阵(Covariance matrix)由数据集中两两变量(属性)的协方差组成,
矩阵的第(i,j)个元素是数据集中第 i 和第 j 个元素的协方差。利用协方差矩阵计算
标准化变量间的相关系数矩阵,其中:
Iris 也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集内包含 3
类共 150 条记录,每类各 50 个数据,每条记录都有 5 项特征:萼片长度
(Sepal_length)、萼片宽度(Sepal_width)、花瓣长度(Petal_length)、花瓣
宽度(Petal_width)、分类属性(Species_name),表示实例所对应的类别山鸢
花(Setosa)、变色鸢花(Versicolour)弗吉尼亚州鸢花(Virginica)。
import pandas as pd
data = pd.read_csv("iris.csv")
new_data = data.iloc[:,1:5]
avg =[]
for i in new_data.columns:
a = new_data[i].values.tolist()
sum = 0
for i in range(0,len(a)):
sum = sum + float(a[i])
avg.append(sum/len(a))
#标准差
all_value=[]
for i in new_data.columns:
a = new_data[i].values.tolist()
all_value.append(a)
biaozhuncha = []
for i in range(0,new_data.shape[1]):
sum = 0
for j in all_value[i]:
sum = sum + ((float(j)-avg[i])*(float(j)-avg[i]))
b = (sum/new_data.shape[0]) ** 0.5
biaozhuncha.append(b)
biaozhuncha
result = []
for i in range(0,new_data.shape[1]):
z_score=[]
for j in all_value[i]:
c = (float(j)-avg[i])/biaozhuncha[i]
z_score.append(c)
result.append(z_score)
new_data['Petal_width'] = result[0]
new_data['Petal_length'] = result[1]
new_data['Sepal_width'] = result[2]
new_data['Sepal_length'] = result[3]
#将矩阵转置,即把new_data的每一列单独取出成一个列表,
#然后把所有列放入一个大列表
zhuanzhi_data = []
for i in range(new_data.shape[1]):
zhuanzhi_data.append(list(new_data.iloc[:,i]))
#zhuanzhi_data
#取出new_data中每一列的元素
new_data_result=[]
for i in range(4):
a=[]
for j in new_data.iloc[:,i]:
a.append(j)
new_data_result.append(a)
#new_data_result
sum_result=[]
for m in range(4):
sum_list=[]
for j in range(4):
sum=0
for i in range(150):
sum = zhuanzhi_data[m][i]*new_data_result[j][i]+sum
sum_list.append(sum/150)
sum_result.append(sum_list)
a,b = np.linalg.eig(sum_result)
#计算贡献率
gongxianlv=[]
tezhengzhi_sum=0
for i in a:
tezhengzhi_sum=tezhengzhi_sum+i
for i in range(len(a)):
gongxianlv.append(a[i]/tezhengzhi_sum)
#降维,3维
b3=[]
b3.append(b[0])
b3.append(b[2])
b3.append(b[3])
lie_result=[]
df3 = pd.DataFrame(b3)
for i in range(4):
lie=[]
for j in df3.iloc[:,i]:
lie.append(j)
lie_result.append(lie)
dataMat1=np.array(new_data)
df3_result=pd.DataFrame(np.dot(dataMat1,np.array(lie_result)))
将data数据中的特征改为数字,进行可视化
data[data["Species_name"]==' Setosa']=0
data[data["Species_name"]==' Versicolor']=1
data[data["Species_name"]==' Verginica']=2
feature = data.iloc[:,5].tolist()
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inline
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(df3_result[0].tolist(), df3_result[1].tolist(), df3_result[2].tolist(), c=feature)
plt.show()
#降维,2维
b2=[]
b2.append(b[0])
#b3.append(b[2])
b2.append(b[3])
lie_result=[]
df2 = pd.DataFrame(b2)
for i in range(4):
lie=[]
for j in df2.iloc[:,i]:
lie.append(j)
lie_result.append(lie)
dataMat1=np.array(new_data)
df2_result=pd.DataFrame(np.dot(dataMat1,lie_result))
#降维,1维
b1=[]
b1.append(b[0])
#b3.append(b[2])
#b2.append(b[3])
lie_result=[]
df1 = pd.DataFrame(b1)
for i in range(4):
lie=[]
for j in df1.iloc[:,i]:
lie.append(j)
lie_result.append(lie)
dataMat1=np.array(new_data)
df1_result=pd.DataFrame(np.dot(dataMat1,lie_result))
其实应该能看出来,降维后的结果就是四位数据其中的某一列,我们的主成成分分析应该就是看哪一列所占的比重最大,然后降维时就去最大的几列。(以上内容全是个人见解,还是学生)
数据源码:链接:https://pan.baidu.com/s/18Zm77L2EhEtXML5cagGFvA
提取码:1025