Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中查找将一个集群列表转换为另一个集群的映射_Python_Python 3.x_Scikit Learn_Cluster Analysis_Array Difference - Fatal编程技术网

在Python中查找将一个集群列表转换为另一个集群的映射

在Python中查找将一个集群列表转换为另一个集群的映射,python,python-3.x,scikit-learn,cluster-analysis,array-difference,Python,Python 3.x,Scikit Learn,Cluster Analysis,Array Difference,我正在使用scikit学习对一些数据进行聚类,我想比较不同聚类技术的结果。我立即面临的问题是,对于不同的运行,集群的标签是不同的,因此即使集群完全相同,列表的相似性仍然很低 说我有 list1 = [1, 1, 0, 5, 5, 1, 8, 1] list2 = [3, 3, 1, 2, 2, 3, 8, 3] 我(理想情况下)希望函数以翻译字典的形式返回最佳映射,如下所示: findMapping(list1, list2) >>> {0:1, 1:3, 5:2, 8:8}

我正在使用scikit学习对一些数据进行聚类,我想比较不同聚类技术的结果。我立即面临的问题是,对于不同的运行,集群的标签是不同的,因此即使集群完全相同,列表的相似性仍然很低

说我有

list1 = [1, 1, 0, 5, 5, 1, 8, 1]
list2 = [3, 3, 1, 2, 2, 3, 8, 3]
我(理想情况下)希望函数以翻译字典的形式返回最佳映射,如下所示:

findMapping(list1, list2)
>>> {0:1, 1:3, 5:2, 8:8}
我说“最佳映射”是因为假设
list3=[3,3,1,2,2,3,8,4]
那么
findMapping(list1,list3)
仍然会返回相同的映射,即使最后的
1
变成
4
,而不是
3

因此,最好的映射是使两个列表之间的差异数量最小化的映射。我认为这是一个好标准,但可能有更好的标准

我可以编写一个试错优化算法来实现这一点,但我不是第一个想要比较聚类算法结果的人。我希望这样的事情已经存在,我只是不知道它叫什么。但我四处搜索,没有找到任何答案

关键是,在应用了最佳翻译后,我将测量列表之间的差异,因此也许有一种方法可以测量不同索引的数字列表之间的差异,而无需将翻译作为中间步骤,这也很好

===================================

根据Pallie的回答,我能够创建findMapping函数,然后我进一步创建了一个转换函数,该函数返回转换为第一个列表标签的第二个列表

def translateLabels(masterList, listToConvert):    
  contMatrix = contingency_matrix(masterList, listToConvert)
  labelMatcher = munkres.Munkres()
  labelTranlater = labelMatcher.compute(contMatrix.max() - contMatrix)

  uniqueLabels1 = list(set(masterList))
  uniqueLabels2 = list(set(listToConvert))

  tranlatorDict = {}
  for thisPair in labelTranlater:
    tranlatorDict[uniqueLabels2[thisPair[1]]] = uniqueLabels1[thisPair[0]]

  return [tranlatorDict[label] for label in listToConvert]
即使使用这种转换(我需要一致绘制簇颜色),使用兰德索引和/或规范化互信息似乎也是比较不需要共享标签的差异的好方法


我也喜欢“第一”的想法,但在比较来自非常不同数据的聚类时,这可能不起作用。

您可以尝试计算两个结果之间的差异。这给出了一个介于-1和1之间的分数,其中1是一个完美的匹配

或采用混淆矩阵的argmax:

list1 = ['a', 'a', 'b', 'c', 'c', 'a', 'd', 'a']
list2 = [3, 3, 1, 2, 2, 3, 8, 3]
np.argmax(contingency_matrix(list1, list2), axis=1)
array([2, 0, 1, 3])
2表示第2行(值2,集群3)与“a”列0(索引为2)最匹配。然后,第0行匹配第1列,以此类推

对于匈牙利方法:

m = Munkres()
contmat = contingency_matrix(list1, list2)
m.compute(contmat.max() - contmat)
[(0, 2), (1, 0), (2, 1), (3, 3)]

使用:

是的,这是我所期望的存在。它确实满足了我在没有找到翻译的情况下测量列表之间距离的需要。如果可能的话,我仍然希望有“翻译图”,这样我就可以确定哪些项目不同,并为绘图生成全局颜色方案。对于这些信息,请尝试权变矩阵:我相信权变矩阵可以提供将一组标签转换为另一组标签所需的信息,但是只有这些文件,没有找到任何例子,我们完全不清楚如何做到这一点。使用列联矩阵的np.argmax应该会得到一个列表,其中索引是键,值是映射的值。一个好的映射。我认为值得指出的是,如果两个分区的基数不同,Munkres算法可能不是一个好主意(例如,一个地面真实值聚类被给定的聚类过程一分为二)。在这种情况下,Munkres算法将使一些聚类不匹配,而argmax技术(尽管是次优的)如果一个人需要一份完整的作业图,这是一个很好的方法。我认为这个问题有一定的优点,即使据说有人认为它是重复的。我投赞成票。