python代码实现DBScan聚类

本文介绍了如何使用scikit-learn库中的DBSCAN算法进行样本数据聚类,通过生成月亮形状数据集进行可视化展示,并探讨了DBSCAN的优点如自动划分、处理噪声和任意形状聚类,同时也指出了其缺点如参数敏感性和内存消耗问题。
摘要由CSDN通过智能技术生成

1、导入第三方库

from sklearn import datasets
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import dbscan #今天使用的新算法包

2、生成样本数据,可视化展示

#生成500个点 噪声为0.1
X, _ = datasets.make_moons(500, noise=0.1, random_state=1)
'''
datasets.make_moons() 是 Scikit-learn 库中的一个函数,用于生成一个月亮形状的二分类数据集。这个数据集通常用于测试非线性分类算法的性能。
这个函数的常见参数包括:
n_samples:生成的样本数,默认为 100。
noise:添加到数据中的高斯噪声的标准差,默认为 0.3。数值越小,数据分布越集中,否则,越分散
random_state:随机种子,用于生成随机数据。设置一个固定的值可以使得每次生成的数据都相同。'''

df = pd.DataFrame(X, columns=['x', 'y'])
df.plot.scatter('x','y', s = 200,alpha = 0.5, c = "green", title = 'dataset by DBSCAN')
#s:散点的大小,alpha:散点的透明度
plt.show()

在这里插入图片描述

3、使用DBscan聚类,可视化展示聚类效果

core_samples, cluster_ids = dbscan(X, eps=0.2, min_samples=20)
# eps为邻域半径,min_samples为最少样本量,那么对于一个样本点,如果它的邻域内至少有 20个样本点(包括自身),则这个点被视为核心点,否则为噪声点。
#core_samples:核心样本点的索引数组。358个
# cluster_ids:一个数组,表示每个样本点所属的簇标签,如果样本点是噪声点(不统计在任何簇内),则标签为 -1。500个
df = pd.DataFrame(np.c_[X, cluster_ids], columns=['x', 'y', 'cluster_id'])
df['cluster_id'] = df['cluster_id'].astype('i2')#将数据转换为 16 位有符号整数
#绘制结果图像
df.plot.scatter('x', 'y', s=200,c=list(df['cluster_id']), cmap='Blues', colorbar=False,alpha=0.6, title='DBSCAN cluster result')
#c散点的颜色,数组中的每个元素将会被映射到一个颜色空间中,从而确定每个散点的颜色。
#cmap映射的颜色
plt.show()

在这里插入图片描述

4、可视化展示的补充

df2=df.head(5)
df2.plot.scatter('x', 'y', s=200, c=[-1,10,10,30,30],cmap='Blues', colorbar=False,alpha=0.6, title='DBSCAN cluster result')
#c散点的颜色,数组中的每个元素将会被映射到一个颜色空间中,列表中数值大小决定每个散点的颜色深浅。
#cmap映射的颜色
plt.show()

在这里插入图片描述

5、算法优缺点

优点

不需要划分个数。 跟 K-means 比起来,DBSCAN 不需要人为地制定划分的类别个数,而可以通
过计算过程自动分出。
可以处理噪声点。 经过 DBSCAN 的计算,那些距离较远的数据不会被记入到任何一个簇中,从而
成为噪声点,这个特色也可以用来寻找异常点。
可以处理任意形状的空间聚类问题。 从我们的例子就可以看出来,与 K-means 不同,DBSCAN可以处理各种奇怪的形状,只要这些数据够稠密就可以了。

缺点

需要指定最小样本量和半径两个参数。 这对于开发人员极其困难,要对数据非常了解并进行很好的数据分析。而且根据整个算法的过程可以看出,DBSCAN 对这两个参数十分敏感,如果这两个参数设定得不准确,最终的效果也会受到很大的影响。
数据量大时开销也很大。 在计算过程中,需要对每个簇的关系进行管理。所以当数据量大的话,内存的消耗也非常严重。
如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差。

好的,首先我们需要导入所需的库,包括numpy、pandas、matplotlib和sklearn中的DBSCAN。代码如下: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import DBSCAN ``` 接下来,我们需要读取数据集。这里我们使用UCI Machine Learning Repository中的信用卡用户数据集(Credit Card Dataset)作为例子。可以通过以下代码读取数据集: ```python data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/00350/default%20of%20credit%20card%20clients.xls', header=1, delimiter='\t') ``` 读取数据后,我们可以通过`head()`函数查看数据的前几行,以确保数据被正确读取。代码如下: ```python data.head() ``` 接下来,我们需要对数据进行预处理,包括删除不必要的列和处理缺失值。这里我们删除ID列,并使用均值填充缺失值。代码如下: ```python # 删除ID列 data = data.drop(['ID'], axis=1) # 使用均值填充缺失值 data = data.fillna(data.mean()) ``` 接下来,我们需要对数据进行标准化处理,以确保所有特征在相同的范围内。这里我们使用sklearn中的`StandardScaler`函数进行标准化处理。代码如下: ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() data_scaled = scaler.fit_transform(data) ``` 接下来,我们可以使用DBSCAN算法对数据进行聚类DBSCAN算法是一种基于密度的聚类算法,它可以自动发现不同形状和大小的聚类代码如下: ```python dbscan = DBSCAN(eps=3, min_samples=2) clusters = dbscan.fit_predict(data_scaled) ``` 在上面的代码中,我们设置了`eps=3`和`min_samples=2`。`eps`表示两个样本被认为是同一簇的最大距离,`min_samples`表示一个簇中最少需要包含的样本数。这些参数需要根据具体问题进行调整。 最后,我们可以通过以下代码聚类结果可视化: ```python plt.scatter(data_scaled[:,0], data_scaled[:,1], c=clusters, cmap='viridis') plt.xlabel('Limit Balance') plt.ylabel('Age') plt.show() ``` 这里我们将第一列和第二列特征作为横纵坐标,用颜色表示不同的聚类代码中的`cmap='viridis'`表示使用viridis颜色映射。运行完整代码后,我们将得到以下可视化结果: ![image.png](attachment:image.png) 在上图中,我们可以看到,DBSCAN算法将数据划分为多个聚类。不同聚类之间的样本点颜色不同,相同聚类中的样本点颜色相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值