数据预处理——数据降维(主成分分析)

数据降维
在构建机器学习模型时,有时特征是极其复杂,当特征的维度达到几千维时,模型训练将会耗费大量的时间。另外,如果特征较多,还会出现多重共线性、稀疏性的问题。
因此,需要简化属性、去噪、去冗余,以求取更典型的属性,但同时又不希望不损失数据本身的意义,这时就需要对特征进行降维。
1.降维的方法
数据降维分为线性降维和非线性降维。
(1)线性降维:分为主成分分析(PCA)、线性判断分析(LDA)。
(2)非线性降维:分为基于核函数的KPCA、KICA、KDA和基于特征值的ISOMAP、LLE、LE、LPP、LTSA、MVU等。
我们主要来聊聊主成分分析(Principal Component Analysis)
主成分分析是一种统计方法,通过正交变换,将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。
在数据分析中,常使用PCA给数据降维,它能在指定的损失范围内最大限度地简化属性。
PCA的核心知识点是:协方差矩阵和特征值分解
这里要弄清楚的东西是:
1.均值 一组数据的平均水平。对应公式为:
在这里插入图片描述
2.标准差 一组数据的离散程度。对应公式为:
在这里插入图片描述

3.方差 标准差的平方,也表示一组数据的离散程度。计算公式为:
在这里插入图片描述
4.协方差 表示的也是一组数据的离散程度。对应的计算公式为:
在这里插入图片描述
当x和y相等时,协方差等于方差,即方差是协方差的一种特殊情况。
协方差的计算结果分为三种情况。
大于0:表示两个随机变量正相关
等于0:表示两个随机变量不相关
小于0:表示两个随机变量负相关

协方差矩阵:协方差只能表示两个随机变量的相互关系。如果有多个随机变量,则需要使用协方差矩阵。假设有三个随机变量x,y,z,那么对应的协方差矩阵为:
在这里插入图片描述
PCA的降维过程如下:
(1)对特征进行标准化
(2)计算协方差矩阵
(3)计算协方差矩阵的特征值和特征向量
(4)选取最大的k个特征值对应的特征向量,得到特征向量矩阵
(5)将数据变换到K维,得到新的数据集
大家可以根据下面这个例子看看:
鸢尾花数据集是一个多重变量分析的数据集,其中包含150个数据集,分为3类,每类50个数据。每个数据包含花萼长度、花萼宽度、花瓣长度、花瓣宽度4个属性。
利用这些属性特征可以预测某个鸢尾花属于Setosa、Versicolour、VIrginica 三个种类中的哪一类!
详见

https://blog.csdn.net/weixin_44435674/article/details/104133388
数据集已经上传!

下面是对1鸢尾花数据集特征进行降维

# -*-coding:utf-8-*-


import numpy as np
from sklearn import datasets

class PCATest:
    def __init__(self):
        pass

    # 加载鸢尾花数据集中的特征作为PCA的原始数据集 并进行标准化
    def loadIris(self):
        data = datasets.load_iris()["data"]
        return data

    # 标准化数据
    def Standard(self,data):
        # axis=0按列取均值
        mean_vector=np.mean(data,axis=0)
        return mean_vector,data - mean_vector

    # 计算协方差矩阵
    def getCovMatrix(self,newData):
        # rowvar=0表示数据的每一列代表一个feature
        return np.cov(newData,rowvar=0)

    # 计算协方差矩阵的特征值和特征向量
    def getFValueAndFVector(self,covMatrix):
        fValue,fVector = np.linalg.eig(covMatrix)
        return fValue,fVector

    # 得到特征向量矩阵
    def getVectorMatrix(self,fValue,fVector,k):
        fValueSort = np.argsort(fValue)
        fValueTopN = fValueSort[:-(k + 1):-1]
        return fVector[:,fValueTopN]

    # 得到降维后的数据
    def getResult(self,data,vectorMatrix):
        return np.dot(data,vectorMatrix)

if __name__ == "__main__":
    # 创建PCA对象
    pcatest = PCATest()
    # 加载iris数据集
    data = pcatest.loadIris()
    # 归一化数据
    mean_vector,newData = pcatest.Standard(data)
    # 得到协方差矩阵
    covMatrix = pcatest.getCovMatrix(newData)
    print("协方差矩阵为:\n {}".format(covMatrix))
    # 得到特征值和特征向量
    fValue, fVector = pcatest.getFValueAndFVector(covMatrix)
    print("特征值为:{}".format(fValue))
    print("特征向量为:\n{}".format(fVector))
    # 得到要降到k维的特征向量矩阵
    vectorMatrix = pcatest.getVectorMatrix(fValue, fVector, k=2)
    print("K维特征向量矩阵为:\n{}".format(vectorMatrix))
    # 计算结果
    result = pcatest.getResult(newData,vectorMatrix)
    print("最终降维结果为:\n{}".format(result))
    # 得到重构数据
    print("最终重构结果为:\n{}".format( np.mat(result) * vectorMatrix.T + mean_vector) )

码字不易,例行求个赞!

你可能感兴趣的:(Python,数据分析,推荐系统)