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

PCA降维

    • 数据标准化
    • 协方差矩阵
    • 特征值和特征向量
    • 贡献率
    • 数据集
    • 读取数据
    • 计算平均值
    • 标准差
    • z_score规范化
    • 协方差矩阵
    • 特征值和特征向量
    • 贡献率
    • 降到3维
    • 可视化
    • 二维和一维一个道理,就只贴代码了
    • 总结


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

PCA 将数据投射到一个低维子空间实现降维,是数据规约的一种常用方法。
PCA 的计算步骤如下所示:
(1)原始数据标准化;
(2)计算标准化变量间的相关系数矩阵;
(3)计算相关系数矩阵的特征值和特征向量;(4)计算主成分变量值;
(5)统计结果分析,提取所需的主成分;
(6)将原始数据投影到新的基下。

数据标准化

对数据进行标准化来实现非量纲化,本实验采用 z-score 规范化(零均值规
范化),标准化后的数据就会服从均值为 0、方差为 1 的正态分布(标准正态分
布)。其中,
PCA(主成成分分析)降维(附源码和数据)_第1张图片

协方差矩阵

协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。
协方差矩阵(Covariance matrix)由数据集中两两变量(属性)的协方差组成,
矩阵的第(i,j)个元素是数据集中第 i 和第 j 个元素的协方差。利用协方差矩阵计算
标准化变量间的相关系数矩阵,其中:
PCA(主成成分分析)降维(附源码和数据)_第2张图片

特征值和特征向量

在这里插入图片描述

贡献率

在这里插入图片描述

数据集

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)

PCA(主成成分分析)降维(附源码和数据)_第3张图片

特征值和特征向量

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()

PCA(主成成分分析)降维(附源码和数据)_第4张图片

二维和一维一个道理,就只贴代码了

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

你可能感兴趣的:(python,数据挖掘)