如何将内核密度估计作为scikit中的一维聚类方法来学习?
cluster-analysis
data-mining
machine-learning
scikit-learn
5
0

我需要将简单的单变量数据集聚类到预设数量的聚类中。从技术上讲,由于它只是一维的,因此更接近于对数据进行分类或排序,但是我的老板称其为聚类,因此我将继续使用该名称。我正在使用的系统当前使用的方法是K-means,但这似乎有些过分。

有没有更好的方法来执行此任务?

其他一些帖子的答案提到了KDE(内核密度估计),但这是一种密度估计方法,它将如何工作?

我知道KDE如何返回密度,但是如何告诉它将数据拆分为bin?

如何获得与数据无关的固定数量的容器(这是我的要求之一)?

更具体地说,如何使用scikit实现这一目标?

我的输入文件如下所示:

 str ID     sls
 1           10
 2           11 
 3            9
 4           23
 5           21
 6           11  
 7           45
 8           20
 9           11
 10          12

我想将sls号分组为群集或垃圾箱,例如:

Cluster 1: [10 11 9 11 11 12] 
Cluster 2: [23 21 20] 
Cluster 3: [45] 

我的输出文件如下所示:

 str ID     sls    Cluster ID  Cluster centroid
    1        10       1               10.66
    2        11       1               10.66
    3         9       1               10.66 
    4        23       2               21.33   
    5        21       2               21.33
    6        11       1               10.66
    7        45       3               45
    8        20       2               21.33
    9        11       1               10.66 
    10       12       1               10.66
参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

自己编写代码。然后,它最适合您的问题!

样板:永远不要假设您从网上下载的代码正确或最优……请确保在使用前完全理解它。

%matplotlib inline

from numpy import array, linspace
from sklearn.neighbors.kde import KernelDensity
from matplotlib.pyplot import plot

a = array([10,11,9,23,21,11,45,20,11,12]).reshape(-1, 1)
kde = KernelDensity(kernel='gaussian', bandwidth=3).fit(a)
s = linspace(0,50)
e = kde.score_samples(s.reshape(-1,1))
plot(s, e)

在此处输入图片说明

from scipy.signal import argrelextrema
mi, ma = argrelextrema(e, np.less)[0], argrelextrema(e, np.greater)[0]
print "Minima:", s[mi]
print "Maxima:", s[ma]
> Minima: [ 17.34693878  33.67346939]
> Maxima: [ 10.20408163  21.42857143  44.89795918]

因此,您的集群是

print a[a < mi[0]], a[(a >= mi[0]) * (a <= mi[1])], a[a >= mi[1]]
> [10 11  9 11 11 12] [23 21 20] [45]

在视觉上,我们进行了以下拆分:

plot(s[:mi[0]+1], e[:mi[0]+1], 'r',
     s[mi[0]:mi[1]+1], e[mi[0]:mi[1]+1], 'g',
     s[mi[1]:], e[mi[1]:], 'b',
     s[ma], e[ma], 'go',
     s[mi], e[mi], 'ro')

在此处输入图片说明

我们剪掉红色标记。绿色标记是我们对聚类中心的最佳估计。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号