Nano Hash - криптовалюты, майнинг, программирование

Получите расстояние от точки данных до ее центра тяжести с помощью Accord.net

Я занимаюсь кластеризацией с помощью библиотеки Accord.net. В конечном счете, я пытаюсь найти оптимальное количество кластеров для использования с методом локтя что требует относительно простых расчетов. Однако мне трудно получить значения, необходимые для определения наилучшего числа K для использования в моем KMeans моделировании.

У меня есть пример данных/кода:

open Accord
open Accord.Math
open Accord.MachineLearning
open Accord.Statistics
open Accord.Statistics.Analysis

let x = [|
    [|4.0; 1.0; 1.0; 2.0|]; 
    [|2.0; 4.0; 1.0; 2.0|]; 
    [|2.0; 3.0; 1.0; 1.0|]; 
    [|3.0; 6.0; 2.0; 1.0|]; 
    [|4.0; 4.0; 1.0; 1.0|]; 
    [|5.0; 10.0; 1.0; 2.0|]; 
    [|7.0; 8.0; 1.0; 2.0|]; 
    [|6.0; 5.0; 1.0; 1.0|]; 
    [|7.0; 7.0; 2.0; 1.0|]; 
    [|5.0; 8.0; 1.0; 1.0|]; 
    [|4.0; 1.0; 1.0; 2.0|]; 
    [|3.0; 5.0; 0.0; 3.0|]; 
    [|1.0; 2.0; 0.0; 0.0|]; 
    [|4.0; 7.0; 1.0; 2.0|]; 
    [|5.0; 3.0; 2.0; 0.0|]; 
    [|4.0; 11.0; 0.0; 3.0|]; 
    [|8.0; 7.0; 2.0; 1.0|]; 
    [|5.0; 6.0; 0.0; 2.0|]; 
    [|8.0; 6.0; 3.0; 0.0|]; 
    [|4.0; 9.0; 0.0; 2.0|] 
    |]

и я могу достаточно легко генерировать кластеры с помощью

let kmeans = new KMeans 5

let kmeansMod = kmeans.Learn x
let clusters = kmeansMod.Decide x

но как я могу рассчитать расстояние от любой заданной точки данных x до назначенного ему кластера? Я не вижу ничего в KMeans документации по классу Cluster Collection, что предполагает наличие уже метод, реализованный для этой проблемы.

Кажется, что рассчитать это расстояние должно быть относительно просто, но я в растерянности. Было бы так же просто, как сделать что-то вроде

let dataAndClusters = Array.zip clusters x

let getCentroid (m: KMeansClusterCollection) (i: int) = 
    m.Centroids.[i]

dataAndClusters
|> Array.map (fun (c, d) -> (c, (getCentroid kmeansMod c) 
                                |> Array.map2 (-) d
                                |> Array.sum))

который возвращает

val it : (int * float) [] =
  [|(1, 0.8); (0, -1.5); (1, -0.2); (0, 1.5); (0, -0.5); (4, 0.0); (2, 1.4);
    (2, -3.6); (2, 0.4); (3, 0.75); (1, 0.8); (0, 0.5); (1, -4.2); (3, -0.25);
    (1, 2.8); (4, 0.0); (2, 1.4); (3, -1.25); (2, 0.4); (3, 0.75)|]

Правильно ли я вычисляю это расстояние? Я подозреваю, что нет.

Как я уже упоминал, я пытаюсь определить правильное количество K для использования в KMeans кластеризации. Я просто подумал, что буду использовать простой алгоритм, изложенный во втором абзаце . Обратите внимание, что я не возражаю против использования "статистики пробелов", ссылка на которую приведена в нижней части верхнего ответа.


  • Вы должны быть в состоянии вычислить расстояние до ближайшего кластера, используя метод Scores() вместо Decide(). 08.07.2017

Ответы:


1

Оказалось, что я не правильно рассчитывал расстояния, но был близок к этому.

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

Шаги кажутся довольно простыми:

1. From each data value, subtract the centroid values
2. Sum the differences for a given data/centroid pair
3. Square the differences
4. Find the square root of the differences.

Для моего примера данных выше это будет разбито на это:

let distances = 
    dataAndClusters
    |> Array.map (fun (c, d) -> (c, ((getCentroid kmeansMod c) 
                                    |> Array.map2 (-) d
                                    |> Array.sum
                                    |> float) ** 2.0
                                    |> sqrt))

Обратите внимание на добавление двух строк,

|> float) ** 2.0 преобразует значение в число с плавающей запятой, чтобы его можно было возвести в квадрат (т.е. x**y)

а также

|> sqrt), который находит квадратный корень значения.

Для этого может быть встроенный метод, но я его пока не нашел. На данный момент это работает для меня.

13.12.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..