Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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
C# 聚类非矩阵字符串数组_C#_Machine Learning_Cluster Analysis_K Means_Accord.net - Fatal编程技术网

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需要坐标,而不是距离。它只适用于连续变量。