Классификация неконтролируемого населения - PullRequest
2 голосов
/ 13 марта 2019

У меня есть набор данных с 2 параметрами, который выглядит примерно так (я добавил графики контуров плотности):

enter image description here

Моя цель состоит в том, чтобы разделить этот образец на 2 подмножества следующим образом:

enter image description here

Это изображение взято с ГАШЕНИЕ ФОРМИРОВАНИЯ ЗВЕЗДЫ В ГРУППАХ SDSS: ЦЕНТРАЛЫ, СПУТНИКИ И ГАЛАКТИЧЕСКОЕ СООТВЕТСТВИЕ, Knobel et. al., Astrophysical Journal, 800: 24 (20pp), 2015, февраль, 1 , доступно здесь . линия разделения нарисована на глаз и не идеальна.

Мне нужно что-то вроде красной линии (максимизация расстояний) на этом хорошем графике Википедии:

enter image description here

К сожалению, все линейные классификации, которые кажутся близкими к тому, что я ищу (SVM, SVC и т. Д.), Являются обучением под наблюдением.

Я пробовал обучение без учителя, как кластеры KMeans 2, таким образом (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 баллов) здесь .

Примечание: этот вопрос не соответствует моему случаю.

1 Ответ

1 голос
/ 14 марта 2019

Следующий код сделает это с моделью гауссовой смеси из 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')
...