无监督的人口分类

时间:2019-03-13 13:42:17

标签: python machine-learning unsupervised-learning

我有一个包含2个参数的数据集,看起来像这样(我已经添加了密度等高线图):

enter image description here

我的目标是将此样本分为两个子集,如下所示:

enter image description here

此图片来自 SDSS组中恒星形成的猝灭:中央,卫星和银河整合,Knobel等。等人,《天体物理学杂志》,800:24(20pp),2015年2月1日here。的 分隔线已被绘制出来,并不完美。

我需要的是这个漂亮的Wikipedia图中的红线(最大距离)之类的东西:

enter image description here

不幸的是,所有看起来与我正在寻找的线性分类(SVM,SVC等)都属于监督学习。

我尝试过无监督学习,例如KMeans 2 clusteers,这种方式(CompactSFR[['lgm_tot_p50','sSFR']]是您在本文结尾处可以找到的Pandas数据集):

X = CompactSFR[['lgm_tot_p50','sSFR']]
from sklearn.cluster import KMeans

kmeans2 = KMeans(n_clusters=2)
# Fitting the input data
kmeans2 = kmeans2.fit(X)
# Getting the cluster labels
labels2 = kmeans2.predict(X)
# Centroid values
centroids = kmeans2.cluster_centers_
f, (ax1,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(10, 5), sharey=True)
ax1.scatter(CompactSFR['lgm_tot_p50'],CompactSFR['sSFR'],c=labels2);
X2 = kmeans2.transform(X)
ax1.set_title("Kmeans 2 clusters", fontsize=15)
ax1.set_xlabel('$\log_{10}(M)$',fontsize=10) ;
ax1.set_ylabel('sSFR',fontsize=10) ;
f.subplots_adjust(hspace=0)

但是我得到的分类是:

enter image description here

什么都不起作用。

此外,我想要的不是简单的分类,而是分隔线的方程(显然与线性回归有很大不同)。

如果要已经存在某些东西,我想避免建立最大似然的贝叶斯模型。

您可以找到一个小样本(959分)here

NB:this question与我的情况不符。

1 个答案:

答案 0 :(得分:1)

以下代码将对包含2个组件的高斯混合模型进行处理,并产生此结果。 result figure

首先,从文件中读取数据并删除异常值:

import pandas as pd
import numpy as np
from sklearn.neighbors import KernelDensity

frm = pd.read_csv(FILE, index_col=0)
kd = KernelDensity(kernel='gaussian')
kd.fit(frm.values)
density = np.exp(kd.score_samples(frm.values))
filtered = frm.values[density>0.05,:]

然后拟合高斯混合模型:

from sklearn.mixture import GaussianMixture
model = GaussianMixture(n_components=2, covariance_type='full')
model.fit(filtered)
cl = model.predict(filtered)

要获取图解:

import matplotlib.pyplot as plt
plt.scatter(filtered[cl==0,0], filtered[cl==0,1], color='Blue')
plt.scatter(filtered[cl==1,0], filtered[cl==1,1], color='Red')