人工智能|机器学习——CURE聚类算法(层次聚类)

1.CURE聚类概述

绝大多数聚类算法或者擅长处理球形和相似大小的聚类.或者在存在孤立点时变得比较脆弱。CURE采用了一种新颖的层次聚类算法.该算法选择基于质心和基于代表对象方法之间的中间策略。它不同于单个质心或对象来代表一个类,而是选择数据空间中固定数目的具有代表性的点。一个类的代表点通过如下方式产生:首先选择类中分散的对象,然后根据一个特定的分数或收缩因子“收缩”或移动它们。在算法的每一步,有最近距离的代表点对(每个点来自于一个不同的类)的两个类被合并。

每个类有多于一个的代表点使得CURE可以适应非球形的几何形状。类的收缩或凝聚可以有助于控制孤立点的影响。因此,CURE对孤立点的处理更加健壮,而且能够识别非球形和大小变化比较大的类。针对大型数据库,CURE采用随机取样和划分两种方法组合:一个随机样本首先被划分,每个划分被部分聚类。

2 算法步骤

  • 从源数据对象中抽取一个随机样本S;
  • 将样本S分割成一组划分;
  • 对每个划分局部的聚类;
  • 通过随机样本剔除孤立点。如果一个类增长缓慢就去除它;
  • 对局部的类进行聚类,落在每个新形成的类中的代表点根据用户定义的一个收缩因子收缩或向类中心移动。这些点代表和捕捉到了类的形状。
  • 用相应的类标签来标记数据。

3.CURE 聚类特点

CURE,Clustering Using Representative 算法的特点如下:

  • (1)属于凝聚层次聚类

CURE 算法首先把每个数据点看成一个簇,然后将距离最近的簇 结合,一直到簇的个数达到要求的 K 个为止。

  • (2)适应非球形的几何形状

不同于一个质心或者单个点来代表一个类,CURE 算法中每个簇有多个代表点,这使得 CURE算法可以适应非球形的几何形状。

代表点的选取:
首先选择簇中距离质心最远的点做为第一个点,然后依次选择距离已选到的点最远的点,直到选到c 个点为止,这些点尽量得分散,捕获了簇的形状和大小。

  • (3)对孤立点的处理更加健壮

另外,CURE 算法还通过“收缩因子”减少离群点对聚类效果的影响。

代表点的收缩或凝聚:
将上面选取到的代表点根据固定的参数α(0≤α≤1 )向该簇的质心收缩,距离质心越远的点(例如离群点)的收缩程度越大,因此CURE对离群点是不太敏感的,这种方法可以有效的降低离群点带来的不利影响。

收缩系数α的取值不同,聚类结果也相应不同。

当 α 趋于 0 时,所有的“代表点”都汇聚到质心,算法退化为基于“质心”的聚类;
当 α 趋于 1 时,“代表点”完全没有收缩,算法退化为基于“全连接”的聚类,
因此 α 值需要根据数据特征灵活选取,才能得到更好的聚类结果

在得到收缩后的代表点后,两个簇之间的距离就可以定义为这两个簇中距离最近的两个代表点之间的距离

  • (4)识别异常值/离群点

CURE 算法分两个阶段消除异常值的影响。

第一个阶段、是在聚类算法执行到某一阶段(或称当前的簇总数减小到某个值)时,根据簇的增长速度和簇的大小对离群点进行一次识别。

第一阶段,将聚类过程中类成员增长非常缓慢的类作为异常值剔除;

CURE算法由于异常值同其他对象的距离更大,所以其所在类中对象数目的增大就会非常缓慢,甚至不增长。

需要注意的是:
如果这个阶段选择的较早(簇总数过大)的话,会将一部分本应被合并的簇识别为离群点;
如果这个阶段选择的较晚(簇总数过少)的话,离群点很可能在被识别之前就已经合并到某些簇中;
因此原文推荐当前簇的总数为数据集大小的1/3时,进行离群点的识别。

第一阶段有一个很明显的问题,就是当随机采样到的离群点分布的比较近时(即使可能性比较小),这些点会被合并为一个簇,而导致无法将他们识别出来,这时就需要第二阶段的来进行处理。

第二阶段,是指在聚类的最后阶段,将非常小的簇删除;

由于离群点占的比重很小,而在层次聚类的最后几步中,每个正常簇的粒度都是非常高的,因此很容易将他们识别出来,一般当簇的总数缩减到大约为 k 时,进行第二阶段的识别。

  • (5)适应大规模数据

为了适应大型数据,CURE算法采用了随机抽样和分割相结合的手段。

随机抽样将原始数据集中的部分点提取出来,然后试图在这些点上实施CURE层次聚类算法,采样形成的数据子集要适应内存的需要并且与原始数据集相比要足够小。因此,这种随机采样的方法会大大提升CURE的执行速度,并且由于采样过程会对离群点进行过滤因而可以提高聚类质量。

另外,CURE算法还引入了分割的手段,即样本分割成几个部门,然后针对各个部分中的对象进行局部聚类,形成子类,再针对子类进行聚类,新出新的类。

4.优缺点

优点

1)可以发现复杂空间的簇

2)受噪点影响小

缺点

1)参数较多,包括采样的大小、聚类的个数、收缩的比例等;

2) 抽样有误差;

3)难以发现形状非常复杂的空间簇(如中空形状),对空间数据密度差异敏感

4)虽然 CURE 聚类是针对大规模数据库设计的算法,但是当数据量剧增时,效率仍然不能满足需求

5.Python实现

# -*- coding: utf-8 -*-###########################################################################################
# Implementation of CURE (Clustering Using Representatives) Clustering Algorithm
# Author for codes: Chu Kun(kun_chu@outlook.com)
# Paper: https://www.sciencedirect.com/science/article/pii/S0306437901000084
# Reference: https://github.com/Kchu/CURE-cluster-python
###########################################################################################import numpy as np
import scipy.spatial.distance as distance
import sys# Returns the distance between two vectors
def dist(vecA, vecB):return np.sqrt(np.power(vecA - vecB, 2).sum())# This class describes the data structure and method of operation for CURE clustering.
class CureCluster:def __init__(self, id__, center__):self.points = center__self.repPoints = center__self.center = center__self.index = [id__]def __repr__(self):return "Cluster " + " Size: " + str(len(self.points))# Computes and stores the centroid of this cluster, based on its pointsdef computeCentroid(self, clust):totalPoints_1 = len(self.index)totalPoints_2 = len(clust.index)self.center = (self.center*totalPoints_1 + clust.center*totalPoints_2) / (totalPoints_1 + totalPoints_2)# Computes and stores representative points for this clusterdef generateRepPoints(self, numRepPoints, alpha):tempSet = Nonefor i in range(1, numRepPoints+1):maxDist = 0maxPoint = Nonefor p in range(0, len(self.index)):if i == 1:minDist = dist(self.points[p,:], self.center)else:X = np.vstack([tempSet, self.points[p, :]])tmpDist = distance.pdist(X)minDist = tmpDist.min()if minDist >= maxDist:maxDist = minDistmaxPoint = self.points[p,:]if tempSet is None:tempSet = maxPointelse:tempSet = np.vstack((tempSet, maxPoint))for j in range(len(tempSet)):if self.repPoints is None:self.repPoints = tempSet[j,:] + alpha * (self.center - tempSet[j,:])else:self.repPoints = np.vstack((self.repPoints, tempSet[j,:] + alpha * (self.center - tempSet[j,:])))# Computes and stores distance between this cluster and the other one.def distRep(self, clust):distRep = float('inf')for repA in self.repPoints:if type(clust.repPoints[0]) != list:repB = clust.repPointsdistTemp = dist(repA, repB)if distTemp < distRep:distRep = distTempelse:for repB in clust.repPoints:distTemp = dist(repA, repB)if distTemp < distRep:distRep = distTempreturn distRep# Merges this cluster with the given cluster, recomputing the centroid and the representative points.def mergeWithCluster(self, clust, numRepPoints, alpha):self.computeCentroid(clust)self.points = np.vstack((self.points, clust.points))self.index = np.append(self.index, clust.index)self.repPoints = Noneself.generateRepPoints(numRepPoints, alpha)# Describe the process of the CURE algorithm
def runCURE(data, numRepPoints, alpha, numDesCluster):# InitializationClusters = []numCluster = len(data)numPts = len(data)distCluster = np.ones([len(data), len(data)])distCluster = distCluster * float('inf')for idPoint in range(len(data)):newClust = CureCluster(idPoint, data[idPoint,:])Clusters.append(newClust)for row in range(0, numPts):for col in range(0, row):distCluster[row][col] = dist(Clusters[row].center, Clusters[col].center)while numCluster > numDesCluster:if np.mod(numCluster, 50) == 0:print('Cluster count:', numCluster)# Find a pair of closet clustersminIndex = np.where(distCluster == np.min(distCluster))minIndex1 = minIndex[0][0]minIndex2 = minIndex[1][0]# MergeClusters[minIndex1].mergeWithCluster(Clusters[minIndex2], numRepPoints, alpha)# Update the distCluster matrixfor i in range(0, minIndex1):distCluster[minIndex1, i] = Clusters[minIndex1].distRep(Clusters[i])for i in range(minIndex1+1, numCluster):distCluster[i, minIndex1] = Clusters[minIndex1].distRep(Clusters[i])# Delete the merged cluster and its disCluster vector.distCluster = np.delete(distCluster, minIndex2, axis=0)distCluster = np.delete(distCluster, minIndex2, axis=1)del Clusters[minIndex2]numCluster = numCluster - 1print('Cluster count:', numCluster)# Generate sample labelsLabel = [0] * numPtsfor i in range(0, len(Clusters)):for j in range(0, len(Clusters[i].index)):Label[Clusters[i].index[j]] = i + 1return Label

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539213.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Jenkins】data stream error|Error cloning remote repo ‘origin‘ 错误解决【亲测有效】

错误构建日志 17:39:09 ERROR: Error cloning remote repo origin 17:39:09 hudson.plugins.git.GitException: Command "git fetch --tags --progress http://domain/xxx.git refs/heads/*:refs/remotes/origin/*" returned status code 128: 17:39:09 stdout: 17…

粒子群算法对pi控制器进行参数优化,随时优化pi参数以控制直流无刷电机转速。

粒子群算法对pi控制器进行参数优化&#xff0c;随时优化pi参数以取得设定直流无刷电机转速。 PSO优化PID&#xff0c;用于BLDC速度控制 仿真平台为&#xff1a;MATLAB 采用的是Simulinkm程序相配合 仿真结果以及程序示例&#xff1a;

Python数据分析-4

1.对于一组电影数据&#xff0c;呈现出rating,runtime的分布情况&#xff1a; #encodingutf-8 import pandas as pd import numpy as np from matplotlib import pyplot as plt file_path "./youtube_video_data/IMDB-Movie-Data.csv" df pd.read_csv(file_path) …

若依Vue3图片预览大图遮罩层和表格的border css层级冲突

样式层级出现问题&#xff0c;表格的层级高于图片的层级 1.解决方式一&#xff1a;设置此文件的该属性&#xff08;z-index&#xff09;为继承&#xff0c;则显示正常 .el-table .el-table__cell { z-index: inherit; } 2.解决方式二&#xff1a;将此属性设置为true(本人试了…

数字生活的未来:探索Web3的全新世界

随着科技的飞速发展&#xff0c;我们正迈向一个数字化的未来。而在这个数字化的时代&#xff0c;Web3技术的崛起正引领着我们进入一个全新的世界。本文将深入探讨Web3技术的特点以及它给我们带来的全新体验。 1. 去中心化的特点 Web3的去中心化是其最显著的特点之一&#xff0…

【图论】计算图的n-hop邻居个数,并绘制频率分布直方图

计算图的n-hop邻居个数&#xff0c;并绘制频率分布直方图 在图论中&#xff0c;n-hop邻居&#xff08;或称为K-hop邻居&#xff09;是指从某个顶点出发&#xff0c;通过最短路径&#xff08;即最少的边数&#xff09;可以到达的所有顶点的集合&#xff0c;其中n&#xff08;或…

Jmeter扩展开发--自定义java取样器

简介 jmeter内置了包括&#xff1a;http、https、tcp等各种协议的支持&#xff0c;通常情况只需要做简单的参数配置即可使用。但在某些特殊情况下&#xff0c;还是希望能做自定义压测处理&#xff0c;此时就涉及Jmeter的扩展开发自定义Java取样器&#xff0c;如下图所示&#…

给电脑加硬件的办法 先找电脑支持的接口,再买相同接口的

需求&#xff1a;我硬盘太小&#xff0c;换或加一个大硬盘 结论&#xff1a;接口是NVMe PCIe 3.0 x4 1.找到硬盘型号 主硬盘 三星 MZALQ512HALU-000L2 (512 GB / 固态硬盘) 2.上官网查 或用bing查 非官方渠道信息&#xff0c;不确定。

linux安全--Nginx与Tomcat实现负载均衡

目录 1.实验拓扑原理图&#xff0c;前提实现全网互通 2.找到nginx的conf目录中的nginx.conf文件 3.实验效果 1.实验拓扑原理图&#xff0c;前提实现全网互通 搭建全网互通可以看https://blog.csdn.net/m0_74313947/article/details/136008513?spm1001.2014.3001.5501 搭建N…

微信小程序 uniapp奶茶点单系统r4112

系统功能有&#xff1a;信点单小程序分为小程序部分和后台管理两部分&#xff0c;小程序部分的主要功能包含&#xff1a;用户注册登录&#xff0c;查看商品信息&#xff0c;加入购物车&#xff0c;结算并生成订单&#xff0c;订单管理&#xff0c;资讯管理&#xff0c;个人中心…

创新营销的新篇章:企业如何通过VR虚拟发布会提升品牌影响力

在数字化转型的浪潮中&#xff0c;VR虚拟发布会作为一种新兴的营销手段&#xff0c;正逐渐成为企业品牌推广和产品发布的重要选择。通过利用虚拟现实技术&#xff0c;企业能够在虚拟空间中举办发布会&#xff0c;为参与者提供沉浸式的体验。 一、创新体验&#xff1a;虚拟空间的…

文字弹性跳动CSS3代码

文字弹性跳动CSS3代码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 下载地址 文字弹性跳动CSS3代码