前言
网上一堆狂吹PCA和讲原理的,可就是不讲怎么用。
给了代码的,拿过来用效果贼差,毕竟那些只是为了画图的代码而已。。。
上代码
真正使用,分3步即可:
1、数据预处理(非常重要!!!)——零均值化和缩放
原因可以看网上原理教程,这里只关心怎么做。
很简单:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(des_query)
des_query = scaler.transform(des_query)
des_train = scaler.transform(des_train)
2、真正执行PCA
from sklearn.decomposition import PCA
pca = PCA(n_components=32, whiten=True).fit(des_query_new)
des_query_pca = pca.transform(des_query)
des_train_pca = pca.transform(des_train)
3、对结果再做归一化(欧氏距离就用l2)
import torch
def desc_l2norm(desc):
eps_l2_norm = 1e-10
return (desc / torch.Tensor(desc).pow(2).sum(dim=1, keepdim=True).add(eps_l2_norm).pow(0.5)).numpy()
des_query_new = desc_l2norm(des_query_pca)
des_train_new = desc_l2norm(des_train_pca)
4、注意train和query要用同一个fit,因为不然分开学习,肯定最后结果是个“0”。这里具体fit内容怎么设置,我还没整明白,随大流填个query的吧。。。
运行结果
这时候再去做匹配,发现维度下降,有效果且精度甚至会上升。(图就不画了,懒。。。)
注意:这里只是粗匹配上升了啊,它很可能有很多的误匹配的!!!
后言
其他还有umap可以玩玩。
评论 (0)