Python中的谱聚类和多维缩放

时间:2015-10-04 06:22:40

标签: python machine-learning scikit-learn cluster-analysis

我使用光谱聚类来聚类一些单词特征向量。我使用单词向量的余弦相似度矩阵作为光谱聚类算法中的预先计算的亲和度矩阵。这就是我得到的三个集群。我使用群集分配作为标记来为点着色。

enter image description here 然而,我使用相同的余弦相似度矩阵并从中计算距离矩阵。

dist=1-cosimilarity. 

使用多维缩放算法可视化三维空间中的点。这就是我从中得到的。我使用那个实际的点标签来为点着色。

enter image description here

如果您看到MDS分组,则不会显示任何明显的群集分组,而Spectral分组似乎显示三个相当不错的群集。

1)。您认为原因可能是什么?因为MDS只是通过它们之间的距离在较低维度尺度上绘制点(MDS以较高维度减小点之间的距离与它们之间的距离相同,从而保持点之间的比例相同)并没有使用一些距离标准对它们进行聚类?我希望看到频谱结果有点类似于MDS,因为两者都在使用距离测量。只是聚类将附近的点融合成一个。虽然MDS正在密谋。但是在MDS中我使用了点的实际标签。这表明了事实真相吗?

2)。任何改进使用其他算法进行聚类的建议或看起来都不错?

编辑:

看起来有三组,但红色与蓝色和绿色组重叠。但是,如果我说它在我们看来是重叠的,因为我们无法看到超出3D的东西(无论如何在计算机屏幕上是2D)。如果我们碰巧在3D或甚至更多维度上看到红点,那么如果红点高于蓝色和绿色会怎样。

举一个例子:

让我们说你正在考虑三点。

enter image description here

想象一下,如果您寻找1D,上面看到的点会出现在您面前。也许是从顶部开始。

现在如果你能在2D中看到这些点怎么办?它如下所示。

enter image description here

如果你现在看到,所有三个点都是分开的。只是我们能够看到2D中的点,我们实际上能够看到从顶部和1D可视化时我们看起来像直线的点之间的关系。

所以你认为像上面这样的聚类结果实际上可能是一组明显分开的点,并且如果我们能够在3D中将它们可视化,那么我们目前看起来并没有很好地分离,那么它们与现实中的每个组距离相当远吗? 。这是否意味着可能存在上述情况,其中聚类结果的可视化可能不是正确的方式,因为它可能导致上述结论?。

编辑II:

使用以下代码运行DBSCAN算法:使用先前计算的距离矩阵作为DBSCAN的预先计算的矩阵

from sklearn.cluster import DBSCAN
    dbscan=DBSCAN(metric='precomputed')
    cluster_labels=dbscan.fit_predict(dist)

请记住,在所有光谱和DBSCAN中,我绘制的点是多维缩放算法的结果,是三维的。

DBSCAN图: enter image description here

编辑III:

相似度和距离矩阵的计算:

 from sklearn.metrics.pairwise import cosine_similarity

    cossim= cosine_similarity(X)

    dist=1-cossim

    dist=np.round(dist, 2)

编辑IV:

由于Anony-Mousse建议可能Cosine Similarity可能不是正确的指标,所以现在我所做的只是在DBSCAN算法中使用了原始的单词设计矩阵,并没有提供任何距离矩阵作为预先计算的选项。并将其留给sklearn来计算正确的亲和力矩阵。现在这就是我得到的。只有一个集群。就是这样。它根本没有分开点。 请记住,这是与上面使用的距离矩阵相同的数据点矩阵。基础数据点是相同的。

enter image description here

编辑V:

将包中的计数数据转换为tf-idf数据。

1)。关于预先计算的tf-idf字数据包的距离矩阵D53CAN。  在所有早期的方法中,我只使用count bag of words矩阵作为基础。现在我使用tf-idf矩阵作为余弦相似距离的基础。

远程矩阵上的DBSCAN: enter image description here

它有两种类型,但同样没有分离。

DBSCAN关于单词矩阵的原始Tf-idf包:

enter image description here

只有一个红色斑点。

tf-idf数据的余弦相似度矩阵的谱:

enter image description here

看看吧。它比我在词数据计数袋的相似矩阵上使用谱时得到的结果更糟糕。使用tf-idf只是为了光谱而搞砸了。

计数数据的相似矩阵的谱:

enter image description here

如果您在完成计数数据时看到Spectral,那么在tf-idf数据上完成时仍然会给出一些本地分组,这一切都是混淆的。

其次我有4000个功能。为了可视化,我需要在3个维度中进行最大化。因此,我正在使用MDS的结果。 MDS就像PCA,所以如果有人需要可视化点,MDS或PCA需要完成。

编辑VI:

因此,根据Anony-Mousse的评论,MDS正在搞砸事情,我想为什么不尝试使用PCA。所以我从DBSCAN或Spectral获得我的集群,然后我从PCA绘制前三个PC。这是我为PCA编写的代码。这里的docs_bow可以是tf-idf,甚至可以是正常计数docs_bow。

def PCA(docs_bow): 
    """ This function carries out PCA of the dataset
    """

    #Doing PCA (SVD)
    U,S,Vt=np.linalg.svd(docs_bow,full_matrices=False)
    # Projection matrix with Principal Component Loading vectors. Transpose of Vt.(Right singular vectors)
    W=Vt.T
    # Keep only the top 3 Dimensions
    W=W[:,0:3]

    # Finding our Projected datapoints on those two PC's
    PC=np.dot(docs_bow,W)

    return PC

余弦矩阵的谱图和MDS的绘图结果: enter image description here

关于余弦矩阵和PCA的前三个PC的光谱: enter image description here

距离矩阵的DBSCAN和MDS前三个维度: enter image description here

远程矩阵的DBSCAN和PCA的前三个PC: enter image description here

MDS似乎比PCA提供更好的可视化效果。我不是可以使用什么来减少可视化高维数据的维度。

1 个答案:

答案 0 :(得分:5)

如果禁用颜色,您看到了多少个群组?

我说此数据集中只有一个大型集群,至少在预处理/可视化方面是这样。

从光谱聚类中获得的三个聚类无意义。它本质上是量化,但它没有发现结构。它通过将数据分块为三个相似大小的块来最小化平方偏差。但如果你再次运行它,它可能会产生类似的外观但不同的块:结果很大程度上是随机的,抱歉。

不要指望课程与群集一致。正如您在此数据集中看到的那样,它可能有三个标签,但只有一个杂乱无章的“群集”。

很容易产生这种效果:

from sklearn import datasets, cluster
data=datasets.make_blobs(5000, 3, 1)[0]
c=cluster.SpectralClustering(n_clusters=3).fit_predict(data)
colors = np.array([x for x in 'bgrcmykbgrcmykbgrcmykbgrcmyk'])
scatter(data[:,0],data[:,1],color=colors[c].tolist())

产生这个:

Meaningless Spectral Clustering

请注意这与您的结果有多相似?然而,这是一个单高斯,这里没有集群。光谱聚类按要求在这里产生了3个聚类,但它们完全没有意义。

如果结果有意义,请务必检查结果。获得看起来像是一个很好的分区的东西真的很容易,但这是一个随机的凸分区。 仅仅因为它产生了群集并不意味着群集那里 - k-means和谱聚类等算法容易出现https://en.wikipedia.org/wiki/Pareidolia

你能看到这张脸上的群集吗? ;-)这是真的吗?

enter image description here

这是使用MDS对文本数据集进行相当成功的投影。它显示了许多簇伸展到数据空间的不同方向。 K-means和变体在这个数据集上不能很好地工作。高斯混合建模可以工作,但仅适用于投影数据。

enter image description here