即使保留所有维度,PCA 也会影响相似性比较

问题描述 投票:0回答:1

考虑:

from sklearn.decomposition import PCA
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

def do_pca(X, n_components):
    print(f"Doing PCA from {X.shape[0]} vectors")
    pca = PCA(n_components=n_components)
    X_pca = pca.fit_transform(X)
    print('Explained variance:',
          sum(pca.explained_variance_ratio_[:n_components]))
    return pca

def by_relevance(vectors, key_vector):
    rankings = [
        (i, cosine_similarity(v.reshape(1,-1), key_vector.reshape(1,-1)))
        for i, v in enumerate(vectors)]
    rankings.sort(key=lambda el:-el[1])
    for i, r in rankings:
        print(i, r)

np.random.seed(1)
X = np.random.random((50, 20))
pca = do_pca(X, n_components=20)

X = X[:5]
key_vector = X[[0]]
by_relevance(X, key_vector)
print()
by_relevance(pca.transform(X), pca.transform(key_vector))

此代码对 50 个向量执行 PCA,同时保留与维度一样多的分量。函数

by_relevance
根据与给定向量的相似度对向量进行排序。我们调用这个函数两次——一次在转换之前,一次在转换之后。由于保留了所有组件,因此我预计两次调用都会得到类似的结果。然而,这是输出:

Doing PCA from 50 vectors
Explained variance: 1.0
0 [[1.]]
4 [[0.78738484]]
1 [[0.73532448]]
3 [[0.71538191]]
2 [[0.6614021]]

0 [[1.]]
4 [[0.01659682]]
3 [[-0.02417426]]
1 [[-0.02855172]]
2 [[-0.03232985]]

为什么排名会受影响?为什么最后四个相似度变得这么小?

python scikit-learn pca
1个回答
0
投票

随机样本之间的余弦相似度应接近于零。对于未转换的数据,余弦相似度如此高的原因是所有点/向量都位于第一象限。如果在计算 PC 之前对数据进行去均值处理,则两个条件之间的结果会更加相似,即匹配向量的余弦相似度为 1,而其他地方的余弦相似度为零。

import numpy as np
from sklearn.decomposition import PCA
from sklearn.metrics.pairwise import cosine_similarity

np.random.seed(1)
X = np.random.random((50, 20))
X -= np.full_like(X, 0.5)
pca = PCA(n_components=20).fit(X)

X = X[:5]
key_vector = X[[0]]

print(cosine_similarity(X, key_vector))
print(cosine_similarity(pca.transform(X), pca.transform(key_vector)))

# [[ 1.        ]
#  [-0.01928803]
#  [ 0.0100122 ]
#  [-0.06792705]
#  [ 0.01940078]]
# [[ 1.        ]
#  [-0.02855172]
#  [-0.03232985]
#  [-0.02417426]
#  [ 0.01659682]]
© www.soinside.com 2019 - 2024. All rights reserved.