Кластеризація за допомогою моделі суміші процесів Діріхле в Java PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Кластеризація за допомогою моделі суміші процесів Діріхле в Java

У попередніх статтях ми детально розглянули Моделі сумішей процесу Діріхле і як їх можна використовувати в кластерному аналізі. У цій статті ми представимо реалізацію Java дві різні моделі DPMM: багатовимірна модель нормальної суміші Діріхле, яку можна використовувати для кластерування даних Гаусса, і модель суміші Діріхле-мультиноміальна, яка використовується для кластеризації документів. Код Java має відкритий вихідний код за ліцензією GPL v3 і його можна безкоштовно завантажити Github.

Оновлення: Система машинного навчання Datumbox тепер є відкритою та безкоштовною скачати. Перевірте пакет com.datumbox.framework.machinelearning.clustering, щоб побачити реалізацію моделей суміші процесів Діріхле на Java.

Реалізація моделі суміші процесу Діріхле в Java

Код реалізує модель суміші процесу Діріхле з Gibbs Sampler і використовує Apache Commons Math 3.3 як матричну бібліотеку. Він ліцензований під GPLv3, тому не соромтеся його використовувати, змінювати та вільно розповсюджувати, і ви можете завантажити реалізацію Java з Github. Зауважте, що всі теоретичні частини методу кластеризації ви можете знайти в попередніх 5 статтях і детальні коментарі Javadoc для реалізації у вихідному коді.

Нижче ми наведемо опис високого рівня коду:

1. Клас DPMM

DPMM є абстрактним класом і діє як база для різних моделей, реалізує Процес китайського ресторану і містить Згорнутий семплер Гіббса. Він має відкритий метод cluster(), який отримує набір даних у вигляді списку точок і відповідає за виконання кластерного аналізу. Іншими корисними методами класу є getPointAssignments(), який використовується для отримання призначень кластерів після завершення кластеризації, і getClusterList(), який використовується для отримання списку ідентифікованих кластерів. DPMM містить статичний вкладений абстрактний клас Cluster; він містить кілька абстрактних методів, що стосуються управління точками та оцінки заднього pdf, які використовуються для оцінки кластерних призначень.

2. Клас GaussianDPMM

GaussianDPMM є реалізацією багатовимірної моделі нормальної суміші Діріхле і розширює клас DPMM. Він містить усі методи, необхідні для оцінки ймовірностей за припущенням Гаусса. Крім того, він містить статичний вкладений клас Cluster, який реалізує всі абстрактні методи класу DPMM.Cluster.

3. Мультиноміальний клас DPMM

MultinomialDPMM реалізує модель суміші Діріхле-мультиноміальний і розширює клас DPMM. Подібно до класу GaussianDPMM, він містить усі методи, необхідні для оцінки ймовірностей відповідно до припущення мультиноміального-Діріхле, і містить статичний вкладений клас Cluster, який реалізує абстрактні методи DPMM.Cluster.

4. СРС клас

Клас SRS використовується для виконання простої випадкової вибірки з таблиці частот. Він використовується Gibbs Sampler для оцінки нових призначень кластерів на кожному кроці ітераційного процесу.

5. Точковий клас

Клас Point служить кортежем, який зберігає дані запису разом з його ідентифікатором.

6. Apache Commons Math Lib

Бібліотека Apache Commons Math 3.3 використовується для множення матриці, і це єдина залежність нашої реалізації.

7. Клас DMMExample

Цей клас містить приклади того, як використовувати реалізацію Java.

Використання реалізації Java

Користувач коду може налаштувати всі параметри змішаних моделей, включаючи типи моделі та гіперпараметри. У наступному фрагменті коду ми бачимо, як ініціалізується та виконується алгоритм:

List<Point> pointList = new ArrayList<>();
//add records in pointList

//Dirichlet Process parameter
Integer dimensionality = 2;
double alpha = 1.0;

//Hyper parameters of Base Function
int kappa0 = 0;
int nu0 = 1;
RealVector mu0 = new ArrayRealVector(new double[]{0.0, 0.0});
RealMatrix psi0 = new BlockRealMatrix(new double[][]{{1.0,0.0},{0.0,1.0}});

//Create a DPMM object
DPMM dpmm = new GaussianDPMM(dimensionality, alpha, kappa0, nu0, mu0, psi0);

int maxIterations = 100;
int performedIterations = dpmm.cluster(pointList, maxIterations);

//get a list with the point ids and their assignments
Map<Integer, Integer> zi = dpmm.getPointAssignments();

Нижче ми бачимо результати запуску алгоритму на синтетичному наборі даних, який складається з 300 точок даних. Окуляри спочатку були згенеровані 3 різними розподілами: N([10,50], I), N([50,10], I) і N([150,100], I).

діаграма розсіювання 1
Малюнок 1: Діаграма розсіювання демонстраційного набору даних

Алгоритм після виконання 10 ітерацій визначив такі 3 кластерні центри: [10.17, 50.11], [49.99, 10.13] і [149.97, 99.81]. Нарешті, оскільки ми розглядаємо все байєсівським способом, ми можемо не тільки надати одноточкові оцінки центрів кластерів, але й їх розподіл ймовірностей за допомогою формула рівняння.

Scatterplot2-теплова карта
Рисунок 2: Діаграма розсіювання ймовірностей центрів кластерів

На малюнку вище ми зображуємо ці ймовірності; червоні області вказують на високу ймовірність бути центром скупчення, а чорні області вказують на низьку ймовірність.

Щоб використовувати реалізацію Java в реальних програмах, ви повинні написати зовнішній код, який перетворює ваш вихідний набір даних у необхідний формат. Крім того, може знадобитися додатковий код, якщо ви хочете уявити результат, як ми бачимо вище. Нарешті, зверніть увагу, що бібліотека Apache Commons Math включена в проект, і, отже, для запуску демонстрацій не потрібно додаткової конфігурації.

Якщо ви використовуєте реалізацію в цікавому проекті, напишіть нам, і ми розмістимо ваш проект у нашому блозі. Також, якщо вам подобається стаття, знайдіть хвилинку та поділіться нею у Twitter або Facebook.

Часова мітка:

Більше від Датабокс