Python中的谱聚类与多维标度

2024-04-25 00:55:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我用谱聚类法对一些词的特征向量进行聚类。在谱聚类算法中,采用词向量的余弦相似矩阵作为预计算的亲和矩阵。这就是我得到的三个星团。我使用集群分配作为标记来给点上色。

enter image description here 但是我使用了相同的余弦相似矩阵,并计算了距离矩阵。

dist=1-cosimilarity. 

并利用多维尺度算法对三维空间中的点进行可视化。这就是我从中得到的。我用那个实际的点标签给点上色。

enter image description here

如果你看到MDS分组,那些没有显示任何明显的集群分组,而光谱一似乎显示了三个相当不错的集群。

1)。你认为原因可能是什么?。因为MDS仅仅是利用点之间的距离在较低的维度上绘制点(MDS减少点之间的距离的比例与减少点之间的距离的比例相同,因此,保持点间距离的比例不变),而不使用某种距离标准对它们进行聚类?。我希望看到光谱结果有点类似于MDS,因为两者都在使用距离测量。只是聚类将附近的点融合成一个点。而MDS正在按原样绘制。但在MDS中,我使用了点的实际标签。所以这表明了事实的真相?。

(第二章)。有什么建议可以改进使用其他算法的聚类,或者这看起来不错?。

编辑:

看起来有三个组,但是红色组和蓝色组和绿色组重叠。但如果我说它在我们看来是重叠的,因为我们无法看到三维以外的东西(无论如何,在电脑屏幕上是二维的)。如果红色的点远远高于蓝色和绿色,如果我们碰巧在三维甚至更多的维度中看到它们呢。

举个例子:

假设你在看三个点。

enter image description here

想象一下,如果你寻找1D,上面看到的点会出现在你面前,也许就在上面。

现在,如果你能在2D中看到这些点,它会显示如下。

enter image description here

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

那么,你认为像上面这样的聚类结果实际上可能是一组明显分离的点,并且与现实中的每一组都相距很远,如果我们能够在3D中看到它们,而在我们看来,它们目前似乎没有很好的分离?。这是否意味着可能会有像上面这样的情况,聚类结果的可视化可能不是正确的方法,因为它可能导致上述结论?。

编辑二:

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

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

请记住在所有光谱和数据库扫描中,我正在绘制的点是多维缩放算法到三维的结果。

数据库扫描图: enter image description here

编辑三:

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

 from sklearn.metrics.pairwise import cosine_similarity

    cossim= cosine_similarity(X)

    dist=1-cossim

    dist=np.round(dist, 2)

编辑四:

由于Anony Mousse建议余弦相似性可能不是正确的度量标准,所以现在我所做的只是使用了DBSCAN algo中的原始单词包设计矩阵,没有提供任何距离矩阵作为预先计算的选项。把它留给sklearn来计算右亲合矩阵。这就是我得到的。只有一个集群。就这样。它一点也不分开。 请记住,这是与上面使用的距离矩阵相同的一包数据点的单词矩阵。底层数据点是相同的。

enter image description here

编辑V:

字袋计数数据的转换s到tf idf数据。

1)。在tf-idf包字数据的预计算距离矩阵上运行DBSCAN。 在所有早期的方法中,我只是简单地使用了count bag of words matrix作为基础。现在我使用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

如果你看到光谱时,只做计数数据是给一些局部分组,而做了tf-idf的数据,这一切都是混为一谈。

其次我有4000个特征。为了形象化,我需要在三维空间中做最大值。为此,我使用MDS的结果。MDS就像PCA,所以如果有人需要可视化点,MDS或PCA都需要完成。

编辑VI:

所以根据摩丝的评论,MDS正在搞砸事情,我想为什么不试试PCA。所以我从DBSCAN或Spectral获取集群,然后从PC a绘制前三个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好。我不是其他人可以用来减少维度的可视化高维数据。


Tags: 数据算法编辑距离可视化disttf集群