考虑:
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]]
为什么排名会受影响?为什么最后四个相似度变得这么小?
随机样本之间的余弦相似度应接近于零。对于未转换的数据,余弦相似度如此高的原因是所有点/向量都位于第一象限。如果在计算 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]]