网格聚类算法(二)



在本篇博文中,主要学习一下STING聚类算法。

      

(1) STING:统计信息网格


  STING是一种基于网格的多分辨率的聚类技术,它将输入对象的空间区域划分成矩形单元,空间可以用分层和递归方法进行划分。这种多层矩形单元对应不同的分辨率,并且形成了一个层次结构:每个高层单元被划分成低一层的单元。关于每个网格单元的属性的统计信息(如均值,最大值和最小值)被作为统计参数预先计算和存储。对于查询处理和其他数据分析任务,这些统计参数是有效的。

  STING算法:

  (1)      针对不同的分辨率,通常有多个级别的矩形单元。

  (2)      这些单元形成了一个层次结构,高层的每个单元被划分成多个底一层的单元。

  (3)      关于每个网格单元属性的统计信息(例如平均值,max,min)被预先计算和存储,这些统计信息用于回答查询。(统计信息是进行查询使用的)

 

  网格中常用的参数:

  (1)      count 网格中对象数目

  (2)      mean网格中所有值的平均值

  (3)      stdev网格中属性值的标准偏差

  (4)      min 网格中属性值的最小值

  (5)      max 网格中属性值的最大值

  (6)      distribution 网格中属性值符合的分布类型。如正态分布,均匀分布

 

  STING聚类的层次结构:

  通过上面两幅图,我们可以清晰的理解,STING的层次结构,上一层与下一层的关系。

 

  注意:当数据加载到数据库时。最底层的单元参数直接由数据计算,若分布类型知道,可以用户直接指定。而较高层的单元的分布类型可以基于它对应的低层单元多数的分布类型,用一个阈值过滤过程的合取来计算,若底层分布类型彼此不同,那么高层分布类型为none

 

  STING查询算法步骤:

  (1) 从一个层次开始

  (2) 对于这一个层次的每个单元格,我们计算查询相关的属性值。

  (3) 从计算的属性值以及约束条件下,我们将每一个单元格标记成相关或者不想关。(不相关的单元格不再考虑,下一个较低层的处理就只检查剩余的相关单元)

  (4) 如果这一层是底层,那么转(6),否则转(5)

  (5) 我们由层次结构转到下一层,依照步骤2进行

  (6) 查询结果得到满足,转到步骤8,否则(7)

  (7) 恢复数据到相关的单元格进一步处理以得到满意的结果,转到步骤(8)

  (8) 停止

 

  到这儿,STING算法应该基本就差不多了,其核心思想就是:根据属性的相关统计信息进行划分网格,而且网格是分层次的,下一层是上一层的继续划分。在一个网格内的数据点即为一个簇。

  同时,STING聚类算法有一个性质:如果粒度趋向于0(即朝向非常底层的数据),则聚类结果趋向于DBSCAN聚类结果。即使用计数count和大小信息,使用STING可以近似的识别稠密的簇。

  STING算法的优点:

 (1)     基于网格的计算是独立于查询的,因为存储在每个单元的统计信息提供了单元中数据汇总信息,不依赖于查询。

 (2)     网格结构有利于增量更新和并行处理。

 (3)     效率高。STING扫描数据库一次开计算单元的统计信息,因此产生聚类的时间复杂度为O(n),在层次结构建立之后,查询处理时间为)O(g),其中g为最底层网格单元的数目,通常远远小于n。

 缺点:

 (1) 由于STING采用了一种多分辨率的方法来进行聚类分析,因此STING的聚类质量取决于网格结构的最底层的粒度。如果最底层的粒度很细,则处理的代价会显著增加。然而如果粒度太粗,聚类质量难以得到保证。

 (2) STING在构建一个父亲单元时没有考虑到子女单元和其他相邻单元之间的联系。所有的簇边界不是水平的,就是竖直的,没有斜的分界线。降低了聚类质量。


      


  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网格聚类算法(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`函数进行网格聚类,并打印聚类结果。根据需要,可以调整数据和网格大小来测试不同的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值