python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python PCA降维算法

Python机器学习之PCA降维算法详解

作者:ProChick

今天带大家复习python机器学习的知识点,文中对PCA降维算法介绍的非常详细,对正在学习python机器学习的小伙伴们有很好地帮助,需要的朋友可以参考下

一、算法概述

二、算法步骤

在这里插入图片描述

1.将原始数据按行组成m行n列的矩阵X

2.将X的每一列(代表一个属性字段)进行零均值化,即减去这一列的均值

3.求出协方差矩阵

4.求出协方差矩阵的特征值及对应的特征向量r

5.将特征向量按对应特征值大小从左到右按列排列成矩阵,取前k列组成矩阵P

6.计算降维到k维的数据

三、相关概念

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、算法优缺点

优点

缺点

五、算法实现

自定义实现

import numpy as np


# 对初始数据进行零均值化处理
def zeroMean(dataMat):
    # 求列均值
    meanVal = np.mean(dataMat, axis=0)
    # 求列差值
    newData = dataMat - meanVal
    return newData, meanVal


# 对初始数据进行降维处理
def pca(dataMat, percent=0.19):
    newData, meanVal = zeroMean(dataMat)

    # 求协方差矩阵
    covMat = np.cov(newData, rowvar=0)

    # 求特征值和特征向量
    eigVals, eigVects = np.linalg.eig(np.mat(covMat))

    # 抽取前n个特征向量
    n = percentage2n(eigVals, percent)
    print("数据降低到:" + str(n) + '维')

    # 将特征值按从小到大排序
    eigValIndice = np.argsort(eigVals)
    # 取最大的n个特征值的下标
    n_eigValIndice = eigValIndice[-1:-(n + 1):-1]
    # 取最大的n个特征值的特征向量
    n_eigVect = eigVects[:, n_eigValIndice]

    # 取得降低到n维的数据
    lowDataMat = newData * n_eigVect
    reconMat = (lowDataMat * n_eigVect.T) + meanVal

    return reconMat, lowDataMat, n


# 通过方差百分比确定抽取的特征向量的个数
def percentage2n(eigVals, percentage):
    # 按降序排序
    sortArray = np.sort(eigVals)[-1::-1]
    # 求和
    arraySum = sum(sortArray)

    tempSum = 0
    num = 0
    for i in sortArray:
        tempSum += i
        num += 1
        if tempSum >= arraySum * percentage:
            return num


if __name__ == '__main__':
    # 初始化原始数据(行代表样本,列代表维度)
    data = np.random.randint(1, 20, size=(6, 8))
    print(data)

    # 对数据降维处理
    fin = pca(data, 0.9)
    mat = fin[1]
    print(mat)

利用Sklearn库实现

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

# 加载数据
data = load_iris()
x = data.data
y = data.target

# 设置数据集要降低的维度
pca = PCA(n_components=2)
# 进行数据降维
reduced_x = pca.fit_transform(x)

red_x, red_y = [], []
green_x, green_y = [], []
blue_x, blue_y = [], []

# 对数据集进行分类
for i in range(len(reduced_x)):
    if y[i] == 0:
        red_x.append(reduced_x[i][0])
        red_y.append(reduced_x[i][1])
    elif y[i] == 1:
        green_x.append(reduced_x[i][0])
        green_y.append(reduced_x[i][1])
    else:
        blue_x.append(reduced_x[i][0])
        blue_y.append(reduced_x[i][1])

plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(green_x, green_y, c='g', marker='D')
plt.scatter(blue_x, blue_y, c='b', marker='.')
plt.show()

六、算法优化

PCA是一种线性特征提取算法,通过计算将一组特征按重要性从小到大重新排列得到一组互不相关的新特征,但该算法在构造子集的过程中采用等权重的方式,忽略了不同属性对分类的贡献是不同的。

KPCA是一种改进的PCA非线性降维算法,它利用核函数的思想,把样本数据进行非线性变换,然后在变换空间进行PCA,这样就实现了非线性PCA。

局部PCA是一种改进的PCA局部降维算法,它在寻找主成分时加入一项具有局部光滑性的正则项,从而使主成分保留更多的局部性信息。

到此这篇关于Python机器学习之PCA降维算法详解的文章就介绍到这了,更多相关Python PCA降维算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文