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 对这两个参数十分敏感,如果这两个参数设定得不准确,最终的效果也会受到很大的影响。
数据量大时开销也很大。 在计算过程中,需要对每个簇的关系进行管理。所以当数据量大的话,内存的消耗也非常严重。
如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差。