【发布时间】: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