pca.fit_transform(X)中X的数据类型是什么?

What is the data type of X in pca.fit_transform(X)?

我得到了 Gensim 训练的 word2vec 模型 abuse_model。我想应用 PCA 并绘制我只关心的某些单词(相对于模型中的所有单词)。因此,我创建了一个字典 d,它的键是我关心的单词,值是键的向量。

vocab = list(abuse_model.wv.key_to_index)
vocab = [v for v in vocab if v in positive_terms]
d = {}
for word in vocab:
    d[word] = abuse_model.wv[word]

到目前为止没有错误。

我在将字典传递给 pca.fit_transform 时遇到错误。我是新手,想知道我传入的数据格式(元组列表)是否不正确。参数必须是什么数据类型?

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
result = pca.fit_transform(list(d.items()))

提前致谢!

根据 scikit-learn 文档 – https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA.fit_transform.fit_transform() 的参数,通常用于 scikit-learn 模型,是“array-like 形状(n_samples, n_features)".

在这里,这意味着您的 samples/rows 是单词,features/columns 是 word-vector 维度。而且,您需要记住 PCA 对象的 outside 哪些单词对应于哪些行。 (在 Python 3.x 中,您的 d dict 将始终按插入顺序迭代这一事实应该已经涵盖了。)

因此,将您对 .items() 的使用更改为 .values() 可能就足够了,这样您就可以为 PCA 提供 list(这很合适array-like) 个向量。

其他一些注意事项:

  • .key_to_index 属性 已经是 list,所以你不需要 convert/copy 它
  • 如果您的 positive_terms 较大 list,将其更改为 set 可以提供更快的 in membership-testing
  • 而不是使用 d dict,这涉及更多的开销(包括当您随后对其值进行 list 时),如果您的 sets-of-words并且向量很大,您可能需要预先分配一个大小合适的 numpy 数组并在其中收集向量。例如:
X = np.empty((len(vocab), abuse_model.wv.vector_size)
for i, word in enumerate(vocab):
    X[i] = abuse_model.wv[word]

#...
#...

result = pca.fit_transform(X)
  • 即使您的预感是您只希望 dimensionality-reduction 出现在您的字词子集上,您可能还想尝试保留所有字词,或其他字词的一些随机子集 – 它 可能 有助于保留一些原始结构,否则,您的子采样将过早删除。 (对此不确定;只是注意到它可能是一个因素。)即使您对更大的单词集进行 PCA,为了清楚起见,您仍然可以选择稍后 plot/analyze 您想要的子集。