【Python】基于密度和划分的15种聚类算法全家桶

目录

1 主要内容

DBSCAN聚类算法

Kmeans聚类算法

数据说明

2 部分程序

3 程序结果

4 下载链接


主要内容

该程序为python代码实现数据聚类分析,聚类分析在电力系统上应用非常广泛,如全年的风、光和负荷数据量比较大,为了提高分析效率,可以将全年数据聚类得到几类不同场景,通过概率权值的方式实现“代表性”分析,还可以用于用户用电行为特点等方面,该程序作为全家桶,包含基于密度的聚类DBSCAN算法、基于划分的聚类AP算法、基于密度的空间聚类自适应算法、

基于密度的聚类OPTICS算法、基于划分的聚类KMeans算法、基于划分和密度的聚类CFSFDP算法、基于DBSCAN改造的时空聚类算法等15类聚类算法,基本做到句句注释,方便学习研究。

  • DBSCAN聚类算法

DBSCAN 聚类定义为:由密度可达关系导出的最大密度相连样本集合构成一个聚类簇,簇中可有一个或多个核心对象。若仅一个核心对象,其他非核心对象在其 ϵ- 邻域内;若多个核心对象,任一核心对象的 ϵ- 邻域必有其他核心对象,这些核心对象 ϵ- 邻域内所有样本组成 DBSCAN 聚类簇。

寻找聚类簇样本集合的方法:任选无类别的核心对象作种子,找出其密度可达的样本集合,构成一个聚类簇。之后不断选取未分类的核心对象,重复上述过程找新聚类簇,直至所有核心对象都有类别。

Kmeans聚类算法

K-means 算法是一种聚类算法。聚类是依据相似性原则,把相似度高的数据对象归为同一类簇,相异度高的分到不同类簇。它与分类的关键区别在于:聚类是无监督过程,待处理数据无先验知识;分类是有监督过程,有带先验知识的训练数据集。

在 K-means 算法里,K表示类簇个数 ,means指类簇内数据对象的均值(不过,若存在异常点,如极大或极小值,求均值会受干扰)。该算法也叫 k-均值算法 ,属于基于划分的聚类算法,以距离衡量数据对象间相似性,距离越小,相似性越高,越可能同属一类簇。通常,K-means 算法用欧氏距离计算数据对象间的距离。

算法流程如下:

  • 数据说明

程序应用的数据为二维或者三维度数据,通过单独的数据文件保存,方便直接替换为所要分析的数据。

部分程序

# 计算距离矩阵def compute_squared_EDM(X):  return squareform(pdist(X,metric='euclidean'))# DBSCAN算法核心过程def DBSCAN(data,eps,minPts):    # 获得距离矩阵    disMat = compute_squared_EDM(data)    # 获得数据的行和列(一共有n条数据)    n, m = data.shape    # 将矩阵的中小于minPts的数赋予1,大于minPts的数赋予零,然后1代表对每一行求和,然后求核心点坐标的索引    core_points_index = np.where(np.sum(np.where(disMat <= eps, 1, 0), axis=1) >= minPts)[0]    # 初始化类别,-1代表未分类。    labels = np.full((n,), -1)    clusterId = 0    # 遍历所有的核心点    for pointId in core_points_index:        # 如果核心点未被分类,将其作为的种子点,开始寻找相应簇集        if (labels[pointId] == -1):            # 首先将点pointId标记为当前类别(即标识为已操作)            labels[pointId] = clusterId            # 然后寻找种子点的eps邻域且没有被分类的点,将其放入种子集合            neighbour=np.where((disMat[:, pointId] <= eps) & (labels==-1))[0]            seeds = set(neighbour)            # 通过种子点,开始生长,寻找密度可达的数据点,一直到种子集合为空,一个簇集寻找完毕            while len(seeds) > 0:                # 弹出一个新种子点                newPoint = seeds.pop()                # 将newPoint标记为当前类                labels[newPoint] = clusterId                # 寻找newPoint种子点eps邻域(包含自己)                queryResults = np.where(disMat[:,newPoint]<=eps)[0]                # 如果newPoint属于核心点,那么newPoint是可以扩展的,即密度是可以通过newPoint继续密度可达的                if len(queryResults) >= minPts:                    # 将邻域内且没有被分类的点压入种子集合                    for resultPoint in queryResults:                        if labels[resultPoint] == -1:                            seeds.add(resultPoint)            # 簇集生长完毕,寻找到一个类别            clusterId = clusterId + 1    return labels

程序结果

4 下载链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值