2017-02-10 10 views
0

Я хотел бы найти пороговое значение для бимодального распределения. Например, бимодальное распределение может выглядеть следующим образом:Определение порогового значения для бимодального распределения с помощью кластеризации KMeans

import numpy as np 
import matplotlib.pyplot as plt 
np.random.seed(45) 
n = 1000; b = n//10; i = np.random.randint(0,2,n) 
x = i*np.random.normal(-2.0,0.8,n) + (1-i)*np.random.normal(2.0,0.8,n) 
_ = plt.hist(x,bins=b) 

bimodal_histogram

попытка найти центры кластеров не работали, так как я не был уверен, как матрица, ч, должны быть отформатированы :

from sklearn.cluster import KMeans 
h = np.histogram(x,bins=b) 
h = np.vstack((0.5*(h[1][:-1]+h[1][1:]),h[0])).T # because h[0] and h[1] have different sizes. 
kmeans = KMeans(n_clusters=2).fit(h) 

Я бы ожидать, чтобы быть в состоянии найти центры кластеров вокруг -2 и 2. пороговое значение затем будет серединой двух центров кластеров.

ответ

1

Ваш вопрос немного запутанный для меня, поэтому, пожалуйста, дайте мне знать, если я неправильно его интерпретирую. Я думаю, что вы в основном пытаетесь сделать 1D kmeans и пытаетесь ввести частоту в качестве второго измерения, чтобы получить KMeans, но на самом деле просто будет доволен [-2,2] как выход для центров вместо [(-2,y1), (2,y2)].

Чтобы сделать 1D kmeans вы можете просто изменить свои данные, чтобы быть n векторов 1 длины (аналогичный вопрос: Scikit-learn: How to run KMeans on a one-dimensional array?)

код:

import numpy as np 
import matplotlib.pyplot as plt 
np.random.seed(45) 
n = 1000; 
b = n//10; 
i = np.random.randint(0,2,n) 
x = i*np.random.normal(-2.0,0.8,n) + (1-i)*np.random.normal(2.0,0.8,n) 
_ = plt.hist(x,bins=b) 

from sklearn.cluster import KMeans 
h = np.histogram(x,bins=b) 
h = np.vstack((0.5*(h[1][:-1]+h[1][1:]),h[0])).T # because h[0] and h[1] have different sizes. 

kmeans = KMeans(n_clusters=2).fit(x.reshape(n,1)) 
print kmeans.cluster_centers_ 

выход:

[[-1.9896414] 
[ 2.0176039]] 

 Смежные вопросы

  • Нет связанных вопросов^_^