主成分分析(PCA)算法实现iris数据集降维

主成分分析(PCA)算法

1.PCA简介:
PCA(Principal Component Analysis),主成分分析,是一种常用的数据降维算法。数据降维是指对高维度特征数据进行处理,保留重要的特征,去除噪声和不必要的特征,以达到提升 数据处理速度的目的。
PCA的主要思想是将原有数据的n维特征映射到k维上(k

2.方差、协方差、协方差矩阵

样本方差:

每个样本值与全体样本值的平均数之差的平方值的平均数,代表着样本数据的偏离程度。

样本X和样本Y的协方差:
主成分分析(PCA)算法实现iris数据集降维_第1张图片
协方差是用于衡量两个变量的总体误差。如果两个变量的变化趋势一致,如X大于自身期望值,Y也大于自身期望值,说明X和Y是正相关关系,则协方差大于0,反之,X和Y是负相关关系,协方差小于0。若协方差等于0,则说明X和Y相互独立。,方差是协方差的特殊情况,Cov(X,X)就是X的方差。
方差和协方差的除数是n-1,是为了得到方差和协方差的无偏估计。

协方差矩阵:
当样本为n维数据时,它的协方差实际就位协方差矩阵(对称方阵)。例如对于三维数据(X,Y,Z),它的协方差就是:
主成分分析(PCA)算法实现iris数据集降维_第2张图片

3.PCA算法的两种实现方法:
(1)基于特征值分解协方差矩阵实现PCA算法
输入:数据集X(n维),需要降到k维
1.原始数据进行标准化,均值为0,方差为1
2.计算协方差矩阵Cov
3.计算协方差矩阵的特征值和对应的特征向量
4.对特征值按大小进行排序,选择其中最大的k个。然后将其对应的特征向量分别作为行向量组成特征向量矩阵P
5.将数据转换到由k个特征向量构成的新空间中,即Y=PX
(2)基于SVD分解协方差矩阵实现PCA算法
输入:数据集X(n维),需要降到k维
1.去平均值,每一位特征减去自己的平均值
2.计算协方差矩阵Cov
3.通过SVD(奇异值分解)计算协方差矩阵的特征值和对应的特征向量
4.对特征值按大小进行排序,选择其中最大的k个。然后将其对应的特征向量分别作为列向量组成特征向量矩阵P
5.将数据转换到由k个特征向量构成的新空间中,即Y=PX

4.最大方差理论与最小平方误差理论
对于二维样本点,我们的目标是是求一条直线,并且尽可能使这条直线尽可能更好。
(1)最大方差理论
在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。因此我们认为,最好的k维特征是将n维样本点变换为k维后,每一维上的样本方差都尽可能的大,也就是让数据在主轴上投影的方差最大(在我们假设中方差最大的有用信号最大化减少了噪声的影响)。
(2)最小平方误差理论
我们可以使用点到直线的距离d′来度量直线的好坏。
现在有m个样本点x(1),…,x(m),每个样本点为n维。将样本点x(i)在直线上的投影记为x(1)′,那么我们就是要最小化
在这里插入图片描述
这个公式称作最小平方误差(Least Squared Error),这样的话使点都尽可能聚集在新的坐标轴周围。

5.PCA算法实现iris数据集降维实例:

from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_digits
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import numpy as np
import matplotlib.pyplot as plt

iris = load_iris()
x_data = iris.data
y_data = iris.target

def zeroMean(dataMat):
    meanVal = np.mean(dataMat, axis= 0)
    newData = dataMat - meanVal
    return newData, meanVal

def PCA(dataMat, top):
    #数据中心化
    newData, meanVal = zeroMean(dataMat)
    #cov用于求协方差矩阵,参数rowvar = 0说明数据一行代表一个样本
    covMat = np.cov(newData, rowvar=0)
    #np.linalg.eig用于求矩阵的特征值和特征向量
    eigVals, eigVects = np.linalg.eig(np.mat(covMat))
    #对特征值从小到大排列
    eigValIndice = np.argsort(eigVals)
    #得到最大的n个特征值的下标
    n_eigValIndice = eigValIndice[-1:-(top + 1): -1]
    #得到下标对应的特征向量
    n_eigVects = eigVects[:, n_eigValIndice]
    #低维特征空间的数据
    lowDDataMat = newData * n_eigVects
    # print(newData)
    print(n_eigVects)
    # print(lowDDataMat)
    #利用低维度数据来重构数据
    reconMat = (lowDDataMat * n_eigVects.T) + meanVal
    return lowDDataMat, reconMat


#将数据降至2维
lowDDataMat, reconMat = PCA(x_data, 2)


x = np.array(lowDDataMat)[:, 0]
y = np.array(lowDDataMat)[:, 1]
plt.scatter(x, y, c = y_data)
plt.show()

降维后并可视化的结果为:
主成分分析(PCA)算法实现iris数据集降维_第3张图片

你可能感兴趣的:(机器学习)