我想使用主成分分析(PCA)来降低维数.numpy或scipy已经拥有它,还是我必须自己使用numpy.linalg.eigh
?
我不只是想使用奇异值分解(SVD),因为我的输入数据是相当高维的(~460维),所以我认为SVD比计算协方差矩阵的特征向量慢.
我希望找到一个预制的,已调试的实现,它已经为何时使用哪种方法做出了正确的决定,并且可能做了其他我不了解的优化.
我正在尝试从使用scikit-learn完成的PCA中恢复,这些功能被选为相关的.
IRIS数据集的典型示例.
import pandas as pd
import pylab as pl
from sklearn import datasets
from sklearn.decomposition import PCA
# load dataset
iris = datasets.load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
# normalize data
df_norm = (df - df.mean()) / df.std()
# PCA
pca = PCA(n_components=2)
pca.fit_transform(df_norm.values)
print pca.explained_variance_ratio_
Run Code Online (Sandbox Code Playgroud)
这回来了
In [42]: pca.explained_variance_ratio_
Out[42]: array([ 0.72770452, 0.23030523])
Run Code Online (Sandbox Code Playgroud)
如何恢复哪两个特征允许数据集中这两个解释的方差? 不同地说,如何在iris.feature_names中获取此功能的索引?
In [47]: print iris.feature_names
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助.
我有一个(26424 x 144)数组,我想用Python执行PCA.但是,网上没有特别的地方可以解释如何实现这个任务(有些网站只是按照自己的方式做PCA - 我没有找到这样做的通用方法).任何有任何帮助的人都会做得很好.
如何根据pandas数据框中的数据计算主成分分析?
我想知道是否有可能用ggplot2绘制pca biplot结果.假设我想用ggplot2显示以下双标图结果
fit <- princomp(USArrests, cor=TRUE)
summary(fit)
biplot(fit)
Run Code Online (Sandbox Code Playgroud)
任何帮助将受到高度赞赏.谢谢
在R中有没有办法选择许多非连续的,即奇数或偶数行/列?
我正在绘制我的主成分分析的负载.我有84行数据如下:x_1
y_1
x_2
.....x_42
y_42
目前我正在为x和y加载数据创建数据帧,如下所示:
data.pc = princomp(as.matrix(data))
x.loadings <- data.frame(x=data.pc$loadings[c(1, 3, 5, 7, 9, 11, 13 ,15, 17, 19,
21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41), 1])
yloadings <- data.frame(y=data.pc$loadings[c(2, 4, 6, 8, 10, 12, 14, 16, 18, 20,
22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42), 1])
Run Code Online (Sandbox Code Playgroud)
当然有更简单的方法吗?
如何获得PCA应用的特征值和特征向量?
from sklearn.decomposition import PCA
clf=PCA(0.98,whiten=True) #converse 98% variance
X_train=clf.fit_transform(X_train)
X_test=clf.transform(X_test)
Run Code Online (Sandbox Code Playgroud)
我在文档中找不到它.
我"不能"理解这里的不同结果.
编辑:
def pca_code(data):
#raw_implementation
var_per=.98
data-=np.mean(data, axis=0)
data/=np.std(data, axis=0)
cov_mat=np.cov(data, rowvar=False)
evals, evecs = np.linalg.eigh(cov_mat)
idx = np.argsort(evals)[::-1]
evecs = evecs[:,idx]
evals = evals[idx]
variance_retained=np.cumsum(evals)/np.sum(evals)
index=np.argmax(variance_retained>=var_per)
evecs = evecs[:,:index+1]
reduced_data=np.dot(evecs.T, data.T).T
print(evals)
print("_"*30)
print(evecs)
print("_"*30)
#using scipy package
clf=PCA(var_per)
X_train=data.T
X_train=clf.fit_transform(X_train)
print(clf.explained_variance_)
print("_"*30)
print(clf.components_)
print("__"*30)
Run Code Online (Sandbox Code Playgroud)
大师,
当选择主成分数(k)时,我们选择k作为最小值,以便保留例如99%的方差.
但是,在Python Scikit学习中,我不是100%肯定pca.explained_variance_ratio_ = 0.99等于"99%的方差被保留"?谁能开导?谢谢.
我一直在比较Python和R的几个PCA实现的性能,并注意到一个有趣的行为:
虽然在Python中计算稀疏矩阵的PCA似乎是不可能的(唯一的方法是scikit-learn的 TruncatedSVD,但它确实如此)不支持平均居中要求等同于PCA的协方差解决方案.他们的论证是,它会破坏矩阵的稀疏性.其他实现如Facebook的PCA算法或scikit中的PCA/randomPCA方法学习不支持稀疏矩阵出于类似的原因.
虽然所有这些对我来说都是有意义的,但是几个R包,如irlba,rsvd等,能够处理稀疏矩阵(例如生成rsparsematrix
),甚至允许特定的center=True
参数.
我的问题是,R如何在内部处理它,因为它似乎比类似的Python实现更有效.R是否仍然通过绝对缩放来保持稀疏性(这理论上会伪造结果,但至少保持稀疏性)?或者有没有任何方法可以明确地为零值存储均值,并且只存储一次(而不是分别存储每个值)?
为了得到推迟:R内部如何存储具有均值中心的矩阵而不会爆炸RAM使用.希望足够简洁....
我试图在维度为mxn的矩阵上运行PCA,其中m是要素的数量,n是样本的数量.
假设我想保留nf
具有最大方差的要素.随着scikit-learn
我能够做到这样:
from sklearn.decomposition import PCA
nf = 100
pca = PCA(n_components=nf)
# X is the matrix transposed (n samples on the rows, m features on the columns)
pca.fit(X)
X_new = pca.transform(X)
Run Code Online (Sandbox Code Playgroud)
现在,我得到一个X_new
形状为nx nf 的新矩阵.是否可以知道哪些功能已被丢弃或保留哪些功能?
谢谢