C# 聚类非矩阵字符串数组
我正在寻找一种实现集群算法的方法,该算法应该能够对字符串数组进行集群化 假设输入如下:C# 聚类非矩阵字符串数组,c#,machine-learning,cluster-analysis,k-means,accord.net,C#,Machine Learning,Cluster Analysis,K Means,Accord.net,我正在寻找一种实现集群算法的方法,该算法应该能够对字符串数组进行集群化 假设输入如下: 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"}, n
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只适用于双精度数字(因此我将字符串[]中的每个值转换为一个数字,然后重试)。
作为距离的意思,我实现了距离
在这之后,我得到一个错误,说“点矩阵应该是矩形的。”这是有意义的,因为我的输入不是矩形矩阵
所以我问你们:我该如何实现这一点?在这种情况下,对项目进行聚类的最佳方法是什么?有什么想法或建议吗
代码示例:
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);
您可以单独对每个一维数组进行排序,然后用0填充缺少的值。此时,您可以应用
jaccard
或cosine
等。K-means需要连续变量
因为它需要计算平均值。因此得名
因此,您不能在此数据上使用k-means
相反,选择其他聚类算法。但我怀疑集群能否解决您的问题(但您没有解释您的问题)。更可能的是,诸如频繁项集挖掘之类的其他方法将是正确的方法。不应将k-means用于分类数据聚类的原因是,分类数据的样本空间是离散的,并且没有自然来源。这样一个空间上的欧几里德距离函数并没有真正的意义 由于您正在处理字符串或分类数据,因此可以应用try
k-modes
算法。尽管分类数据聚类还有其他几种算法,但K-模式是经典K-均值的扩展。有关详细的讨论,您可以阅读以下内容。我不知道如何在C#
中实现它,但是对于R
您可以看到这一点
此外,您还可以进行一次热编码,即将分类变量表示为二进制向量,然后应用k-均值。但是你可能会面临维数灾难的风险。我从未使用过这些算法,但我认为聚类算法的输入应该是Jaccard距离矩阵。后者是长方形的,类型为double。我会做一些测试,但我认为它不会起作用,因为KMeans需要计算元素[0]与其他元素之间的距离,这样他就可以计算K个最近的iten来形成一个簇。但我会试试你的建议。感谢@OlivierJacot DescombesOr将输入视为一维问题,其中输入是一组字母的数组。每组字母将被视为一个单独的物体,其与其他字母的距离必须确定。现在,聚类算法的输入是一个向量而不是一个矩阵。@OlivierJacot Descombes:不,k-means需要坐标,而不是距离。它只适用于连续变量。