【问题标题】:Clustering non-matrix string arrays聚类非矩阵字符串数组
【发布时间】:2018-08-24 04:58:50
【问题描述】:

我正在寻找一种方法来实现应该能够对字符串数组进行聚类的聚类算法。

假设输入如下:

string[][] input =
{
     new string[] { "A", "B", "C", "D", "F", "G"},
     new string[] { "D", "F", "G", "H"},
     new string[] { "A", "B", "C", "G"},
     new string[] { "B", "C", "Z", "A", "F"},
     new string[] { "O", "N", "P", "X"}
};

该算法应该能够识别项目 0、2 和 3 在同一个集群中。但是我该怎么做呢?

我尝试了什么? 我一直在尝试使用 Accord.net 框架来构建 KMeans 集群。但我注意到 Kmeans 仅适用于双数(因此我将 string[] 中的每个值转换为一个数字,然后再试一次)。 作为距离测量,我实现了Jaccard 距离。

在此之后,我收到一条错误消息,提示“点矩阵应该是矩形”。这是有道理的,因为我的输入不是矩形矩阵。

所以我问你们:我该如何实现呢?在这种情况下集群项目的最佳方法是什么?有什么想法或建议吗?

代码示例:

double[][] inputs =
{
     new double [] { 0, 1, 2, 3, 4 },
     new double [] { 0, 1, 5, 2, 3, 4 },
     new double [] { 33, 0, 1, 5, 2, 4 },
     new double [] { 0, 1, 2, 6, 7,  8},
     new double [] { 0, 9, 1, 2, 6, 8 },
     new double [] { 0, 4, 10, 15, 11, 12, 13  },
     new double [] { 0, 4, 14, 15, 11, 12, 13, 16  },
     new double [] { 0, 17, 18, 11, 19, 12, 20},
     new double [] { 0, 17, 18, 11, 19, 12, 20, 15, 26},
     new double [] { 0, 4, 14, 15, 11, 12, 13, 16, 17, 18  },
     new double [] { 0, 21, 22, 23, 24, 26, 25},
     new double [] { 24, 26, 27, 21, 28, 29, 1},
     new double [] { 24, 243, 26, 30},
     new double [] { 31, 24, 22, 23, 0, 11, 26 }
     // Many others... 
};

var kmeans   = new KMeans(k: 3, distance: new JaccarDistanceDouble() );
var clusters = kmeans.Learn(inputs); // Throws the error.
int[] labels = clusters.Decide(inputs);

【问题讨论】:

  • 我从未使用过这些算法,但我认为聚类算法的输入应该是 Jaccard 距离的矩阵。后者将是矩形的,类型为 double。
  • 我会做一些测试,但我认为它不起作用,因为 KMeans 需要计算元素 [0] 与其他元素的距离,以便他可以计算 K 最近的元素以形成一个集群。但我会尝试你的建议。谢谢@OlivierJacot-Descombes
  • 或者将输入视为一维问题,其中输入是一组字母的数组。每组字母将被视为单个对象,其与其他字母的距离必须确定。现在,聚类算法的输入是向量而不是矩阵。
  • @OlivierJacot-Descombes:不,k-means 需要坐标,而不是距离。只有与连续变量一起使用才有意义。

标签: c# machine-learning cluster-analysis k-means accord.net


【解决方案1】:

K-means 需要连续变量。

因为它需要计算 mean。因此得名。

因此,您不能对这些数据使用 k-means。

而是选择其他聚类算法。但我怀疑集群是否能解决你的问题(但你没有解释你的问题)。更有可能的是,诸如频繁项集挖掘之类的其他方法将是正确的方法。

【讨论】:

    【解决方案2】:

    k-means 不应用于聚类分类数据的原因是,分类数据的样本空间是离散的,并且没有自然来源。在这样的空间上的欧几里得距离函数并没有真正的意义。

    由于你是在处理字符串或分类数据,试试k-modes算法可以应用。尽管还有其他几种用于分类数据聚类的算法,但 K-mode 是经典 k-means 的扩展。有关详细讨论,您可以阅读此paper。我不知道如何在C# 中实现它,但对于R,你可以看到这个documentation

    此外,您还可以使用one-hot encoding 将分类变量表示为二进制向量,然后应用 k-means。但是你可能会冒维度诅咒的风险。

    【讨论】:

      【解决方案3】:

      您可以单独对每个一维数组进行排序,然后用 0 填充它们以表示缺失值。此时您可以申请jaccardcosine 等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 2019-09-15
        • 2013-11-16
        • 2011-07-18
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        相关资源
        最近更新 更多