You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于差值阈值生成所有聚类结果并选择合适数据科学库?

你的聚类需求解决方案来啦!

先帮你理清所有符合准则的聚类结果

首先,咱们把阈值设为10,按照「簇内任意两个数的差值都不能超过10」这个准则,所有有效的聚类结果就是你提到的这三个:

  • Cluster1: [40,45], [50,60]
  • Cluster2: [40,45,50], [60]
  • Cluster3: [40], [45,50], [60]

为啥不能把所有数放进同一个簇?因为40和60的差值是20,远超阈值10,不符合簇内所有数值对的差值要求,所以这个划分是无效的哈。

可用的工具库及实现方法

如果你想用现成的数据科学库来做这件事,或者辅助筛选结果,这些工具可以试试:

1. scikit-learn(Python最常用的机器学习库)

里面的**AgglomerativeClustering(层次聚类)**完全能满足你的需求,只要调整参数就能得到不同的聚类结果:

  • 要是想得到类似Cluster2的结果(尽可能把相邻且差值≤10的数合并),就用单链接规则,设置linkage='single'和distance_threshold=10:
    from sklearn.cluster import AgglomerativeClustering
    import numpy as np
    
    data = np.array([40,45,50,60]).reshape(-1,1)
    cluster_model = AgglomerativeClustering(n_clusters=None, distance_threshold=10, linkage='single')
    cluster_labels = cluster_model.fit_predict(data)
    # 输出的标签会是[0,0,0,1],对应Cluster2的划分
    
  • 要是想得到类似Cluster3的结果(更保守,只有簇内所有数对的差值都≤10才合并),就用全链接规则,设置linkage='complete':
    cluster_model = AgglomerativeClustering(n_clusters=None, distance_threshold=10, linkage='complete')
    cluster_labels = cluster_model.fit_predict(data)
    # 输出的标签会是[0,1,1,2],对应Cluster3的划分
    

不过要注意哦:scikit-learn的层次聚类只会给出一种基于你选的链接规则的最优结果,不会生成所有可能的有效划分。如果要找出所有符合条件的结果,可能得自己写点小代码来枚举筛选。

2. 自定义代码枚举所有有效结果

因为你的数据量很小,完全可以用Python的组合工具来遍历所有可能的划分,再筛选出符合准则的:

import itertools

data = [40,45,50,60]
threshold = 10
valid_clusters = []

# 定义一个生成所有可能子集划分的函数
def generate_all_partitions(arr):
    if len(arr) == 1:
        yield [arr]
        return
    first_num = arr[0]
    # 递归生成剩余元素的所有划分
    for rest_partition in generate_all_partitions(arr[1:]):
        # 把第一个数加入每个现有子集
        for i in range(len(rest_partition)):
            yield rest_partition[:i] + [[first_num] + rest_partition[i]] + rest_partition[i+1:]
        # 把第一个数作为单独的子集
        yield [[first_num]] + rest_partition

# 筛选符合条件的划分
for partition in generate_all_partitions(data):
    is_valid = True
    for cluster in partition:
        # 检查簇内所有数对的差值是否都≤阈值
        for a, b in itertools.combinations(cluster, 2):
            if abs(a - b) > threshold:
                is_valid = False
                break
        if not is_valid:
            break
    if is_valid:
        valid_clusters.append(partition)

# 打印所有有效结果
for idx, cl in enumerate(valid_clusters, 1):
    print(f"Cluster{idx}: {cl}")

这段代码跑起来就会输出你提到的三个有效聚类结果啦。

怎么选合适的聚类结果?

选哪种结果完全看你的业务需求:

  • 要是想让每个簇里的元素差异尽可能小,就选Cluster3;
  • 要是想尽量合并相似的相邻元素,减少簇的数量,就选Cluster2;
  • 要是想让各个簇的大小更均衡,就选Cluster1。

你可以根据后续的分析目标(比如建模需求、数据分组的用途)来决定最终用哪一种划分。

内容的提问来源于stack exchange,提问作者Suhail Sheth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:36:32