Кластеризация перекрывающихся эллипсов - PullRequest
0 голосов
/ 01 марта 2019

У меня есть набор данных, который состоит из более чем одного подмножества данных.Если я нанесу Y на X, я получу несколько перекрывающихся эллипсов и хочу их сгруппировать *.

Я пробовал с mixture из sklearn, Bayesian Gaussian Mixture Model дает лучший результат, однако он не распознает перекрывающиеся данные:

enter image description here

import itertools
import numpy as np
import pylab as plt
from sklearn import mixture
from matplotlib.patches import Ellipse
field_File_1 = './dummy_distrib_3.txt' 
'''
    link to data: 
    https://www.dropbox.com/s/jd3wx1ee8r1mj8p/dummy_distrib_3.txt?dl=0
'''
my_dis_1 = np.loadtxt(field_File_1)

X = my_dis_1[:50000,:2]

BaGaMiMo = mixture.BayesianGaussianMixture(n_components=2, covariance_type='full', 
                                         weight_concentration_prior_type='dirichlet_distribution').fit(X)

X1 = X[BaGaMiMo.predict(X) == 0, :]
X2 = X[BaGaMiMo.predict(X) == 1, :]

plt.figure(figsize=(18.0, 6.0))
plt.subplot(1,3,1)
plt.scatter(X[:,0], X[:,1], 0.2, color='m')

plt.subplot(1,3,2)
plt.scatter(X[BaGaMiMo.predict(X) == 0, 0], X[BaGaMiMo.predict(X) == 0, 1], .2, color='navy')

plt.subplot(1,3,3)
plt.scatter(X[BaGaMiMo.predict(X) == 1, 0], X[BaGaMiMo.predict(X) == 1, 1], .2, color='c')
plt.show()

Далее я подгоняю два эллипса к распределению голубого и темно-синего цветов и удаляю частицы в поперечном сечении из распределения голубого,

enter image description here

затем случайным образом назначьте их военно-морским и голубым распределениям с вычисленным соотношением:

enter image description here

Одна из проблем заключается в том, что если я делаю гистограмму данных, я замечаю, что в голубых данных на линии пересечения двух эллипсов имеется переполнение / разрыв, и я ищу способы уменьшить это переполнение, любоепомощь приветствуется.

jupyter-notebook можно скачать здесь: https://www.dropbox.com/s/z1tdgpx1g1lwtb5/Clustering.ipynb?dl=0

. * Точки данных принадлежат двум наборам заряженных частиц.

1 Ответ

0 голосов
/ 06 марта 2019

Может быть, это поможет.Я использовал predict_proba() вместо predict(), чтобы получить вероятности того, что точка принадлежит какой-либо группе.Тогда я играл с отсечкой.Установив отсечку до 0,5, я получил те же результаты, что и вы.После некоторых проб и ошибок, отсечка 0,933, кажется, добивается цели.

p1 = X[BaGaMiMo.predict_proba(X)[:,0] > 0.933, :]
p2 = X[BaGaMiMo.predict_proba(X)[:,0] <= 0.933, :]
plt.scatter(p1[:,0], p1[:,1], 0.2, color='m')
plt.scatter(p2[:,0], p2[:,1], 0.2, color='navy')

Scatter plot with 0.933 cutoff between groups

...