我有一个数据集,其中包含多个数据子集。如果我绘制Y与X的关系图,则会得到很少的重叠椭圆,并且希望将它们聚类*。
我尝试使用mixture
中的sklearn
,Bayesian Gaussian Mixture Model
的效果最好,但是它不能识别重叠的数据:
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()
接下来,我要对青色和海军色分布拟合两个椭圆,并从青色分布中删除横截面中的粒子,
然后按照计算出的比率将它们随机分配给海军和青色分布:
一个问题是,如果我对数据进行直方图处理,我会注意到在两个椭圆的交点处的青色数据中存在人口过多/间断现象,我正在寻找减少这种情况的方法,人口,我们将不胜感激。
jupyter-notebook
可以在这里下载:https://www.dropbox.com/s/z1tdgpx1g1lwtb5/Clustering.ipynb?dl=0
。*数据点属于两组带电粒子。
答案 0 :(得分:3)
也许这会有所帮助。我使用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')