- 7 июля 2014 г.
- Василис Вриниотис
- . 1 Комментарий
В предыдущих статьях мы подробно обсуждали смешанные модели процесса Дирихле и то, как их можно использовать в кластерном анализе. В этой статье мы представим реализацию двух разных моделей DPMM на Java: многомерную нормальную смешанную модель Дирихле, которую можно использовать для кластеризации гауссовых данных, и полиномиальную смешанную модель Дирихле, которая используется для кластеризации документов. Код Java находится в открытом доступе под лицензией GPL v3 и может быть бесплатно загружен с Гитхаб.
Обновление: платформа машинного обучения Datumbox теперь имеет открытый исходный код и бесплатна для скачать. Ознакомьтесь с пакетом com.datumbox.framework.machinelearning.clustering, чтобы увидеть реализацию смешанных моделей процессов Дирихле в Java.
Реализация модели смеси процессов Дирихле на Java
Код реализует модель смеси процессов Дирихле с сэмплером Гиббса и использует Apache Commons Math 3.3 в качестве библиотеки матриц. Он находится под лицензией GPLv3, поэтому не стесняйтесь использовать его, модифицировать и свободно распространять. Вы можете скачать реализацию Java с Гитхаб. Обратите внимание, что вы можете найти все теоретические части метода кластеризации в предыдущих 5 статьях и подробные комментарии Javadoc для реализации в исходном коде.
Ниже мы приводим высокоуровневое описание кода:
1. Класс ДПММ
DPMM — это абстрактный класс, который служит основой для различных моделей, реализует процесс китайского ресторана и содержит пробоотборник Collapsed Gibbs. Он имеет общедоступный метод cluster(), который получает набор данных в виде списка точек и отвечает за выполнение кластерного анализа. Другими полезными методами класса являются getPointAssignments(), который используется для получения назначений кластеров после завершения кластеризации, и getClusterList(), который используется для получения списка идентифицированных кластеров. DPMM содержит статический вложенный абстрактный класс Cluster; он содержит несколько абстрактных методов, касающихся управления точками и оценки апостериорной PDF, которые используются для оценки кластерных назначений.
2. Класс GaussianDPMM
GaussianDPMM является реализацией модели многомерной нормальной смеси Дирихле и расширяет класс DPMM. Он содержит все методы, необходимые для оценки вероятностей в предположении Гаусса. Кроме того, он содержит статический вложенный класс Cluster, который реализует все абстрактные методы класса DPMM.Cluster.
3. Мультиномиальный класс DPMM
MultinomialDPMM реализует полиномиальную смешанную модель Дирихле и расширяет класс DPMM. Подобно классу GaussianDPMM, он содержит все методы, необходимые для оценки вероятностей в предположении полинома-Дирихле, и содержит статический вложенный класс Cluster, который реализует абстрактные методы DPMM.Cluster.
4. Класс СРС
Класс SRS используется для выполнения простой случайной выборки из таблицы частот. Он используется пробоотборником Гиббса для оценки новых назначений кластеров на каждом этапе итеративного процесса.
5. Класс очков
Класс Point служит кортежем, в котором хранятся данные записи вместе с ее идентификатором.
6. Математическая библиотека Apache Commons
Библиотека Apache Commons Math 3.3 используется для умножения матриц и является единственной зависимостью нашей реализации.
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 точек данных. Точки были первоначально сгенерированы тремя различными распределениями: N((10,50), I), N((50,10), I) и N((150,100), I).
Рисунок 1: Точечная диаграмма демонстрационного набора данных
Алгоритм после 10 итераций определил следующие 3 кластерных центра: (10,17, 50,11), (49,99, 10,13) и (149,97, 99,81). Наконец, поскольку мы рассматриваем все в байесовской манере, мы можем не только обеспечить одноточечные оценки центров кластеров, но и их вероятностное распределение, используя формула .
Рисунок 2: Диаграмма рассеяния вероятностей центров кластеров
На рисунке выше мы наносим эти вероятности; красные области указывают на высокую вероятность оказаться в центре кластера, а черные области указывают на низкую вероятность.
Чтобы использовать реализацию Java в реальных приложениях, вы должны написать внешний код, который преобразует ваш исходный набор данных в требуемый формат. Кроме того, может потребоваться дополнительный код, если вы хотите визуализировать вывод, как мы видим выше. Наконец, обратите внимание, что в проект включена библиотека Apache Commons Math, поэтому для запуска демонстраций не требуется дополнительная настройка.
Если вы используете реализацию в интересном проекте, напишите нам, и мы опубликуем ваш проект в нашем блоге. Также, если вам понравилась статья, пожалуйста, найдите минутку и поделитесь ею в Twitter или Facebook.