首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算一维数据的均衡聚类?

如何计算一维数据的均衡聚类?
EN

Stack Overflow用户
提问于 2021-04-09 12:34:31
回答 1查看 91关注 0票数 0

我知道这里还有很多其他的问题,比如问什么聚类算法可以用于一维数据,但是我的问题是如何计算平衡的集群呢?

我有一份清单

代码语言:javascript
复制
l = [46, 48, 68, 46, 48, 68, 63, 62, 63, 63, 69, 54, 64, 61, 66, 54, 64, 67, 46, 48]

我知道我需要3组。但是使用KMeans聚类会给我

代码语言:javascript
复制
l = np.array(l, dtype=np.int16)
l = np.expand_dims(l, axis=1)

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3)
labels = kmeans.fit_predict(l)
print(labels)
> array([0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 0])

显然,集群是完全不平衡的:

代码语言:javascript
复制
print(np.unique(labels, return_counts=True))
> (array([0, 1, 2]), array([ 6, 12,  2], dtype=int64))

那么,是否有一种方法可以在Python中对一维数据进行集群,并有或多或少的平衡的集群?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-09 13:20:16

您可以通过将数组划分为3个分位数来实现这一点。在pandas中,您可以使用来自pandasqcut,如下面的示例所示。

代码语言:javascript
复制
l = [46, 48, 68, 46, 48, 68, 63, 62, 63, 63, 69, 54, 64, 61, 66, 54, 64, 67, 46, 48]

a = pd.qcut(l, 3, labels=[0, 1, 2])
print(a.to_numpy())
[0 0 2 0 0 2 1 1 1 1 2 0 2 1 2 0 2 2 0 0]

或者,您只需使用numpy中的np.quantile来手动计算分位数值,然后就可以用来为新的观测分配集群标签。

代码语言:javascript
复制
l = np.array([46, 48, 68, 46, 48, 68, 63, 62, 63, 63, 69, 54, 64, 61, 66, 54, 64, 67, 46, 48])

lower_q = np.quantile(l, 1/3)
upper_q = np.quantile(l, 2/3)

cl = []
for v in l:
    if v <= lower_q:
        cl.append(0)
    elif v > lower_q and v <= upper_q:
        cl.append(1)
    else: 
        cl.append(2)

cl = np.array(cl)
print(cl)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67021257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档