网格聚类算法(三)

CLIQUE:一种类似于Apriori的子空间聚类算法

 

  CLIQUE算法是基于网格的空间聚类算法,但它同时也非常好的结合了基于密度的聚类算法,因此既能够发现任意形状的簇,又可以像基于网格的算法一样处理较大的多维数据。

  CLIQUE算法把每个维划分成不重叠的社区,从而把数据对象的整个嵌入空间划分成单元,它使用一个密度阈值来识别稠密单位,一个单元是稠密的,如果映射到它的对象超过密度阈值。

  总结之就是:CLIQUE算法是一种基于网格的聚类算法,用于发现子空间中基于密度的簇。

 

  算法概述:

  算法需要两个参数:一个是网格的步长,第二个是密度的阈值

  网格步长确定了空间的划分,而密度阈值用来定义密集网格

   聚类思想:

  (1)     首先扫描所有网格。当发现第一个密集网格时,便以该网格开始扩展,扩展原则是若一个网格与已知密集区域内的网格邻接并且其其自身也是密集的,则将该网格加入到该秘籍区域中,知道不再有这样的网格被发现为止。(密集网格合并)

  (2)     算法再继续扫描网格并重复上述过程,知道所有网格被遍历。以自动地发现最高维的子空间,高密度聚类存在于这些子空间中,并且对元组的输入顺序不敏感,无需假设任何规范的数据分布,它随输入数据的大小线性地扩展,当数据的维数增加时具有良好的可伸缩性。

 


  聚类算法如上图所示,总结之就是:首先判断是不是密集网格,如果是密集网格。那么对其相邻的网格进行遍历,看是否是密集网格,如果是的话,那么属于同一个簇。

   CLIQUE优点:

  (1)      给定每个属性的划分,单遍数据扫描就可以确定每个对象的网格单元和网格单元的计数。

  (2)      尽管潜在的网格单元数量可能很高,但是只需要为非空单元创建网格。

  (3)      将每个对象指派到一个单元并计算每个单元的密度的时间复杂度和空间复杂度为O(m),整个聚类过程是非常高效的

   缺点:

  (1)      像大多数基于密度的聚类算法一样,基于网格的聚类非常依赖于密度阈值的选择。(太高,簇可能丢失。太低,本应分开的簇可能被合并)

  (2)      如果存在不同密度的簇和噪声,则也许不可能找到适合于数据空间所有部分的值。

  (3)      随着维度的增加,网格单元个数迅速增加(指数增长)。即对于高维数据,基于网格的聚类倾向于效果很差。

  • 5
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
网格聚类算法(Grid-based clustering algorithm)是一种基于网格划分的聚类方法。下面是一个简单的Python代码示例,用于实现网格聚类算法: ```python import numpy as np # 定义网格类 class Grid: def __init__(self, x, y): self.x = x self.y = y self.points = [] # 定义网格聚类算法 def grid_clustering(data, grid_size): # 计算数据范围 min_x, max_x = np.min(data[:, 0]), np.max(data[:, 0]) min_y, max_y = np.min(data[:, 1]), np.max(data[:, 1]) # 计算网格数量 num_x = int((max_x - min_x) / grid_size) + 1 num_y = int((max_y - min_y) / grid_size) + 1 # 初始化网格 grids = [[Grid(x, y) for y in range(num_y)] for x in range(num_x)] # 将数据点分配到网格 for point in data: x_idx = int((point[0] - min_x) / grid_size) y_idx = int((point[1] - min_y) / grid_size) grids[x_idx][y_idx].points.append(point) # 获取聚类结果(非空网格) clusters = [] for row in grids: for grid in row: if len(grid.points) > 0: cluster = np.array(grid.points) clusters.append(cluster) return clusters # 生成随机数据 np.random.seed(0) data = np.random.rand(100, 2) # 进行网格聚类 clusters = grid_clustering(data, grid_size=0.1) # 打印聚类结果 for i, cluster in enumerate(clusters): print(f"Cluster {i+1}:") print(cluster) print() ``` 上述代码中,首先定义了一个`Grid`类,用于表示网格的坐标和其中包含的数据点。然后定义了`grid_clustering`函数,实现了网格聚类算法。在该函数中,首先计算了数据的范围,并根据网格大小计算了网格的数量。然后初始化了网格列表,并将数据点分配到对应的网格中。最后返回非空网格作为聚类结果。 最后,通过生成随机数据,调用`grid_clustering`函数进行网格聚类,并打印聚类结果。根据需要,可以调整数据和网格大小来测试不同的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值