C# Accent Проблемы с параметрами функции K-ближайшего соседа

Я пытаюсь использовать функцию K-ближайшего соседа библиотеки Accord, которая может работать с любым типом .

Моя цель - использовать его с данными Bitmap, но даже при копировании кода примера и его вставке я получаю эту ошибку:

Error   4   The best overloaded method match for 'Accord.MachineLearning.KNearestNeighbors<System.Drawing.Bitmap>.KNearestNeighbors(int, int, System.Drawing.Bitmap[], int[], Accord.Math.Distances.IDistance<System.Drawing.Bitmap>)' has some invalid arguments   D:\...\WindowsFormsApplication1\WidgetControl.cs    295 49  Project_Ochare

странные вещи

Это действительно странно, потому что это точно как пример. Насколько я знаю, параметры должны работать. У меня есть основное ядро ​​Accord, ядро ​​​​расширения, математика, математические расширения, математический код, машинное обучение и статистика, добавленные в качестве ссылок.

Пробовал искать, но ответа не нашел..

Код примера такой же, как этот: http://accord-framework.net/docs/html/T_Accord_MachineLearning_KNearestNeighbors_1.htm

Что случилось?

Это их пример кода, в котором возникают ошибки:

private void __Test()
{
    // The k-Nearest Neighbors algorithm can be used with
    // any kind of data. In this example, we will see how
   // it can be used to compare, for example, Strings.

    string[] inputs = 
    {
        "Car",    // class 0
        "Bar",    // class 0
        "Jar",    // class 0
        "Charm",  // class 1
        "Chair"   // class 1
    };
    int[] outputs =
    {
       0, 0, 0,  // First three are from class 0
       1, 1,     // And next two are from class 1
    };

    // Now we will create the K-Nearest Neighbors algorithm. For this
    // example, we will be choosing k = 1. This means that, for a given
    // instance, only its nearest neighbor will be used to cast a new
    // decision. 

    // In order to compare strings, we will be using Levenshtein's string distance
    KNearestNeighbors<string> knn = new KNearestNeighbors<string>(k: 1, classes: 2, inputs: inputs, outputs: outputs, distance: Distance.Levenshtein);

    // After the algorithm has been created, we can use it:
    int answer = knn.Compute("Chars"); // answer should be 1.
}

Это сообщения об ошибках, которые я получаю. Я сделал новый пустой проект только с кодом примера Accord для KNearest. Он хочет, чтобы я изменил Distance.Levenshtein на Distance.Levenshtein(), затем он говорит мне, что ему нужны параметры, независимо от того, как я его пишу или что добавляю, он дает ту же ошибку.

например Расстояние.Левенштейн("", ""), Расстояние.Левенштейн(0, 0) Расстояние.Левенштейн("",""), Расстояние.Левенштейн(новая строка1, новая строка1) и т. д.. все, что я мог придумать.

Расстояние. предлагает массу функций измерения, все они приводят к одной и той же ошибке.

Сообщения об ошибках:

Error   1   The best overloaded method match for 'Accord.MachineLearning.KNearestNeighbors<string>.KNearestNeighbors(int, int, string[], int[], Accord.Math.Distances.IDistance<string>)' has some invalid arguments    D:\Dropbox\C#\KNearestTest\KNearestTest\Form1.cs    48  45  KNearestTest


Error   2   Argument 5: cannot convert from 'method group' to 'Accord.Math.Distances.IDistance<string>' D:\Dropbox\C#\KNearestTest\KNearestTest\Form1.cs    49  59  KNearestTest

person Mads M    schedule 24.01.2017    source источник
comment
Добавьте код, но из-за ошибки я подозреваю, что вы пытаетесь передать растровое изображение функции, и она ожидает массив элементов, если вы хотите манипулировать данными пикселей, исправьте данные с помощью LockBitmap, прочитайте данные до байта массив, а затем используйте функцию с массивом байтов.   -  person Gusman    schedule 24.01.2017
comment
@Gusman, я не уверен, связано ли это с этим. Даже на собственных примерах выскакивает ошибка :/   -  person Mads M    schedule 24.01.2017
comment
Ошибка с примером просто потому, что опечатка, вместо Distance.Levenshtein должно быть Distance.Levenshtein(), так как это метод, а не свойство.   -  person Gusman    schedule 24.01.2017
comment
@Gusman Я пробовал это и Distance.Levenshtein (,) (потому что он запрашивает параметры). То же красное подчеркивание и сообщение о том, что что-то не так :(   -  person Mads M    schedule 24.01.2017
comment
Если вы получаете сообщение об ошибке, добавьте сообщение об ошибке, у нас нет хрустального шара, чтобы увидеть, что вам говорит VS.   -  person Gusman    schedule 24.01.2017
comment
@Gusman Привет, я добавил хрустальный шар в пост   -  person Mads M    schedule 24.01.2017
comment
Хрустальный шар говорит, что вы все еще используете Distance.Levenshtein вместо Distance.Levenshtein("", ""). Кроме того, вместо того, чтобы пытаться что-то делать, не зная, что вы делаете, почему бы не попробовать прочитать справку по API, а не только один из примеров?   -  person Gusman    schedule 24.01.2017
comment
@Gusman Я действительно пробовал это несколькими способами. API предлагает мало объяснений и предлагает только этот пример. Вот почему я спрашиваю здесь   -  person Mads M    schedule 24.01.2017
comment
Примеры API, наконец, были обновлены, поэтому, по крайней мере, теперь можно скопировать и вставить пример и заставить его работать без ошибок.   -  person Cesar    schedule 08.07.2017


Ответы (1)


Кажется, документ не соответствует библиотеке. Я бы предложил написать собственную реализацию интерфейса IDistance<string>, использующую Levenschtein Distance:

public class DistanceStringsLevenstein : IDistance<string>
{
    public double Distance(string x, string y)
    {
        return Accord.Math.Distance.Levenshtein(x, y);
    }
}

Реализация для растрового изображения будет:

public class DistanceBitmapLevenstein : IDistance<Bitmap>
{
    public double Distance(Bitmap x, Bitmap y)
    {
        return Accord.Math.Distance.Levenshtein(ImageToByte(x), ImageToByte(y));
    }

    public static byte[] ImageToByte(Image img)
    {
        ImageConverter converter = new ImageConverter();
        return (byte[])converter.ConvertTo(img, typeof(byte[]));
    }
}

После этого вы можете использовать этот класс в этом методе:

KNearestNeighbors<string> knn = new KNearestNeighbors<string>(k: 1, classes: 2,
        inputs: inputs, outputs: outputs, distance: new DistanceStringsLevenstein());
person Maksim Simkin    schedule 24.01.2017
comment
Спасибо!! Это работает для примера кода. Как мне реализовать это для растрового изображения? Я попытался написать открытый класс DistanceStringsLevenstein : IDistance‹Bitmap› { public double Distance(Bitmap[] x, Bitmap[] y) { return Accord.Math.Distance.Levenshtein‹Bitmap›(x, y); } } но он говорит, что этот метод не реализует элемент интерфейса Accord.Math.Distances.IDistance‹Bitmap, Bitmap›.Distance(Bitmap, Bitmap) - person Mads M; 24.01.2017
comment
@MadsM Я обновил свой ответ реализацией Bitmap - person Maksim Simkin; 24.01.2017
comment
Еще раз спасибо. Реализуя это, Visual Studio говорит, что лучший перегруженный метод, соответствующий «Accord.Math.Distance.Levenshtein (string, string)», имеет некоторые недопустимые аргументы. - person Mads M; 24.01.2017
comment
Там я точно не знаю, я бы имел дело с растровым изображением как с массивом байтов (см. обновленный ответ), но я не знаю, правильно ли это. - person Maksim Simkin; 24.01.2017
comment
Спасибо вам за помощь. Код работает, но каждый раз возвращает один и тот же ответ. Несмотря на то, что растровые изображения очень разные. Я проверил входные данные. Я подозреваю, что измерение расстояния немного странное :/ - person Mads M; 25.01.2017
comment
Если все, что вы хотите сделать, это использовать k-Nearest Neighbours для классификации/проверки сходства других изображений, я бы рекомендовал не использовать его напрямую с растровыми изображениями, а с функциями, извлеченными из этих растровых изображений. Пожалуйста, взгляните на образец приложения Bag-of-Visual-Words, чтобы узнать, как это сделать. - person Cesar; 09.07.2017
comment
Если вы действительно хотите использовать KNearestNeighbors‹Bitmap›, вам нужно определить своего рода меру сходства между двумя растровыми изображениями. В этом вопросе вы можете найти одно из таких определений, используя SURF , но учтите, что повторное вычисление функций SURF для каждого удаленного вызова будет очень неэффективным. Вместо этого вы можете заранее извлечь все функции из всех изображений и использовать их вместо исходных изображений. - person Cesar; 09.07.2017