聚类分析之密度划分(DBSCAN、MeanShift)

      将密度足够大的相邻区域连接,能有效处理异常数据,主要用于对空间数据的聚类。只要靠近区域的密度超过某个阀值,就继续聚类。将密度足够大的相邻区域连接起来。在一个给定范围的区域内必须至少包含某个数目的点。该类方法将每个簇看作是数据空间中被低密度区域分割开的高密度对象区域,也就是将簇看作是密度相连的点最大集合。具有较大的优越性和灵活性,有效地克服噪声的影响,并且只需要对数据进行一次扫描。代表算法DBSCAN、DENCLUE和OPTICS等。

setp1:输入数据集合s,随机找出一个点,并找出这个点所有密度相连点

setp2:遍历所有epslon领域内的点,并寻找这些点相连的点

setp3:扫描数据集,寻找没有被聚类的核心点。返回setp2

setp4:输出划分的类,并输出异常值点(不和其他点密度相连)

优点:应用最为广泛;收敛速度快;能扩展以用于大规模的数据集,与K-means方法相比,DBSCAN不需要事先知道要形成的簇类的数量。 与K-means方法相比,DBSCAN可以发现任意形状的簇类。同时,DBSCAN能够识别出噪声点。

 缺点:倾向于识别凸形分布、大小相近、密度相近的聚类;中心选择和噪声聚类对结果影响大。 DBSCAN不能很好反映高维数据, DBSCAN不能很好反映数据集以变化的密度。

    DBSCAN(Density-Based Spatial Clustering of Application with Noise)是一个基于高密度连接区域的密度聚类方法。DBSCAN通过检查数据库中每个点的ε-邻域来寻找聚类。如果一个点p的ε-邻域包含多于MinPts个点,则创建一个以p作为核心对象的新簇。然后,DBSCAN反复地寻找从这些核心对象直接密度可达的对象,这个过程可能涉及一些密度可达簇的合并[9]。当没有新的点可以被添加到任何簇时,该过程结束。

python代码如下:

from sklearn.cluster import DBSCAN
from sklearn import datasets
from dask.array.learn import predict
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
print(y)
clf=DBSCAN()
predicted=clf.fit_predict(X)
#设置区间
print(predicted)
k2y = np.array([0,1,2])
print(k2y[predicted])
print((k2y[predicted] == y).astype(int).mean())

我们可以看出聚类精度0.687

MeanShift

from sklearn.cluster import MeanShift
from sklearn import datasets
from dask.array.learn import predict
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
print(y)
clf=MeanShift()
predicted=clf.fit_predict(X)
#设置区间
print(predicted)
k2y = np.array([1,0])
print(k2y[predicted])
print((k2y[predicted] == y).astype(int).mean())

聚类精度0.66

转载于:https://www.cnblogs.com/zhangtaosx/p/7390187.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成点云数据集,可以使用Python的NumPy库和Scikit-learn库。以下是一个简单的示例代码: ```python import numpy as np from sklearn.datasets import make_blobs # 生成点云数据集 X, y = make_blobs(n_samples=1000, centers=4, random_state=42) # 展示数据分布 import matplotlib.pyplot as plt plt.scatter(X[:,0], X[:,1], c=y) plt.show() ``` 接下来,使用Scikit-learn库中的KMeans、GaussianMixture、DBSCANMeanShift类进行聚类,并计算评价指标。以下是一个示例代码: ```python from sklearn.cluster import KMeans, DBSCAN, MeanShift from sklearn.mixture import GaussianMixture from sklearn.metrics import silhouette_score, adjusted_rand_score # 定义聚类器 kmeans = KMeans(n_clusters=4, random_state=42) gmm = GaussianMixture(n_components=4, random_state=42) dbscan = DBSCAN(eps=0.5, min_samples=5) ms = MeanShift() # 进行聚类 kmeans_labels = kmeans.fit_predict(X) gmm_labels = gmm.fit_predict(X) dbscan_labels = dbscan.fit_predict(X) ms_labels = ms.fit_predict(X) # 计算评价指标 kmeans_silhouette = silhouette_score(X, kmeans_labels) kmeans_ari = adjusted_rand_score(y, kmeans_labels) gmm_silhouette = silhouette_score(X, gmm_labels) gmm_ari = adjusted_rand_score(y, gmm_labels) dbscan_silhouette = silhouette_score(X, dbscan_labels) dbscan_ari = adjusted_rand_score(y, dbscan_labels) ms_silhouette = silhouette_score(X, ms_labels) ms_ari = adjusted_rand_score(y, ms_labels) # 输出评价指标 print("KMeans: silhouette score = {:.2f}, ARI = {:.2f}".format(kmeans_silhouette, kmeans_ari)) print("GMM: silhouette score = {:.2f}, ARI = {:.2f}".format(gmm_silhouette, gmm_ari)) print("DBSCAN: silhouette score = {:.2f}, ARI = {:.2f}".format(dbscan_silhouette, dbscan_ari)) print("MeanShift: silhouette score = {:.2f}, ARI = {:.2f}".format(ms_silhouette, ms_ari)) ``` 这里使用了轮廓系数和ARI作为评价指标,轮廓系数用于衡量聚类结果的紧密度和分离度,ARI用于衡量聚类结果与真实标签的一致性。你可以根据实际情况选择其他的评价指标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值