One-Pass聚类方法

One-Pass聚类方法

一次通过聚类是一种简单且高效的聚类算法,特别适用于数据以流的形式到达或需要实时处理的场景。这种算法逐个处理数据点,并根据预定义的相似度阈值将数据点分配到现有聚类中,或者创建新的聚类。

一次通过聚类的关键步骤:

  1. 初始化: 从一个空的聚类集合开始。

  2. 处理数据点: 对于每一个新到的数据点:

    • 相似度检查: 计算该数据点与每个现有聚类中心的相似度(或距离)。

    • 聚类分配: 如果与最近聚类的相似度超过预定义的阈值,将该数据点分配到该聚类中,并更新该聚类的中心点。

    • 新聚类形成: 如果没有任何现有聚类满足相似度阈值,创建一个新的聚类,并将当前数据点作为其中心。

  3. 重复: 对所有数据点重复以上过程。

这种方法特别适合在线或实时聚类场景,无需存储所有数据,而是可以逐个处理和决策。

参考代码:

      
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}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值