我正在使用此处的输入数据(参见第3.1节).
我试图使用scikit-learn重现它们的协方差矩阵,特征值和特征向量.但是,我无法重现数据源中显示的结果.我也在其他地方看过这个输入数据,但是我无法辨别它是scikit-learn,我的步骤还是数据源的问题.
data = np.array([[2.5,2.4],
[0.5,0.7],
[2.2,2.9],
[1.9,2.2],
[3.1,3.0],
[2.3,2.7],
[2.0,1.6],
[1.0,1.1],
[1.5,1.6],
[1.1,0.9],
])
centered_data = data-data.mean(axis=0)
pca = PCA()
pca.fit(centered_data)
print(pca.get_covariance()) #Covariance Matrix
array([[ 0.5549, 0.5539],
[ 0.5539, 0.6449]])
print(pca.explained_variance_ratio_) #Eigenvalues (normalized)
[ 0.96318131 0.03681869]
print(pca.components_) #Eigenvectors
[[-0.6778734 -0.73517866]
[ 0.73517866 -0.6778734 ]]
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,投影与来自上述数据源的结果相匹配.
print(pca.transform(centered_data)) #Projections
array([[-0.82797019, 0.17511531],
[ 1.77758033, -0.14285723],
[-0.99219749, -0.38437499],
[-0.27421042, -0.13041721],
[-1.67580142, 0.20949846],
[-0.9129491 , -0.17528244],
[ 0.09910944, 0.3498247 ],
[ 1.14457216, -0.04641726],
[ 0.43804614, -0.01776463],
[ 1.22382056, 0.16267529]])
Run Code Online (Sandbox Code Playgroud)
这是我不明白的:
我有一个包含51608个变量(列)的9个样本(行)的数据集,每当我尝试缩放它时,我都会收到错误:
这很好用
pca = prcomp(pca_data)
Run Code Online (Sandbox Code Playgroud)
然而,
pca = prcomp(pca_data, scale = T)
Run Code Online (Sandbox Code Playgroud)
给
> Error in prcomp.default(pca_data, center = T, scale = T) :
cannot rescale a constant/zero column to unit variance
Run Code Online (Sandbox Code Playgroud)
显然,发布一个可重复的例子有点困难.任何想法可能是什么交易?
寻找恒定列:
sapply(1:ncol(pca_data), function(x){
length = unique(pca_data[, x]) %>% length
}) %>% table
Run Code Online (Sandbox Code Playgroud)
输出:
.
2 3 4 5 6 7 8 9
3892 4189 2124 1783 1622 2078 5179 30741
Run Code Online (Sandbox Code Playgroud)
所以没有恒定的列.与NA相同 -
is.na(pca_data) %>% sum
>[1] 0
Run Code Online (Sandbox Code Playgroud)
这很好用:
pca_data = scale(pca_data)
Run Code Online (Sandbox Code Playgroud)
但之后两者仍然给出完全相同的错误:
pca = prcomp(pca_data)
pca = …Run Code Online (Sandbox Code Playgroud) 我正在尝试跟随Abdi&Williams - Principal Component Analysis(2010)并通过SVD构建主要组件,使用numpy.linalg.svd.
当我components_从带有sklearn的拟合PCA 显示属性时,它们的大小与我手动计算的大小完全相同,但有些(不是全部)符号相反.是什么导致了这个?
更新:我的(部分)答案包含一些其他信息.
以下示例数据为例:
from pandas_datareader.data import DataReader as dr
import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import scale
# sample data - shape (20, 3), each column standardized to N~(0,1)
rates = scale(dr(['DGS5', 'DGS10', 'DGS30'], 'fred',
start='2017-01-01', end='2017-02-01').pct_change().dropna())
# with sklearn PCA:
pca = PCA().fit(rates)
print(pca.components_)
[[-0.58365629 -0.58614003 -0.56194768]
[-0.43328092 -0.36048659 0.82602486]
[-0.68674084 0.72559581 -0.04356302]]
# compare to the manual method via SVD: …Run Code Online (Sandbox Code Playgroud) 我使用这个简单的代码在具有10个功能的数据框架上运行PCA:
pca = PCA()
fit = pca.fit(dfPca)
Run Code Online (Sandbox Code Playgroud)
结果pca.explained_variance_ratio_显示:
array([ 5.01173322e-01, 2.98421951e-01, 1.00968655e-01,
4.28813755e-02, 2.46887288e-02, 1.40976609e-02,
1.24905823e-02, 3.43255532e-03, 1.84516942e-03,
4.50314168e-16])
Run Code Online (Sandbox Code Playgroud)
我认为这意味着第一台PC解释了52%的差异,第二部分解释了29%等等......
我不明白的是输出pca.components_.如果我执行以下操作:
df = pd.DataFrame(pca.components_, columns=list(dfPca.columns))
Run Code Online (Sandbox Code Playgroud)
我得到的数据框低于每一行是主要成分.我想要了解的是如何解释该表.我知道如果我对每个组件的所有功能进行平方并对它们求和,我得到1,但PC1上的-0.56是什么意思?它告诉了一些关于"特征E"的东西,因为它是一个解释了52%方差的组件的最高等级?
谢谢
我想比较算法的输出与不同的预处理数据:NMF和PCA.为了获得可比较的结果,而不是为每个PCA和NMF选择相同数量的组件,我想选择解释的量,例如95%的保留方差.
我想知道是否有可能确定NMF每个组成部分保留的差异.
例如,使用PCA,这将通过以下方式给出:
retainedVariance(i) = eigenvalue(i) / sum(eigenvalue)
有任何想法吗?
pca dimensionality-reduction scikit-learn matrix-factorization nmf
我对原始数据集进行了PCA分析,并且从PCA转换的压缩数据集中,我还选择了我想要保留的PC数量(它们几乎解释了94%的方差).现在,我正在努力识别在简化数据集中重要的原始特征.在降维后,如何找出哪些特征是重要的,哪些特征不在剩余的主要组件中?这是我的代码:
from sklearn.decomposition import PCA
pca = PCA(n_components=8)
pca.fit(scaledDataset)
projection = pca.transform(scaledDataset)
Run Code Online (Sandbox Code Playgroud)
此外,我还尝试对简化数据集执行聚类算法,但令我惊讶的是,得分低于原始数据集.这怎么可能?
我想在一个具有20个时间序列作为一个实例的特征的数据集上应用PCA。我有大约1000个此类实例,我正在寻找一种降低维数的方法。对于每个实例,我都有一个熊猫数据框,例如:
import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.random.normal(0, 1, (300, 20)))
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以sklearn.fit在所有实例上使用,每个实例都有一组时间序列作为特征空间。我的意思是我可以将sklearn.fit分别应用于所有实例,但是我希望所有实例都具有相同的主要组成部分。
有办法吗?到目前为止,我唯一不满意的想法是将一个实例的所有那些序列附加到一个实例上,这样我就有一个实例的时间序列。
我尝试使用matplotlib.mlab.PCA进行简单的主成分分析但是使用类的属性我无法得到一个干净的解决方案来解决我的问题.这是一个例子:
在2D中获取一些虚拟数据并启动PCA:
from matplotlib.mlab import PCA
import numpy as np
N = 1000
xTrue = np.linspace(0,1000,N)
yTrue = 3*xTrue
xData = xTrue + np.random.normal(0, 100, N)
yData = yTrue + np.random.normal(0, 100, N)
xData = np.reshape(xData, (N, 1))
yData = np.reshape(yData, (N, 1))
data = np.hstack((xData, yData))
test2PCA = PCA(data)
Run Code Online (Sandbox Code Playgroud)
现在,我只想将主要组件作为原始坐标中的向量,并将它们绘制为我的数据上的箭头.
什么是快速而干净的方式到达那里?
谢谢Tyrax
我正在尝试使用python进行分类.我正在使用Naive Bayes MultinomialNB分类器用于网页(从网络检索数据到文本,稍后我将此文本分类为:web分类).
现在,我正在尝试对这些数据应用PCA,但是python会给出一些错误.
我的朴素贝叶斯分类代码:
from sklearn import PCA
from sklearn import RandomizedPCA
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
vectorizer = CountVectorizer()
classifer = MultinomialNB(alpha=.01)
x_train = vectorizer.fit_transform(temizdata)
classifer.fit(x_train, y_train)
Run Code Online (Sandbox Code Playgroud)
这种天真的贝叶斯分类给出了输出:
>>> x_train
<43x4429 sparse matrix of type '<class 'numpy.int64'>'
with 6302 stored elements in Compressed Sparse Row format>
>>> print(x_train)
(0, 2966) 1
(0, 1974) 1
(0, 3296) 1
..
..
(42, 1629) 1
(42, 2833) 1
(42, 876) 1
Run Code Online (Sandbox Code Playgroud)
比我尝试在我的数据上应用PCA(temizdata):
>>> v_temizdata = vectorizer.fit_transform(temizdata) …Run Code Online (Sandbox Code Playgroud) 与sklearn的PCA不同,TruncatedSVD的解释方差比率不是降序.我查看了源代码,似乎他们使用不同的方式计算解释的方差比:
U, Sigma, VT = randomized_svd(X, self.n_components,
n_iter=self.n_iter,
random_state=random_state)
X_transformed = np.dot(U, np.diag(Sigma))
self.explained_variance_ = exp_var = np.var(X_transformed, axis=0)
if sp.issparse(X):
_, full_var = mean_variance_axis(X, axis=0)
full_var = full_var.sum()
else:
full_var = np.var(X, axis=0).sum()
self.explained_variance_ratio_ = exp_var / full_var
Run Code Online (Sandbox Code Playgroud)
PCA:
U, S, V = linalg.svd(X, full_matrices=False)
explained_variance_ = (S ** 2) / n_samples
explained_variance_ratio_ = (explained_variance_ /
explained_variance_.sum())
Run Code Online (Sandbox Code Playgroud)
PCA使用sigma直接计算explain_variance,由于sigma按降序排列,explain_variance也按降序排列.另一方面,TruncatedSVD使用变换矩阵的列的方差来计算explain_variance,因此方差不一定按降序排列.
这是否意味着我需要explained_variance_ratio从头TruncatedSVD开始排序才能找到前k个主要组件?
pca ×10
scikit-learn ×8
python ×7
math ×1
matplotlib ×1
matrix ×1
naivebayes ×1
nmf ×1
numpy ×1
prcomp ×1
python-3.x ×1
r ×1
svd ×1
time-series ×1