
然而,我使用相同的余弦相似度矩阵并从中计算距离矩阵.
dist=1-cosimilarity.
并使用多维缩放算法可视化三维空间中的点.这就是我从中得到的.我使用那个实际的点标签来为点着色.
如果您看到MDS分组,那么它们不显示任何明显的群集分组,而Spectral分组似乎显示三个相当不错的群集.
1).您认为原因可能是什么?因为MDS只是通过它们之间的距离在较低维度尺度上绘制点(MDS以较高维度减小点之间的距离与它们之间的距离相同,从而保持点之间的比例相同)并没有使用一些距离标准对它们进行聚类?我希望看到频谱结果有点类似于MDS,因为两者都在使用距离测量.只是聚类将附近的点融合成一个.虽然MDS正在密谋.但是在MDS中我使用了点的实际标签.这表明了事实真相吗?
2).任何改进使用其他算法进行聚类的建议或看起来都不错?
编辑:
看起来有三组,但红色与蓝色和绿色组重叠.但是,如果我说它在我们看来是重叠的,因为我们无法看到超出3D的东西(无论如何在计算机屏幕上是2D).如果我们碰巧在3D或甚至更多维度上看到红点,那么如果红点高于蓝色和绿色会怎样.
举个例子:
让我们说你正在看三点.
想象一下,如果您寻找1D,您在上面看到的点就会出现.也许是从顶部开始.
现在如果你在2D中看到这些点怎么办?它如下所示.
如果你现在看到,所有三个点都是分开的.只是我们能够看到2D中的点,我们实际上能够看到从顶部和1D可视化时我们看起来像直线的点之间的关系.
所以你认为像上面这样的聚类结果实际上可能是一组明显分开的点,并且如果我们能够在3D中将它们可视化,那么我们现在看起来并没有很好地分离,那么它们与现实中的每个组相距甚远.这是否意味着可能存在上述情况,其中聚类结果的可视化可能不是正确的方式,因为它可能导致上述结论?
编辑二:
使用以下代码运行DBSCAN算法:使用先前计算的距离矩阵作为DBSCAN的预先计算的矩阵
from sklearn.cluster import DBSCAN
dbscan=DBSCAN(metric='precomputed')
cluster_labels=dbscan.fit_predict(dist)
请记住,在所有光谱和DBSCAN中,我绘制的点是多维尺度算法的结果,是三维的结果.
DBSCAN图:
编辑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来计算正确的亲和力矩阵.现在这就是我得到的.只有一个集群.而已.它根本没有分开点.
请记住,这是与上面使用的距离矩阵相同的数据点矩阵.基础数据点是相同的.
编辑V:
将包中的计数数据转换为tf-idf数据.
1).关于预先计算的tf-idf包词数据的距离矩阵D53CAN.
在所有早期的方法中,我只使用count bag of words矩阵作为基础.现在我使用tf-idf矩阵作为余弦相似距离的基础.
关于距离矩阵的DBSCAN:
它有两种类型,但同样没有分离.
DBSCAN在原始Tf-idf包词的矩阵:
只有一个红色的斑点.
关于tf-idf数据的余弦相似度矩阵的谱:
看看吧.它比我在词数据计数袋的相似矩阵上使用谱时得到的结果更糟糕.使用tf-idf只是为了光谱而搞砸了.
计数数据相似矩阵的谱:
如果您在完成计数数据时看到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的绘图结果:
余弦矩阵的光谱和PCA的前三个PC:
距离矩阵和MDS的DBSCAN前三个维度:
距离矩阵的DBSCAN和PCA的前三个PC:
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())
产生这个:
注意这与你的结果有多相似?然而,这是一个单高斯,这里没有集群.频谱聚类根据要求在这里产生了3个聚类,但它们完全没有意义.
如果结果有意义,请务必检查结果.获得看起来像是一个很好的分区的东西真的很容易,但这是一个随机的凸分区.仅仅因为它产生的集群并不意味着集群在那里! – 像k-means和谱聚类这样的算法很容易出现在https://en.wikipedia.org/wiki/Pareidolia中
你能看到这张脸上的星团吗? 😉 这是真的吗?
以下是使用MDS对文本数据集进行相当成功的投影.它显示了许多簇伸展到数据空间的不同方向. K-means和变体在这个数据集上不能很好地工作.高斯混合建模可以工作,但仅适用于投影数据.
转载注明原文:Python中的谱聚类和多维缩放 - 乐贴网