PCA求解思路
来源:互联网 发布:linux终端装中文输入法 编辑:程序博客网 时间:2024/05/01 12:20
学习完了NG的PCA和《机器学习实战》的PCA
有一点很疑惑不解,对矩阵A,
NG是先用A - Amean,然后求协方差矩阵 covA = 1/m * AT * A 然后进行SVD分解,得到 U
因为 1/m*( AT * A) = V * (lambda**2/m) * VT ,所以其实就是求出对A进行SVD分解的V
《实战》是用A - Amean, 然后求协方差矩阵 covA = 1/m * AT *A 然后求特征值和特征向量
也就是对A进行 SVD分解之后得到的V
那么问题就来了,为什么一定要求协方差矩阵,而不是直接对A进行SVD分解得到V呢?
想太多也没有用,直接来实践吧,直接修改《实战》中的代码
原代码:
def pca(dataMat, topNfeat = 9999999):
meanVals = mean(dataMat, axis = 0)
meanRemoved = dataMat - meanVals
#covariance matrix, x.T * x
#If rowvar is True (default), then each row represents a variable, with observations in the columns
covMat = cov(meanRemoved, rowvar = False)
#Compute the eigenvalues and right eigenvectors of a square array.
eigVals,eigVects = linalg.eig(mat(covMat))
#Returns the indices that would sort an array.
eigValInd = argsort(eigVals)
eigValInd = eigValInd[:-(topNfeat + 1):-1]
redEigVects = eigVects[:,eigValInd]
lowDDataMat = meanRemoved * redEigVects
reconMat = (lowDDataMat * redEigVects.T) + meanVals
return lowDDataMat, reconMat
修改后的代码:
def pca(dataMat, topNfeat = 9999999):
meanVals = mean(dataMat, axis = 0)
meanRemoved = dataMat - meanVals
#covariance matrix, x.T * x
#If rowvar is True (default), then each row represents a variable, with observations in the columns
#covMat = cov(meanRemoved, rowvar = False)
#Compute the eigenvalues and right eigenvectors of a square array.
#eigVals,eigVects = linalg.eig(mat(covMat))
#Returns the indices that would sort an array.
s,eigVals,d = linalg.svd(meanRemoved)
eigVects = d.T
eigValInd = argsort(eigVals)
eigValInd = eigValInd[:-(topNfeat + 1):-1]
redEigVects = eigVects[:,eigValInd]
lowDDataMat = meanRemoved * redEigVects
reconMat = (lowDDataMat * redEigVects.T) + meanVals
return lowDDataMat, reconMat
只有一点点小改动,就是不求协方差矩阵,而是直接对减去平均值之后的矩阵进行SVD分解,然后求出V
然后得出的结果,一模一样
然后更改《实战》里查看特征值的代码
不求协方差矩阵,而是直接对减去平均值之后的矩阵进行SVD分解,然后查看lambda
记住协方差矩阵的特征值为lambda**2/m
所以我们对求得的lambda先平方,再除以样本的数目,得出的结果。。仍然是一模一样
也就是说,按照我的推论,不求协方差矩阵,而是直接对减去平均值之后的矩阵进行SVD分解,然后求出V,这样的推论是合理的。
如果有不对的地方,请大家回复一下帮我改正,感谢。
**************************************************************************分割线********************************************************************************
因为尝试了可以直接对减去平均值之后的矩阵进行SVD分解,然后求出V
又因为不理解PCA的本质,所以尝试了不减去平均值,直接对原矩阵进行SVD分解,
得出的结果如下
TruncatedSVD
is very similar to PCA
, but differs in that it works on sample matrices directly instead of their covariance matrices. When the columnwise (per-feature) means of are subtracted from the feature values, truncated SVD on the resulting matrix is equivalent to PCA.- PCA求解思路
- 动态规划求解思路
- 图像白化处理,协方差求解,PCA白化
- next数组的求解思路
- 编辑距离问题求解思路
- 八皇后问题一种求解思路
- hdu2955 解决问题的思路不错 逆向求解
- hdu 4339 Query(两种思路求解)
- 动态规划求解合唱队问题的思路
- C语言 素数三种思路求解
- 一种求解组合数的思路
- 算法求解方法与思路的总结
- 拆散组合思路求解期望,方差
- 科学技术法用string求解的思路
- 深度学习|神经网络模型求解思路总结
- PCA
- PCA
- PCA
- Java创建线程的两个方法
- 【Oh-Hard】瘦人增肌是不是要先吃胖?怎么练怎么吃?
- [LeetCode][11]Container With Most Water解析 时间复杂度为O(n) -Java实现
- iMindMap是怎样在学术研究上做贡献的
- CentOS 上通过 yum 快速安装最新版 Transmission
- PCA求解思路
- eclipse, Log4j配置(真心的详细~)
- jmp指令的机器码编写
- Linux下I2C驱动架构全面分析
- 网站建设的基础入门
- 它会知道什么编译的
- 非递归先,中,后遍历二叉树
- 对H264码流数据的NAL起始字节分析(档次、NALU类型)
- SQL SERVER 导入 EXCEL “文本被截断,或者一个或多个字符在目标代码页中没有匹配项”