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

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中将它们可视化,那么我们现在看起来并没有很好地分离,那么它们与现实中的每个组相距甚远.这是否意味着可能存在上述情况,其中聚类结果的可视化可能不是正确的方式,因为它可能导致上述结论?

编辑二:

使用以下代码运行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

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

距离矩阵的DBSCAN和PCA的前三个PC:
enter image description here

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

最佳答案
如果禁用颜色,您会看到多少个簇?

我要说这个数据集中只有一个大集群,至少在这个预处理/可视化中是这样.

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

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

它很容易产生这种效果:

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

点击查看更多相关文章

转载注明原文:Python中的谱聚类和多维缩放 - 乐贴网