密度聚类与层次聚类

news2024/9/29 13:25:24

      大家好,我是带我去滑雪!

      密度聚类(Density-based Clustering)和层次聚类(Hierarchical Clustering)是两种不同的聚类方法,用于将数据集中的数据点分组成簇。

目录

一、密度聚类

(1)DBSCAN

(2)DBSCAN计算方式

(3)DBSCAN算法的优缺点

(4)代码实现

二、层次聚类

(1)什么是层次聚类

(2)层次聚类的优缺点

(3)代码实现


一、密度聚类

(1)DBSCAN

       DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,该算法将具有足够密度的区域划分为簇,并在具有噪声的空间库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。

        DBSCAN的核心思想是基于密度的。从直观效果上看,DBSCAN算法可以找到样本点的全部密集区域,并把这些密集区域当做一个一个的聚类簇。

        DBSCAN含有两个超参数:邻域半径Eps和最少点数目MinPts。这两个算法参数实际可以刻画什么叫密集——当邻域半径Eps内的点的个数大于最少点数目MinPts时,就是密集。

邻域(Eps):以给定对象为圆心,半径内的区域为该对象的邻域;核心对象:对象的邻域内至少有MinPts(设定的阈值)个对象,则该对象为核心对象;边界点对象的领域小于MinPts个对象,但是在某个核心对象的邻近域中;离群点(噪声):对象的领域小于MinPts个对象,且不在某个核心对象的邻域中

(2)DBSCAN计算方式

       1)密度直达:给定一个对象集合D,如果P为核心点,QPEps邻域内,那么称PQ密度直达(Directly Density-Reachable)。任何核心点到其自身密度直达,密度直达不具有对称性,如果PQ密度直达,那么QP不一定密度直达。

      2)密度可达:如果存在核心点P2P3……Pn,且P1P2密度直达,P2P3密度直达,……P(n-1)Pn密度直达,PnQ密度直达,则P1Q密度可达(Density-Reachable)。密度可达也不具有对称性。

     3)密度相连:如果存在核心点S,使得SPQ都密度可达,则PQ密度相连(Density-Connected)。密度相连具有对称性,如果PQ密度相连,那么QP也一定密度相连。密度相连的两个点属于同一个聚类簇

(3)DBSCAN算法的优缺点

DBSCAN算法的优点:

  • 1不需要预先确定聚类的数量。
  • 2可以很好地发现任意尺寸和任意形状的聚类。
  • 3可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
  • 4)聚类结果没有偏倚,而k-means之类的聚类算法的初始值对聚类结果有很大影响。

DBSCAN算法的缺点:

  • 1)如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用DBSCAN聚类一般不适合。
  • 2)如果样本集较大时,聚类收敛时间较长,尤其在我们定义的距离计算方式较为复杂的时候。
  • 3)调参比较复杂,epsMinPts的设置不同对结果会产生较大影响,需要多次尝试以获取最佳的聚类效果

(4)代码实现

from sklearn.cluster import DBSCAN

import numpy as np

# 输入数据

X = np.array([(1,1), (1,2), (2,1), (8,8), (8,9), (9,8), (15,15)])

# 创建DBSCAN对象,设置半径和最小样本数

dbscan = DBSCAN(eps=2, min_samples=3)

# 进行聚类

labels = dbscan.fit_predict(X)

# 输出聚类结果

for i in range(max(labels)+1):

    print(f"Cluster {i+1}: {list(X[labels==i])}")

print(f"Noise: {list(X[labels==-1])}")

二、层次聚类

(1)什么是层次聚类

        层次聚类试图在不同层次对数据集进行划分,从而形成树形的聚类结构。数据集的划分可采用“自底向上”的聚合策略,也可采用“自顶向下”的分拆策略。

凝聚的层次聚类:AGENS算法

       是一种自底向上聚合策略的层次聚类算法。它先将数据集中的每一个样本看作一个初始聚类,然后按照一定规则,例如类间距离最小,将最满足规则条件的两个类进行合并。如此反复进行,每次减少一个类,直到满足停止条件。需要预先确定下面三个要素:

  • 距离或相似度:欧氏距离、曼哈顿距离、夹角余弦等
  • 合并规则:最短距离,最长距离,中心距离,平均距离等
  • 停止条件:类的个数达到阈值、类的直径超过阈值等

(2)层次聚类的优缺点

优点

  • 多层次的聚类结构:层次聚类生成一个树状结构,可视化呈现数据点的多个层次聚类结果,使得用户可以在不同的抽象层次上研究数据的结构。这有助于更全面地理解数据。
  • 不需要事先指定簇的数量:与许多其他聚类算法不同,层次聚类不需要事先确定簇的数量,因为它可以根据数据的结构自动形成不同层次的聚类。
  • 可视化和解释性强:通过绘制层次聚类的树状图,可以直观地表示数据点如何组织成不同的簇。这种可视化有助于解释和理解数据的结构。
  • 适用于小规模数据集:层次聚类适合处理相对较小规模的数据集,因为它的时间和空间复杂度可能随着数据规模的增加而增加。

缺点

  • 计算复杂性高:层次聚类的计算复杂性通常比其他聚类算法高,特别是对于大规模数据集而言。构建层次结构可能需要大量的计算资源。
  • 不适用于大规模数据:由于计算复杂性高,层次聚类通常不适用于大规模数据集,因为它可能需要很长的时间来完成聚类分析。
  • 不适用于凸簇:层次聚类在处理凸形状的簇时可能效果不如一些其他算法,因为它更适合于发现非凸形状的簇。
  • 难以处理噪声:层次聚类通常难以处理噪声数据点,因为噪声可能会导致树状结构中的多个分支,使得解释和选择合适的聚类层次更加困难。

(3)代码实现

import math

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt 

from scipy.cluster.hierarchy import linkage,dendrogram

# 从excel中读取数据

def load_data(path):

       # 从excel中读取数据,并用dataframe存储

       global df

       df = pd.read_excel(path)

       # 将dataframe中的数据值转换为列表

       df_li = df.values.tolist()

       # 将存储好数据的列表转换为数组

       dataSet = []

       for i in df_li:

              tmp = []

              tmp.append(i)

              dataSet.append(tmp)

       # 返回

       return dataSet

# 计算欧式距离

def distance(pointA,pointB):

       dis = 0

       for i in range(len(pointA)):

              dis += (pointA[i]-pointB[i])**2

       return math.sqrt(dis)

# 寻找最小距离

def Matrix_min(pointsA,pointsB,indexA,indexB,result):

       for pointA in pointsA:

              tmp_min_dis = 10000

              for pointB in pointsB:

                     dis = distance(pointA,pointB)

              if dis < tmp_min_dis:

                     tmp_min_dis = dis

       result.append({'indexA':indexA,'indexB':indexB,'dist':tmp_min_dis})

# 利用最小簇间距离度量聚类

def search_mindis(result):

       tmp_min_dis = 10000

       tmp_min_list = []

       for i in result:

              if i['dist'] < tmp_min_dis:

                     tmp_min_dis = i['dist']

                     tmp_min_list = []

                     tmp_min_list.extend([i['indexA'],i['indexB']])

              elif i['dist'] == tmp_min_dis:

                     tmp_min_list.extend([i['indexA'],i['indexB']])

       return list(set(tmp_min_list))

# 层次聚类,合并样本,并原数据集中删除元素

def mergeGroup(array, mergeIndexs):

    mergeIndexs.sort()

    rangeLen = len(mergeIndexs) - 1;

    for i in range(rangeLen):

        array[mergeIndexs[0]].extend(array[mergeIndexs[i+1]])

    mergeIndexs.reverse()

    for i in range(rangeLen):

        del array[mergeIndexs[i]]

if __name__ == '__main__':

       # 加载数据

       data = []

       path = input(r'请输入文件路径:')

       dataSet = load_data(path)

       print(dataSet)

      

       # 进行层次聚类

       k = int(input('请输入聚类次数:'))

       while k-1 > 0:

              result = []

              for indexA,pointsA in enumerate(dataSet):

                     for indexB,pointsB in enumerate(dataSet):

                            if indexB > indexA:

                                   Matrix_min(pointsA,pointsB,indexA,indexB,result)

              mergeIndexs = search_mindis(result)

              mergeGroup(dataSet,mergeIndexs)

              k -= 1

       for item in dataSet:

              print(item)

       ## 可视化

       z=linkage(df,method='ward',metric='euclidean')

       p = dendrogram(z,0)

       plt.show()


更多优质内容持续发布中,请移步主页查看。

   点赞+关注,下次不迷路!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高频时序数据仓库-在线课堂二

详细了解天软高频时序数据仓库的构架及性能后&#xff0c;本周天软在线课堂将带来高频时序数据仓库的应用展示。扫描图片二维码可报名参会。

MATLAB|热力日历图

目录 日历图介绍&#xff1a; 热力日历图的特点&#xff1a; 应用场景&#xff1a; 绘图工具箱 属性 (Properties) 构造函数 (Constructor) 公共方法 (Methods) 私有方法 (Private Methods) 使用方法 日历图介绍&#xff1a; 热力日历图是一种数据可视化形式&#xf…

Pioneer电源维修PM36218B-10P-1-8PH-J

开关电源出现不启振的时候&#xff0c;我们通常需要查看开关频率是否正确、保护电路是否断路、电压反馈电路、电流反馈电路又没问题&#xff0c;开关管是否击穿等。 pioneer电源维修时&#xff0c;PWM模块为UC3843&#xff0c;检测未发现其他异常&#xff0c;在R(220K)上并接一…

美妆行业如何通过自媒体提升品牌曝光

自媒体的出现使美妆行业的推广方式产生了变化&#xff0c;自媒体平台的用户年轻化、用户基数大、消费力较强&#xff0c;能够接受新鲜事物&#xff0c;为美妆品牌带来广阔的市场和消费人群。 因此自媒体平台的内容运营十分重要&#xff0c;今天媒介盒子就来和大家聊聊&#xf…

VBA技术资料MF80:选择文件及文件夹

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

ARPG----C++学习记录03 Section7位置,偏移,函数

Pawn 新建一个Pawn的c类Bird&#xff0c;并且新建一个蓝图 添加一个Capsule&#xff08;胶囊&#xff09; 不知道要加啥头文件&#xff0c;去网站找https://docs.unrealengine.com/5.3/en-US/API/Runtime/Engine/Components/UCapsuleComponent/SetCapsuleSize/ 包含文件名字的头…

【vue3/高德地图】实现地图打点/自定义点位图标/地理围栏实现

<template><div class"app-container"><div id"container"></div></div> </template><script setup> import AMapLoader from amap/amap-jsapi-loader; /*在Vue3中使用时,需要引入Vue3中的shallowRef方法(使用s…

Microsoft Edge浏览器不兼容解决办法

找到 Edge 的安装位置&#xff0c;一般在 C:\Program Files (x86)Microsoft Edge\Application\ 这个目录&#xff0c;把 edge.exe 或msedge.exe 修改为 chrome.exe 再重启电脑。

DocTemplateTool - 可根据模板生成word或pdf文件的工具

你是否经常遇到这样的场景&#xff1a;产品运营有着大量的报告需求&#xff0c;或者给客户领导展现每周的运营报告&#xff1f;这些文档类的任务可以交给运营同事&#xff0c;他们负责文档排版和样式&#xff0c;你作为开发人员你只需要提供数据源&#xff0c;和一个映射表&…

C++ -std 编译标准

概述 任何一门编程语言都有相关的组织和团体在不停的维护和更新。原因很简单&#xff0c;时代在发展&#xff0c;编程语言如果停滞不前&#xff0c;最终就会被淘汰。 以 C 语言为例&#xff0c;发展至今该编程语言已经迭代了诸多个版本&#xff0c;例如 C89 &#xff08;偶尔…

十大字体设计网站年终盘点:顶级设计师独家推荐

即时设计 首款国产的专业 UI 设计工具即时设计&#xff0c;官方字体库内置几十种字体任你选择&#xff0c;例如阿里巴巴惠普体、思源宋体、思源黑体、优设标题黑等&#xff0c;一键点击使用无需下载安装。还能够根据设计内容进行字体粗细调节&#xff0c;从纤细到特粗&#xf…

基准测试详解

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

柱状图:带误差棒

误差棒可以表示样本标准差&#xff0c;也可以表示样本标准误。 导入库&#xff1a; import pandas as pd 自定义用来绘制带误差棒&#xff08;样本标准差或样本标准误&#xff09;的柱状图&#xff1a; def col(y, x, face, df, errprbarstd) : print(ggplot(df.groupby([x…

el-checkbox-group的全选与反选

需求如下&#xff1a; 思路&#xff1a;在点击全部时按钮组双向绑定赋值全部值&#xff0c;点击按钮组内按钮计算选中按钮数量与按钮组数量对比&#xff0c;判定是否选中全部 代码如下&#xff1a; <template><div><el-checkbox-button v-model"checkall…

视频去水印怎么去?3个简单的去水印方法分享

当我们需要视频去水印怎么去时&#xff0c;了解如何有效地去除视频水印变得至关重要,在日常使用视频资源的过程中&#xff0c;我们可能会遇到一些带有品牌标志或文字水印的视频&#xff0c;这些水印可能会影响视频的观赏体验&#xff0c;特别是当我们需要将视频用于学习、研究或…

viple入门(五)

&#xff08;1&#xff09;自定义活动 自定义活动&#xff0c;用来创建新的组件、服务、函数或者其他代码模块&#xff0c;使用最多的是创建函数。 函数是对一个功能的封装&#xff0c;在调用的时候执行&#xff0c;没有调用的时候则不执行。函数可能有参数&#xff0c;可能没…

Java代码如何对Excel文件进行zip压缩

1&#xff1a;新建 ZipUtils 工具类 package com.ly.cloud.datacollection.util;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import ja…

文件过大放不到U盘怎么办?三个方法轻松搞定!

文件过大放不了U盘我们可以从文件过大这个角度来解决一下这个问题&#xff0c;可以借助一些工具把文件压缩后&#xff0c;体积变小后&#xff0c;再放入U盘&#xff0c;使得u盘得到高效的利用&#xff0c;下面是推荐的一些好用的软件。 一、嗨格式压缩大师 是一款可以压缩多种…

idea 模板注释 {@link}

1. 新增组 2. 设置方法注释及变量 增加模板文本 ** * $param$ * return {link $return$} */3. 设置变量表达式 勾选跳过param 参数表达式 groovyScript("def result ;def params \"${_1}\".replaceAll([\\\\[|\\\\]|\\\\s], ).split(,).toList();def param…

【案例卡】clickhouse:多行数据拼接在一行

一、需求 针对clickhouse数据库中&#xff0c;group by 分组后的字符串字段&#xff0c;拼接处理在一行的问题实现。在mysql中&#xff0c;可以用group_concat()函数来实现&#xff0c;而clickhouse数据库不支持此函数&#xff0c;特此记录实现方式。 二、clickhouse相关函数…