【问题标题】:How to calculate balanced cluster of 1-d data?如何计算一维数据的平衡集群?
【发布时间】:2021-07-05 08:13:39
【问题描述】:

我知道这里有许多其他问题,询问哪些聚类算法可用于一维数据,但我的问题是如何计算 平衡 聚类?

例如我有一个清单

l = [46, 48, 68, 46, 48, 68, 63, 62, 63, 63, 69, 54, 64, 61, 66, 54, 64, 67, 46, 48]

我知道我需要 3 个集群。但是使用 KMeans 聚类会给我带来好处

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])

显然聚类是完全不平衡的:

print(np.unique(labels, return_counts=True))
> (array([0, 1, 2]), array([ 6, 12,  2], dtype=int64))

那么,有没有办法在 Python 中对一维数据进行聚类,并具有或多或少的平衡聚类?

【问题讨论】:

    标签: python python-3.x cluster-analysis k-means


    【解决方案1】:

    您可以通过将数组分成 3 个分位数来做到这一点。在pandas 中,您可以使用qcut 中的pandas,如下例所示。

    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 手动计算分位数值,然后可以使用这些值在新观察值上分配集群标签。

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-03-26
      • 2019-06-17
      • 2022-07-17
      • 2019-03-09
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多