CLARANS算法

转载http://www.idataskys.com/%E8%81%9A%E7%B1%BB%E5%88%86%E6%9E%90%E4%B9%8Bclarans%E7%AE%97%E6%B3%95/

CLARANS (A Clustering Algorithm based on Randomized Search,基于随机选择的聚类算法) 将采样技术(CLARA)和PAM结合起来。CLARA的主要思想是:不考虑整个数据集合,而是选择实际数据的一小部分作为数据的代表。然后用PAM方法从样本中选择中心点。如果样本是以非常随机的方式选取的,那么它应当接近代表原来的数据集。从中选出代表对象(中心点)很可能和从整个数据集合中选出的代表对象相似。CLARA抽取数据集合的多个样本,对每个样本应用PAM算法,并返回最好的聚类结果作为输出。 

        CLARA的有效性主要取决于样本的大小。如果任何一个最佳抽样中心点不在最佳的K个中心之中,则CLARA将永远不能找到数据集合的最佳聚类。同时这也是为了聚类效率做付出的代价。 

        CLARANS聚类则是将CLARA和PAM有效的结合起来,CLARANS在任何时候都不把自身局限于任何样本,CLARANS在搜素的每一步都以某种随机性选取样本。算法步骤如下(算法步骤摘自百度文库): 

1、输入参数numlocal和maxneighbor。numlocal 表示抽样的次数, maxneighbor 表示一个节点可以与任意特定邻居进行比较的数目 令:i=1,i用来表示已经选样的次数 mincost为最小代价,初始时设为大数。 

2、设置当前节点current为Gn中的任意一个节点。 

3、令j =1。(j用来表示已经与current进行比较的邻居的个数) 

4、考虑当前点的一个随机的邻居S,并计算两个节点的代价差。

5、如果S的代价较低,则current:=S,转到步骤3。 

6、否则,令j=j+1。如果j<=maxneighbor,则转到步骤4。 

7、否则 ,当j>maxneighbor,当前节点为本次选样最小代价节点. 如果其代价小于mincost,令mincost为当前节点的代价,bestnode为当前的节点。 

8、令 i= i+1,如果i〉numlocal,输出bestnode,运算中止.否则,转到步骤2。 对上面出现一些概念进行说明: 

    (1)代价值,主要描述一个对象被分到一个类别中的代价值,该代价值由每个对象与其簇中心点间的相异度(距离或者相似度)的总和来定义。代价差则是两次随机领域的代价差值。 

    (2)更新邻接点,CLARANS不会把搜索限制在局部区域,如果发现一个更好的近邻,CLARANS就移到该近邻节点,处理过程从新开始;否则,当前的聚类则产生了一个局部最小。如果找到一个局部最小,CLARANS从随机选择的新节点开始,搜索新的局部最小。当搜索的局部最小解达到用户指定的数目时,最好的局部最小作为算法的输出。从上面的算法步骤也可以看出这一思想。在第5步中更新节点current。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Clarans算法是一种基于选择的聚类算法,它主要用于解决数据挖掘领域中的聚类问题。该算法的Python代码实现如下: ```python # 导入相关库 import numpy as np class Clarans: def __init__(self, data, num_clusters, num_local, max_neighbours): self.data = data self.num_clusters = num_clusters self.num_local = num_local self.max_neighbours = max_neighbours self.clusters = [] self.best_cost = float('inf') def fit(self): # 初始化聚类中心 initial_centers = np.random.choice(self.data, size=self.num_clusters, replace=False) for _ in range(self.num_local): current_centers = np.copy(initial_centers) while True: # 随机选择一个簇和一个邻居 idx = np.random.choice(range(self.num_clusters)) neighbour = np.random.randint(len(self.data)) if neighbour not in current_centers: temp_centers = current_centers.copy() temp_centers[idx] = self.data[neighbour] cost = self.calculate_cost(temp_centers) if cost < self.best_cost: current_centers = temp_centers self.best_cost = cost self.clusters.append(current_centers) def calculate_cost(self, centers): cost = 0 for point in self.data: distances = [np.linalg.norm(point - center) for center in centers] cost += min(distances) return cost # 使用示例 data = np.array([[1, 2], [1, 3], [2, 2], [8, 7], [8, 8], [9, 8]]) clarans = Clarans(data, num_clusters=2, num_local=10, max_neighbours=3) clarans.fit() print(clarans.clusters) ``` 以上就是Clarans算法的Python实现代码。通过不断随机选择簇和邻居,并计算总成本,最终得到最优的聚类中心点。在示例中,我们使用了一个简单的二维数据集进行演示。在实际应用中,我们可以根据具体需求调整参数以获得更好的聚类效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值