Кластеризация с использованием модели смеси процессов Дирихле в Java PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Кластеризация с использованием модели процесса Дирихле в Java

В предыдущих статьях мы подробно обсуждали Модели смеси процесса Дирихле и как они могут быть использованы в кластерном анализе. В этой статье мы представим реализацию Java две разные модели DPMM: многомерная модель нормальной смеси Дирихле, которая может использоваться для кластеризации гауссовых данных, и модель полиномиальной смеси Дирихле, которая используется для кластеризации документов. Код Java поставляется с открытым исходным кодом под лицензией GPL v3 и может быть свободно загружен с Github.

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

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

Код реализует модель процесса Дирихле с помощью семплера Gibbs и использует Apache Commons Math 3.3 в качестве библиотеки матриц. Он лицензирован по GPLv3, поэтому не стесняйтесь использовать его, модифицировать и свободно распространять, и вы можете скачать реализацию Java с Github, Обратите внимание, что вы можете найти все теоретические части метода кластеризации в предыдущих 5 статьях и подробные комментарии Javadoc для реализации в исходном коде.

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

1. ДПММ класс

DPMM является абстрактным классом и действует как база для различных моделей, реализует Китайский ресторанный процесс и содержит Свернутый образец Гиббса. У него есть общедоступный метод cluster (), который получает набор данных в виде списка точек и отвечает за выполнение кластерного анализа. Другими полезными методами класса являются getPointAssignments (), который используется для получения назначений кластера после завершения кластеризации, и getClusterList (), который используется для получения списка идентифицированных кластеров. DPMM содержит статический вложенный абстрактный класс Cluster; он содержит несколько абстрактных методов, касающихся управления точками и оценки апостериорного PDF, которые используются для оценки кластерных назначений.

2. GaussianDPMM класс

GaussianDPMM является реализацией многомерной модели нормальной смеси Дирихле и расширяет класс DPMM. Он содержит все методы, необходимые для оценки вероятностей в предположении Гаусса. Кроме того, он содержит статический вложенный класс Cluster, который реализует все абстрактные методы класса DPMM.Cluster.

3. МультиномиальныйДПММ класс

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

4. SRS класс

Класс SRS используется для выполнения простой случайной выборки из таблицы частот. Он используется сэмплером Гиббса для оценки новых назначений кластера на каждом этапе итеративного процесса.

5. Точка класса

Класс Point служит кортежем, в котором хранятся данные записи вместе с ее идентификатором.

6. Математическая библиотека Apache Commons

Apache Commons Math 3.3 lib используется для умножения матриц и является единственной зависимостью нашей реализации.

7. Класс DPMMExample

Этот класс содержит примеры того, как использовать реализацию 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-Heatmap
Рисунок 2: Диаграмма рассеяния вероятностей центров кластеров

На рисунке выше мы строим эти вероятности; красные области указывают на высокую вероятность быть центром кластера, а черные области указывают на низкую вероятность.

Чтобы использовать реализацию Java в реальных приложениях, вы должны написать внешний код, который преобразует ваш исходный набор данных в требуемый формат. Кроме того, может потребоваться дополнительный код, если вы хотите визуализировать вывод, как мы видим выше. В заключение отметим, что библиотека Apache Commons Math включена в проект, и поэтому для запуска демонстраций не требуется никакой дополнительной настройки.

Если вы используете реализацию в интересном проекте, напишите нам, и мы представим ваш проект в нашем блоге. Также, если вам понравилась статья, пожалуйста, найдите время и поделитесь ею в Twitter или Facebook.

Отметка времени:

Больше от Датумбокс