Я ищу способ реализовать кластерный алгоритм, который должен иметь возможность кластеризовать строковые массивы.
Предполагая, что такие входы:
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 работает только с двойными числами (поэтому я конвертирую каждое значение в строке [] в число и пытаюсь снова). В качестве меры расстояния я реализовал расстояние 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);