One-Pass聚类方法
一次通过聚类是一种简单且高效的聚类算法,特别适用于数据以流的形式到达或需要实时处理的场景。这种算法逐个处理数据点,并根据预定义的相似度阈值将数据点分配到现有聚类中,或者创建新的聚类。
一次通过聚类的关键步骤:
-
初始化: 从一个空的聚类集合开始。
-
处理数据点: 对于每一个新到的数据点:
-
相似度检查: 计算该数据点与每个现有聚类中心的相似度(或距离)。
-
聚类分配: 如果与最近聚类的相似度超过预定义的阈值,将该数据点分配到该聚类中,并更新该聚类的中心点。
-
新聚类形成: 如果没有任何现有聚类满足相似度阈值,创建一个新的聚类,并将当前数据点作为其中心。
-
-
重复: 对所有数据点重复以上过程。
这种方法特别适合在线或实时聚类场景,无需存储所有数据,而是可以逐个处理和决策。
参考代码:
import numpy as np
class OnePassClustering:
def __init__(self, threshold):
self.threshold = threshold
self.clusters = []
def fit(self, data, key):
for record in data:
self._add_point(record, key)
def _add_point(self, record, key):
if not self.clusters:
self.clusters.append([record])
else:
added = False
for cluster in self.clusters:
cluster_center = np.mean([np.array(item[key]) for item in cluster], axis=0)
if self._distance(record[key], cluster_center) < self.threshold:
cluster.append(record)
added = True
break
if not added:
self.clusters.append([record])
def _distance(self, point1, point2):
return np.linalg.norm(point1 - point2)
def get_clusters(self):
return self.clusters
# 示例数据
data = [
{"id": 1, "value": [1.0, 2.0], "other_field": "A"},
{"id": 2, "value": [2.0, 3.0], "other_field": "B"},
{"id": 3, "value": [10.0, 10.0], "other_field": "A"},
{"id": 4, "value": [11.0, 11.0], "other_field": "C"},
{"id": 5, "value": [1.1, 2.1], "other_field": "B"}
]
# 创建one-pass聚类对象,并设置阈值
clustering = OnePassClustering(threshold=2.0)
# 拟合数据,根据'value'字段
clustering.fit(data, key="value")
# 获取聚类结果
clusters = clustering.get_clusters()
for i, cluster in enumerate(clusters):
print(f"Cluster {i}: {cluster}")