IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> sklearn 中 pca.components_ -> 正文阅读

[人工智能]sklearn 中 pca.components_

作者:>

通过李航的《统计学习方法》(我愿称之为最强),可以很清晰地知道PCA的证明和各个参数的的定义。

pca主成分求解的过程是:

  1. 将数据进行标准化处理(均值为0,方差为1(可选))
  2. 求原样本中n个特征的协方差矩阵
  3. 对协方差矩阵进行特征值分解,并将特征向量组成的矩阵按照对应特征值的大小顺序进行排序,前 k 个特征向量即为前k个主成分。

所以我们完全可以根据定义去求解pca,在《机器学习实战》上有详细的代码:

'''
Created on Jun 1, 2011

@author: Peter Harrington
'''
from numpy import *


def loadDataSet(fileName, delim='\t'):
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [list(map(float, line)) for line in stringArr]
    dataMat = mat(datArr)
    return dataMat


def pca(dataMat, topNfeat=9999999):
    # 首先将对数据进行去中心化
    meanVal = mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVal
    # 计算协方差矩阵
    covMat = cov(meanRemoved, rowvar=False)  #
    # 计算协方差矩阵的特征值和特征向量
    eigVals, eigVects = linalg.eig(covMat)
    eigValInd = argsort(eigVals)  # 从小到大排序
    eigValInd = eigValInd[:-(topNfeat + 1):-1]  # 挑选出最大的topNfeat个特征值
    redEigVects = eigVects[:, eigValInd]
    lowDData = meanRemoved * redEigVects

    reconMat = (lowDData * redEigVects.T) + meanVal
    return lowDData, reconMat

dataMat = loadDataSet('testSet.txt')
lowDMat, reconMat = pca(dataMat, 2)
print(f"lowDMat: {lowDMat}")
print(f"reconmat: {reconMat}")  # 将降维后的data投影回原来的空间中

然后再介绍sklearn.decomposition 中的PCA类。
个人觉得非常方便

from sklearn.decomposition import PCA
dataMat = loadData(filename)
# 定义一个pca类
pca = PCA(n_components = 2)
# 因为pca算法是一个无监督算法,所以可以直接fit_transform
# 不需要y
# transformdData 就是投影到新的正交基上的n_components个主成分
transformdData = pca.fit_transform(dataMat)

然后我使用两个算法求解同一组数据的主成分,发现我们手写的算法求出来的主成分(即redEigVects)和sklearn中求出来的(pca.components_)不一样,而且很有规律,求出来的两个东西恰好是转置关系。

然后再去翻书(统计学习方法),这里再夸一下这本书 (/dog),书中介绍了一种除定义之外的求解方法,使用SVD分解求解。
具体的求解方法我就不在这里贴了(大家可以自行翻阅),在书中写得非常好。
具体的步骤就是:

  1. 构造一个新的矩阵 X ′ = 1 n ? 1 X X^{'} = \frac{1}{\sqrt{n - 1}} X X=n?1 ?1?X
  2. 然后对这个新的矩阵进行SVD分解, X ′ = U Σ V T X^{'} = U\Sigma V^{T} X=UΣVT
  3. 这里的V就是我们要求的定义中的特征向量构成的排序好的matrix

在这里再介绍另一个非常方便的函数np.linalg.svd(X)
这个方法可以非常方便帮助我们求解矩阵的SVD分解
U , Σ , V T = s v d ( X ) U, \Sigma , V^{T} = svd(X) U,Σ,VT=svd(X)
这里一定要记住是 V T V^{T} VT 而不是V
然后再放上sklearn中的源码片段

 #SVD分解
 U, S, V = linalg.svd(X, full_matrices=False)
 # ...
self.components_ = components_[:n_components]
# ...

然后就能找到原因了,我们拿到的其实是 V T V^{T} VT

主成分是 V T V^{T} VT的 row-vector,而我们容易将它错当成columnn-vector

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-17 01:27:50  更:2021-08-17 01:28:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 20:19:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码