PCA(主成成分分析)降维(附源码和数据)


都是自己写的代码,很好调用包。 目前还是学生,所写内容都是上的实验课,如有不足敬请补充。 ## 运行环境 python3.6 jupyter notebook ## 基本思想

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

z_score规范化

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维

#降维,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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PCA(Principal Component Analysis)是一种常用的降维方法,它可以将高维的数据转换成低维的数据,同时保留原始数据的主要特征。 在对MNIST数据集进行降维时,我们首先需要对数据进行预处理,例如对每个像素值进行标准化处理,使其均值为0,方差为1。然后,我们将数据输入PCA模型中。PCA模型会计算出一组特征向量和对应的特征值,特征向量表示数据中的主要方向,特征值表示数据在对应特征向量上的重要程度。 我们可以根据特征值的大小来选择保留多少个主要特征向量。通常,我们选择前K个特征向量,其中K是我们预先设定的维度。这样,我们可以将原始的高维数据转换成K维的数据,实现数据降维。 通过对MNIST数据集进行PCA降维,可以达到以下几个目的: 1. 减少数据的维度,降低计算和存储的复杂性。原始的MNIST数据集包含784维的特征(每个样本是28x28的像素矩阵),而PCA可以将数据降到更低维度,例如50维,从而减少需要处理的特征数量。 2. 保留了数据的主要特征。通过选择保留较大特征值对应的特征向量,PCA可以保留数据中最重要的信息,从而在降维的同时尽量减少信息损失。 3. 可视化数据。通过降维后的数据,我们可以更容易地对数据进行可视化,例如绘制散点图、热力图等,从而更好地理解数据的分布和结构。 需要注意的是,降维后的数据可能损失一部分细节信息,因此降维的合理性需要根据具体问题进行评估。同时,在PCA的应用中,我们还可以通过调整维度数量、选择其他降维方法(如LDA、t-SNE等)来进行对比和分析,以获得更好的降维效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值