2015-09-23 8 views
3

Я пытаюсь сохранить результаты кластеризации Accord.Net K-Means, так что мне не нужно перекомпрометировать каждый раз, когда я запускаю свою программу.Как сохранить результаты кластеризации Accord.Net K-Means для повторного использования?

Я также хочу назначить постоянные удобочитаемые метки для каждого кластера. Это невозможно, если мне приходится каждый раз вычислять кластеры.

ответ

2

В Accord.NET, каждый объект может быть сохранен с использованием стандартной бинарной сериализации .NET. Это означает, что вы можете сохранить ваши K-Means с помощью:

KMeans kmeans = ... 

using (FileStream fs = new FileStream(path, FileMode.Create)) 
{ 
    new BinaryFormatter().Serialize(fs, kmeans); 
}  

и загрузить его обратно с помощью:

KMeans kmeans = null; 

using (FileStream fs = new FileStream(path, FileMode.Open)) 
{ 
    kmeans = new BinaryFormatter().Deserialize(fs) as KMeans; 
}  

Надеется, что это помогает!

+0

Кроме того, структура стремится сделать предыдущие классы работают в разных версиях. Если после перехода на новую версию вы увидите, что ваши сериализованные объекты перестали работать, вы можете заполнить отчет об ошибке! – Cesar

+0

эй, это именно то, что я пытался сделать, спасибо тонну !!! – dubezOniner

+0

На самом деле я попытался сериализовать объект RandomForest и Codification, и ни один из них не является сериализуемым. Уже отправлен отчет об ошибке. – Molecool

1

Хорошо, после того, как вы входите в Accord.Net и занимаетесь некоторыми исследованиями, я выяснил, как сохранить кластеризацию, поэтому я собираюсь добавить решение здесь, если кто-то еще столкнется с той же проблемой.

В основном все, что вам нужно сделать, это сохранить центроидов кластеров, а затем использовать их для инициализации KMeans следующий раз перед запуском Compute:

// Saving the Centroids 
int[] clusterIds = kmeans.Compute(observations); 
double[][] centroids = kmeans.Clusters.Centroids; 

...

// Initializing with Centroids 
kmeans = new KMeans(numOfClusters); 
kmeans.Clusters.Centroids = centroids; 
int[] clusterIds = kmeans.Compute(observations); 
2

Компания Accord.Net имеет сериализующий класс. В пакете Accord.IO существует класс Serializer. Вы можете использовать его как

KMeans means; 
Accord.IO.Serializer.Save(means, filename); 

или

means = Accord.IO.Serializer.Load<KMeans>(filename);