为什么我的 PCA 回旋镖在归一化时是形状的?

数据挖掘 主成分分析 正常化
2022-03-08 05:16:28

运行我的数据的无监督图,我注意到一个双曲线(“回旋镖”)形状:

dim=2

vectorizer = TfidfVectorizer(min_df=5, max_df = 0.4, stop_words = 'english')
train_tf_idf = vectorizer.fit_transform(bunch_train.data)
svd = TruncatedSVD(n_components=dim,random_state=42)
svd_train = svd.fit_transform(train_tf_idf)
svd_train = Normalizer().fit_transform(svd_train)

labels = {
        0:'alt.atheism',
        1:'comp.graphics',
        2:'sci.med'}
y = np.vectorize(labels.get)(bunch_train.target)

with plt.style.context('seaborn-whitegrid'):
    plt.figure(figsize=(12, 8))
    for lab, col in zip(('alt.atheism', 'comp.graphics', 'sci.med'),
                        ('blue', 'red', 'green')):
        plt.scatter(svd_train[y==lab, 0],
                    svd_train[y==lab, 1],
                    label=lab,
                    c=col)

    plt.title('2D SVD on TF-IDF - 3-NewsGroups',size=28)
    plt.xlabel('PC1')
    plt.ylabel('PC2')
    plt.legend(loc='upper left',prop={'size': 20})
    plt.tight_layout()
    plt.show()

在此处输入图像描述

我怀疑它与 Normalizer 有关 - 删除以下行时:

svd_train = Normalizer().fit_transform(svd_train)

数据图如下:

在此处输入图像描述

1个回答

这里的问题是您正在标准化 SVD 的输出。如果您考虑每个步骤的输出,则可能很明显不需要对该输出进行归一化:

  1. 矢量化器:[n_items x n_words] 矩阵。未归一化。
  2. TFIDF:[n_items x n_words] 行归一化为单位欧几里得范数的矩阵。
  3. SVD:[n_items x dim] 矩阵。列对应于每行加载到两个正交单位向量上。

简而言之,第三步 (SVD) 的输出按原样有意义,而归一化模糊了该含义。

至于为什么归一化的输出看起来是弯曲的?显示这一点的数学似乎有点复杂,但我的直觉是标准化是将行权重映射到SVD 中使用的椭球流形上。