004、KMeans和DBSCAN的比较

2024-06-18 04:12
文章标签 比较 004 kmeans dbscan

本文主要是介绍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:不常用于图像处理,但可以用于图像中目标的密度聚类。

这篇关于004、KMeans和DBSCAN的比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1071270

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

研究生生涯中一些比较重要的网址

Mali GPU相关: 1.http://malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/ 2.http://malideveloper.arm.com/resources/tools/arm-development-studio-5/ 3.https://www.khronos.org/opengles/sdk/do

性能测试工具 wrk,ab,locust,Jmeter 压测结果比较

前言 在开发服务端软件时,经常需要进行性能测试,一般我采用手写性能测试代码的方式进行测试,那有什么现成的好的性能测试工具吗? 性能测试工具 wrk,ab,locust,Jmeter 压测结果比较 详见: 性能测试工具 wrk,ab,locust,Jmeter 压测结果比较 Jmeter性能测试 入门

Spark2.x 入门: KMeans 聚类算法

一 KMeans简介 KMeans 是一个迭代求解的聚类算法,其属于 划分(Partitioning) 型的聚类方法,即首先创建K个划分,然后迭代地将样本从一个划分转移到另一个划分来改善最终聚类的质量。 ML包下的KMeans方法位于org.apache.spark.ml.clustering包下,其过程大致如下: 1.根据给定的k值,选取k个样本点作为初始划分中心;2.计算所有样本点到每

MongoDB学习—(6)MongoDB的find查询比较符

首先,先通过以下函数向BookList集合中插入10000条数据 function insertN(obj,n){var i=0;while(i<n){obj.insert({id:i,name:"bookNumber"+i,publishTime:i+2000})i++;}}var BookList=db.getCollection("BookList")调用函数,这样,BookList

超声波清洗机哪个品牌比较好一点的?清洁力强的超声波清洗机品牌

随着生活水平的不断提升和幸福感的增强,珠宝、饰品和眼镜等物品已成为许多家庭的常备之物。然而,这些贵重细小的物件易于积聚微尘与隐形细菌,长此以往可能悄悄影响家人的健康,毕竟细菌是肉眼难以察觉的隐患。超声波清洗机应运而生,它以高科技手段有效地解决了这一隐忧,深层清洁,守护家人免受微小污染物的潜在威胁。不过现在市面上超声波清洗机品牌挺多的,究竟有哪些品牌的超声波清洗机比较好一点呢?接下来就为大家带来四款

【JavaScript】版本号和日期时间的比较

JS使用 ‘>’ 运算符比较两个字符串大小时,会把字符串转换为ASCII码依次比较。 比较标准时间格式可以直接使用 ’ > ’ 比较; (2018-07-20格式)