Python 基于word2vec嵌入的主成分分析

Python 基于word2vec嵌入的主成分分析,python,scikit-learn,nlp,pca,word2vec,Python,Scikit Learn,Nlp,Pca,Word2vec,我试图重现本文的结果: 具体而言,本部分: 为了识别性别子空间,我们提取了10个性别对差异向量并计算其主成分(PCs)。如图6所示,有一个方向可以解释这些向量中的大部分方差。第一个特征值明显大于其他特征值 我使用与作者相同的词向量集(谷歌新闻语料库,300维),我将其加载到word2vec中 作者所指的“十种性别对差异向量”是从以下词对计算得出的: 我用以下方法计算了每个标准化向量之间的差异: model = gensim.models.KeyedVectors.load_word2vec_

我试图重现本文的结果:

具体而言,本部分:

为了识别性别子空间,我们提取了10个性别对差异向量并计算其主成分(PCs)。如图6所示,有一个方向可以解释这些向量中的大部分方差。第一个特征值明显大于其他特征值

我使用与作者相同的词向量集(谷歌新闻语料库,300维),我将其加载到word2vec中

作者所指的“十种性别对差异向量”是从以下词对计算得出的:

我用以下方法计算了每个标准化向量之间的差异:

model = gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-
negative300.bin', binary = True)
model.init_sims()

pairs = [('she', 'he'),
('her', 'his'),
('woman', 'man'),
('Mary', 'John'),
('herself', 'himself'),
('daughter', 'son'),
('mother', 'father'),
('gal', 'guy'),
('girl', 'boy'),
('female', 'male')]

difference_matrix = np.array([model.word_vec(a[0], use_norm=True) - model.word_vec(a[1], use_norm=True) for a in pairs])
然后,我对结果矩阵(包含10个分量)执行PCA,如论文所述:

from sklearn.decomposition import PCA
pca = PCA(n_components=10)
pca.fit(difference_matrix)
然而,当我看pca时,我得到了非常不同的结果

array([  2.83391436e-01,   2.48616155e-01,   1.90642492e-01,
         9.98411858e-02,   5.61260498e-02,   5.29706681e-02,
         2.75670634e-02,   2.21957722e-02,   1.86491774e-02,
         1.99108478e-32])
或使用图表:

当第一个分量应大于60%时,它所占的方差小于30%

我得到的结果与我尝试对随机选择的向量进行PCA时得到的结果相似,所以我一定是做错了什么,但我不知道是什么


注意:我尝试过不规范化向量,但得到了相同的结果。

他们在github上发布了论文的代码:

具体来说,您可以在文件中看到他们创建PCA绘图的代码

以下是该文件中的相关代码片段:

def doPCA(pairs, embedding, num_components = 10):
    matrix = []
    for a, b in pairs:
        center = (embedding.v(a) + embedding.v(b))/2
        matrix.append(embedding.v(a) - center)
        matrix.append(embedding.v(b) - center)
    matrix = np.array(matrix)
    pca = PCA(n_components = num_components)
    pca.fit(matrix)
    # bar(range(num_components), pca.explained_variance_ratio_)
    return pca
根据代码,看起来他们在计算一对中每个单词之间的差值和该对的平均向量。对我来说,不清楚这是他们在报纸上的意思。但是,我用它们的配对运行了这段代码,并能够从论文中重新创建图形:

from sklearn.decomposition import PCA
pca = PCA(n_components=10)
pca.fit(difference_matrix)

要详细介绍牛至的答案:

对于每对a和b,它们计算中心c=(a+b)/2,然后包括指向两个方向的向量a-c和b-c

这一点至关重要的原因是主成分分析为您提供了方差最大的向量。你所有的向量都指向同一个方向,所以在你试图揭示的方向上几乎没有变化


他们的集合包括指向性别子空间中两个方向的向量,因此PCA清楚地揭示了性别变化。

你的意思是将差异矩阵向量归一化了吗?如果我这样做,我会得到更均匀的方差。。。奇怪的是,如果我计算平均值的方差而不是差值,我得到的结果看起来更像我们正在寻找的“计算方差”,我的意思是看解释的方差比。在对图形描述进行剖分后,他们似乎计算了差值,然后对结果向量进行归一化。在代码中,首先规范化两个向量,然后进行减法。通过这样做,您基本上可以防止嵌入算法工作,而且您的PCA输入也不会被标准化,因为单位向量的差异不必有一个单位标准,只是出于好奇-您能够找到答案吗?我已经试过你们的代码,有差异标准化和没有差异标准化——它并没有明显改变画面。