如何基于差值阈值生成所有聚类结果并选择合适数据科学库?
你的聚类需求解决方案来啦!
先帮你理清所有符合准则的聚类结果
首先,咱们把阈值设为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
相关产品推荐
相关产品推荐

