004、KMeans和DBSCAN的比较

KMeans 聚类

工作原理
  1. 选择K个初始中心点(可以随机选择或使用其他方法)。
  2. 迭代过程
    • 分配每个数据点到最近的中心点:计算每个数据点到所有中心点的距离,将数据点分配到最近的中心点所属的簇。
    • 更新中心点:计算每个簇内所有数据点的均值,将该均值作为新的中心点。
  3. 停止条件:当中心点不再变化或达到预设的最大迭代次数时停止迭代。
优缺点
  • 优点
    • 简单易理解,容易实现。
    • 计算速度快,适合大规模数据集。
  • 缺点
    • 需要预先指定簇的数量K。
    • 对初始值敏感,不同的初始值可能导致不同的结果。
    • 对噪声和离群点敏感。
    • 假设簇是球形的,且大小相似。
实例
实例1:二维数据点聚类
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt# 生成样本数据
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)# KMeans聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75)
plt.show()
实例2:客户分群
import pandas as pd
from sklearn.cluster import KMeans# 假设有客户购买行为数据
data = {'客户ID': [1, 2, 3, 4, 5],'购买次数': [20, 10, 30, 25, 15],'平均购买金额': [200, 150, 300, 250, 100]
}
df = pd.DataFrame(data)
x = df[['购买次数', '平均购买金额']]# KMeans聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(x)
df['Cluster'] = kmeans.labels_print(df)
实例3:图像压缩

KMeans可以用于图像压缩,通过将图像的像素聚类到少数颜色中,减少颜色种类。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from skimage import io# 读取图像
image = io.imread('https://example.com/image.jpg')
rows, cols, dims = image.shape# 将图像数据转换为二维数组
image_flat = image.reshape(rows * cols, dims)# 使用KMeans聚类压缩颜色
kmeans = KMeans(n_clusters=16)
kmeans.fit(image_flat)
compressed_image = kmeans.cluster_centers_[kmeans.labels_].reshape(rows, cols, dims)# 显示原始图像和压缩后的图像
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8))
ax1.imshow(image)
ax1.set_title('Original Image')
ax2.imshow(compressed_image.astype('uint8'))
ax2.set_title('Compressed Image')
plt.show()

DBSCAN 聚类

工作原理
  1. 参数设置:设定两个参数,eps(邻域半径)和min_samples(核心点的最小邻域点数)。
  2. 遍历数据点
    • 如果一个点的邻域内至少有min_samples个点,则该点是核心点,扩展一个簇。
    • 如果点不是核心点但在一个核心点的邻域内,则属于该核心点的簇。
    • 如果点既不是核心点,也不在任何核心点的邻域内,则标记为噪声。
  3. 迭代直到所有点都被访问
优缺点
  • 优点
    • 不需要预先指定簇的数量。
    • 可以识别任意形状的簇。
    • 对噪声和离群点有较好的鲁棒性。
  • 缺点
    • 参数选择(epsmin_samples)较为困难。
    • 对高维数据效果较差。
    • 计算复杂度较高。
实例
实例1:二维数据点聚类
import numpy as np
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt# 生成样本数据
from sklearn.datasets import make_moons
X, y = make_moons(n_samples=300, noise=0.1)# DBSCAN聚类
dbscan = DBSCAN(eps=0.2, min_samples=5)
dbscan.fit(X)
y_dbscan = dbscan.labels_# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_dbscan, s=50, cmap='viridis')
plt.show()
实例2:地理数据聚类
import pandas as pd
from sklearn.cluster import DBSCAN# 假设有地理位置数据
data = {'位置ID': [1, 2, 3, 4, 5],'经度': [100.0, 100.1, 100.2, 100.3, 100.4],'纬度': [30.0, 30.1, 30.2, 30.3, 30.4]
}
df = pd.DataFrame(data)
x = df[['经度', '纬度']]# DBSCAN聚类
dbscan = DBSCAN(eps=0.15, min_samples=2)
dbscan.fit(x)
df['Cluster'] = dbscan.labels_print(df)
实例3:文本数据聚类

DBSCAN也可以用于文本数据的聚类,通过将文本向量化后进行聚类。

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import DBSCAN# 假设有一些文本数据
documents = ["This is the first document.","This document is the second document.","And this is the third one.","Is this the first document?","The quick brown fox jumps over the lazy dog.","The dog barked at the moon."
]# 文本向量化
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(documents)# DBSCAN聚类
dbscan = DBSCAN(eps=0.5, min_samples=2)
dbscan.fit(X)
labels = dbscan.labels_# 将聚类结果输出
df = pd.DataFrame({'Document': documents, 'Cluster': labels})
print(df)

KMeans vs DBSCAN

簇形状
  • KMeans:假设簇是球形的,且大小相似。
  • DBSCAN:可以识别任意形状的簇。
簇数量
  • KMeans:需要预先指定簇的数量。
  • DBSCAN:自动确定簇的数量。
对噪声的处理
  • KMeans:对噪声和离群点敏感。
  • DBSCAN:对噪声和离群点有较好的鲁棒性。
计算效率
  • KMeans:通常比DBSCAN快,适合大规模数据集。
  • DBSCAN:计算复杂度较高,尤其在高维数据上表现较差。

实际应用场景总结

  • 客户分群

    • KMeans:适用于将客户分成明确数量的群体,适合电商、零售等行业的客户行为分析。
    • DBSCAN:适用于发现不规则的客户群体,适合社交网络用户分析。
  • 地理数据聚类

    • KMeans:适用于地理位置数据的简单聚类,如分区域的地理数据分析。
    • DBSCAN:适用于识别地理数据中的聚集点和噪声,如城市中的人群热点区域识别。
  • 文本数据聚类

    • KMeans:适用于将文本数据分成预先确定的主题群体,适合新闻分类等应用。
    • DBSCAN:适用于发现文本数据中的不规则主题群体,适合社交媒体内容分析。
  • 图像处理

    • KMeans:适用于图像压缩,通过减少颜色种类实现图像压缩。
  • DBSCAN:不常用于图像处理,但可以用于图像中目标的密度聚类。

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

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

相关文章

【C语言】回调函数 和 部分库函数的用法以及模拟实现

一、回调函数: 1、定义: 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。 2、qsort的模拟实现…

怎样打印微信文档文件?

在日常生活和工作中,我们经常需要打印微信中的文档文件,无论是工作资料、学习笔记还是其他重要信息。随着科技的发展,我们不再需要前往打印店进行繁琐的操作,而是可以通过一些便捷的在线打印平台轻松实现。今天,我们就…

微信小程序自定义组件(写一个点击查看大图有关闭按钮,复制即可使用)

今天碰到一个需求,本来使用wx.previewImage用的好好的,非要加一个关闭按钮,这可把不想写代码的我难住了,查看官方文档没有加这个按钮的属性,那就自己写了吧,自己写的途中发现胶囊隐藏不了,兴高采…

echarts学习:通过图例事件实现选中后控制多条折线的显隐

1.问题描述 我在工作中遇到了这样一个需求:我们都知道点击echarts折线图的图例,是可以控制折线的显隐的。我现在希望点击某一个图例可以改变多条折线的显隐。 例如在下面这张图中,我将“xxx水位”和“yyy水位”分为一组;将“xxx…

SGPT论文阅读笔记

这是篇想要用GPT来提取sentence embedding的工作,提出了两个框架,一个是SGPT-BE,一个是SGPT-CE,分别代表了Bi-Encoder setting和Cross-Encoder setting。CE的意思是在做阅读理解任务时,document和query是一起送进去&am…

IPv6改造是什么意思?网站IPv6改造怎么做?

随着互联网技术的飞速发展,IPv4地址资源短缺的问题日益凸显,已经难以满足物联网、人工智能等新基建的激增需求。为了解决这一困境,IPv6协议应运而生,其海量的地址资源和内置的安全机制为互联网的持续发展提供了广阔空间。目前各行…

kbadminv1版后台快速开发框架

探索高效开发的新境界!kbadminv1 版后台快速开发框架震撼登场! 基于强大的 thinkphp6 框架,kbadminv1 为开发者们带来了前所未有的便捷与高效。 它犹如一把智慧的钥匙,轻松开启后台开发的大门。简洁而直观的设计,让复…

2024-06-18 blue-VH-driver-订阅组态相关分析

摘要: 2024-06-18 blue-VH-driver-订阅组态相关分析 订阅组态相关: 1.1 创建订阅分组成功, 但是激活订阅分组失败 调用VH接口删除已经创建的订阅分组 无论否删除成功,都返回不做重试删除已经创建的订阅分组,避免无法结束调用1.2 向订阅分组添加的位号的数据量超过单个订阅分…

高并发系统中面临的问题 及 解决方案

在互联网软件系统中,高并发读写场景会带来一系列复杂的问题。以下是详细的分析和解决方案: 1. 性能瓶颈 问题: 数据库性能瓶颈:高并发请求会导致数据库负载过重,响应时间增加,甚至可能导致数据库崩溃。服务器性能瓶颈:服务器的CPU、内存、网络带宽可能无法承受高并发请…

Maven 配置学习:存在两个本地私服如何配置

Maven 配置学习:存在两个本地私服如何配置 目录 Maven 配置学习:存在两个本地私服如何配置解释:1.本地仓库位置:2.Profiles 定义:3.Repositories 定义顺序:4.Active Profiles: 操作步骤&#xf…

在Pycharm使用Github Copilot

文章目录 1.GitHub Copilot 是什么2.注册GitHub Copilot3.官方使用文档4.安装 GitHub Copilot插件5.在Pycharm中使用6.相关功能键7.启用或禁用 GitHub Copilot 1.GitHub Copilot 是什么 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码&#xff…

【MySQL进阶之路 | 高级篇】SQL执行过程

1. 客户端与服务器的连接 运行中的服务器程序与客户端程序本质上都是计算机的一个进程,所以客户端进程向服务器端进程发送请求并得到相应过程的本质就是一个进程间通信的过程. 我们可以使用TCP/IP网络通信协议,命名管道和共享内存等方式,实…

2024/6/18(RBAC,查询用户权限,细粒度授权,选课,支付宝生成二维码支付,支付结果查询需要内网穿透)

黑马程序员【学成在线项目】,P141 测试沙箱支付宝_黑马学成在线支付宝沙箱-CSDN博客 需要内网穿透

PyCharm 快捷键积累

1、快速格式化:Ctrl Alt L Ctrl Alt L 快捷键在 PyCharm 中是用于格式化代码的,它不仅仅适用于 HTML 代码,而是适用于多种编程和标记语言。

31.加载配置文件中的游戏到辅助列表

上一个内容:30.保存游戏配置到文件 以 30.保存游戏配置到文件 它的代码为基础进行修改 效果图: 加载配置文件到列表的函数: void CWndINJ::LoadGame() {int count GetPrivateProfileInt(L"main", L"count", 0, GameI…

通勤必备!重回儿时回忆,完全免费!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 今天给大家安利三个网站,可以完全免费在线玩的小霸王游戏机,重回童年游戏时刻! 最后一款还可以网页在线和朋友联机CS、吃鸡、暗黑破坏神、拳皇、恐龙…

【数学】负数

Hello!大家好,我是学霸小羊,今天讲讲负数。 目录 1.负数的概念 2.绝对值 附:c求绝对值方法 3.负数的大小比较 1.负数的概念 比0小的数,叫做负数。 负数全称负实数,负数与正数表示意义相反的量。负数用负号(Min…

[NISACTF 2022]babyserialize(pop链详细分析、构造)

目录 [NISACTF 2022]babyserialize (一)理清pop链(链尾 链头),标注步骤 1. 先找eval、flag这些危险函数和关键字样(这是链尾) 2.往eval()上面看 3.往$bb()上面看 4.往strtolower()上面看 …

alibaba EasyExcel 导入 Excel 分享

前言&#xff1a; Excel 导入是一个非常常见的功能&#xff0c;项目开发中随处可见&#xff0c;市面上也有各种处理 Excel 的 API&#xff0c;本文简单分享一下 alibaba.excel 的导入功能。 引入依赖&#xff1a; <dependency><groupId>com.alibaba</groupId…

【GD32F303红枫派使用手册】第十六节 USART-DMA串口收发实验

16.1 实验内容 通过本实验主要学习以下内容&#xff1a; 串口DMA工作原理 使用DMA进行串口收发 16.2 实验原理 16.2.1 串口DMA工作原理 在前面ADC章节中&#xff0c;我们介绍了DMA的工作原理&#xff0c;这里就不多做介绍。从GD32F303用户手册中可以查到&#xff0c;各串…