聚类算法
聚类分析
或简称聚类
基本上是一种无监督学习方法,它将数据点划分为多个特定的批次或组,使得同一组中的数据点具有相似的属性,而不同组中的数据点在某种意义上具有不同的属性。它包含许多基于差分进化的不同方法。例如:K-Means
(基于点间距离)、亲和传播(基于图距离)、均值漂移(基于点间距离)、DBSCAN
(基于邻近点距离)、高斯混合(基于到中心的马哈拉诺比斯距离)、谱聚类(基于图距离)等。
聚类算法是一种无监督学习技术,旨在将数据集划分为若干个簇,使得同一簇内的数据点彼此相似,而不同簇的数据点差异显著。这些算法在数据分析、图像处理、市场研究、生物信息学等领域有着广泛的应用,帮助我们识别数据中的内在结构和模式。
聚类算法主要包括以下几种类型:
-
划分聚类:如K-means,将数据划分为K个簇。
-
层次聚类:如凝聚层次聚类,逐步合并或拆分数据点形成簇。
-
密度聚类:如DBSCAN,通过密度连接识别簇。
从根本上讲,所有聚类方法都使用相同的方法,即首先计算相似度,然后使用它将数据点聚类为组或批次。在这里,我们将重点介绍基于密度的噪声应用空间聚类DBSCAN
)聚类方法。
DBSCAN聚类算法简介
发展历史
DBSCAN
(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,由Martin Ester, Hans-Peter Kriegel, Jörg Sander和Xiaowei Xu于1996年提出。DBSCAN的特点是它不需要事先指定簇的数量,能够识别任意形状的簇,并且能够有效处理噪声点。这种算法在推出后,因其强大的功能和灵活性,迅速在学术界和工业界获得了广泛的应用。
有趣的是,DBSCAN
的提出标志着数据挖掘领域的一次重大突破。在此之前,大多数聚类算法都依赖于簇的形状和大小,而DBSCAN能够灵活地适应各种复杂的数据结构,这使得它在许多实际应用中大放异彩。
数学原理
DBSCAN算法的核心思想是通过密度连接的概念来识别簇。算法主要有两个参数:(eps)和。定义了一个点的邻域半径,而表示一个点的-邻域内需要有多少个点才能被认为是核心点。
簇是由密度可达的核心点形成的最大集合。一个点到点的密度可达性定义如下:
应用领域和场景
DBSCAN算法的应用非常广泛,包括但不限于:
-
市场细分:识别具有相似购买行为的客户群体。
-
社交网络分析:发现社交媒体上的紧密交流群体。
-
天文数据分析:识别星系或其他天体的集群。
-
地理数据分析:识别地理空间中的区域分布,如城市规划中的热点区域。
-
异常检测:在各种环境监测数据中识别异常或离群点。
Python实现及可视化
以下是一个DBSCAN算法的简单Python实现示例,使用了scikit-learn
库,并进行了可视化:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import DBSCAN
# 生成数据
X, _ = make_moons(n_samples=300, noise=0.1, random_state=42)
# 应用DBSCAN算法
dbscan = DBSCAN(eps=0.2, min_samples=5)
clusters = dbscan.fit_predict(X)
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', marker='o')
plt.title('DBSCAN Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.colorbar(label='Cluster Label')
plt.show()
这段代码首先生成了一组具有两个月牙形结构的数据点,然后应用DBSCAN算法对其进行聚类,并使用Matplotlib库将结果可视化。不同的颜色代表不同的簇,从而清晰地显示了聚类效果。
# -*- coding: utf-8 -*-
"""
@author: https://blog.csdn.net/suiyingy
"""
import open3d as o3d
import numpy as np
if __name__ == '__main__':
file_path = 'rabbit.pcd'
pcd = o3d.io.read_point_cloud(file_path)
pcd.paint_uniform_color([0.5, 0.5, 0.5])#指定显示为灰色
print(pcd)
#labels返回聚类成功的类别,-1表示没有分到任何类中的点
labels = np.array(pcd.cluster_dbscan(eps=0.5, min_points=60, print_progress=True))
#最大值加1相当于共有多少个类别
num_label = np.max(labels) + 1
print('类别数量:', max(labels)+1)
#生成n个类别的颜色,n表示聚类别成功的类,-1表示没有分类成功的类别
colors = np.random.randint(255, size=(max(num_label, 1), 3))/255.
colors = colors[labels]
#没有分类成功的点设置为黑色
colors[labels < 0] = 0
pcd.colors = o3d.utility.Vector3dVector(colors[:, :3])
# 点云显示
o3d.visualization.draw_geometries([pcd], #点云列表
window_name="DBSCAN聚类",
point_show_normal=False,
width=800, # 窗口宽度
height=600) # 窗口高度
这段代码使用Open3D库读取点云文件'rabbit.pcd',将点云显示为灰色,应用DBSCAN算法进行聚类,然后根据聚类结果为每个点分配随机颜色,未分类成功的点显示为黑色,最后在窗口中可视化点云及其聚类结果。
更多信息参见:
https://www.geeksforgeeks.org/dbscan-clustering-in-ml-density-based-clustering/
以上内容总结自网络,如有帮助欢迎关注与转发,我们下次再见!