如何解决PCA 在维持低维空间中向量的接近性方面输给了截断 SVD - 为什么?
我有代表文本信息的高维向量(1024-dim)(NLP Bert模型的输出)。我想应用降维并尝试使用 LSA(截断 SVD)和 PCA。
我发现前者始终优于后者。我试图阅读这两种方法的详细信息,以了解这种持续表现优异的原因,但我仍然不确定截断 SVD 的优势是什么。
我按照 MWE 测试代码对随机向量进行了基准测试,这表明一旦投影到较低空间,LSA 减少可以更好地维持向量的接近度。我计算向量之间计算的余弦值之间的均方误差和皮尔逊相关性作为度量。
我认为这两种方法都很接近,所以我对降维结果如此不同感到有点惊讶。
import numpy as np
from numpy import dot
from numpy.linalg import norm
from scipy.stats.stats import pearsonr,spearmanr
from sklearn.decomposition import PCA
from sklearn.metrics import mean_squared_error
from sklearn.decomposition import TruncatedSVD
dim = 1024
num_elements = 2000
CUT_OFF = num_elements // 2
# Generating sample data
np.random.seed(4711)
data = np.float32(np.random.random((num_elements,dim)))
_train = data[:CUT_OFF]
_eval = data[CUT_OFF:]
def cosine(a,b):
return dot(a,b)/(norm(a)*norm(b))
def make(data):
scores = []
limit = len(data) // 2
for a in data:
for b in data:
scores.append(cosine(a,b))
return scores
baseline = make(_eval)
def truncSvd(components):
svd = TruncatedSVD(n_components=components-1,n_iter=10,random_state=42)
svd.fit(_train)
projected = svd.transform(_eval)
return make(projected),projected
def pca(components):
pca = PCA(n_components=components)
pca.fit(_train)
projected = pca.transform(_eval)
return make(projected),projected
def run(algo,name,new_dim):
comparison,_ = algo(new_dim)
pearson_r = pearsonr(baseline,comparison)[0]
mse = mean_squared_error(baseline,comparison)
print(f"[{name:10s}] components [{new_dim:4d}] - mse [{mse:.4f}] - pearson-r [{pearson_r:.4f}]")
# run comparison
for new_dim in [int(dim * .75),int(dim * .5),int(dim * .25),int(dim * .10)]:
run(truncSvd,"trunSVD",new_dim)
run(pca,"PCA",new_dim)
print("----")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。