社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

机器学习实战(19)—— DBSCAN算法代码实现

人工智能爱好者社区 • 5 年前 • 632 次点击  

👇点击关注公众号👇

第一时间获取人工智能干货内容


本篇我们来看看DBSCAN的代码实现。


因为DBSCAN的合适数据较难获取,我们通过数据生成器生成相应数据。


import numpy as np

from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs#数据生成器
from sklearn.preprocessing import StandardScaler


选择3个中心点,生成750个样本。


#产生样本
centers = [[11], [-1-1], [1-1]]#作为中心点
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4,
                            random_state=0)#生成750个样本

X = StandardScaler().fit_transform(X)#标准化
X


标准化后的数据如下:



使用DBSCAN密度聚类:


#计算DBSCAN
db = DBSCAN(eps=0.3, min_samples=10).fit(X)
db.labels_#提取标签的簇值属性(标签属性)0~2


下图展示部分标签:



输出核心点的序号(以下展示部分):





    
db.core_sample_indices_#核心点的序号 不包含-1



core_samples_mask = np.zeros_like(db.labels_, dtype=bool)#产生全0矩阵!布尔值即为false
core_samples_mask


core_samples_mask[db.core_sample_indices_] = True#核心点为true
core_samples_mask


labels = db.labels_
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)#噪声点为-1
#set()去除labels中重复的元素,然后计算长度即代表所分成的簇, 
# 如果有噪音点则去除含有噪音点的簇,因此结果计算出来就是不含噪音点的簇的数目。


len(set(labels))#加上噪声点的类别会有4个,其实在生成数据时候我们就知道是生成了3类!


输出为4


print('Estimated number of clusters: %d' % n_clusters_)#3个簇


接下来设置下之后绘图的颜色:


unique_labels = set(labels)
[each for each in np.linspace(01, len(unique_labels))]



import matplotlib.pyplot as plt
[plt.cm.Spectral(each) for each in  np.linspace(01, len(unique_labels))]#色彩 类似cmyk



#绘图
import matplotlib.pyplot as plt
%matplotlib inline

unique_labels = set(labels)#所有类别标签去重,剩下0~2
colors = [plt.cm.Spectral(each) for each in np.linspace(01, len(unique_labels))]#每种分个颜色
for k, col in zip(unique_labels, colors):#k 循环,每次画出对应类别的点
    if k == -1:#噪声点
        col = [0001]#黑色

    class_member_mask = (labels == k)#

    xy = X[class_member_mask & core_samples_mask]#核心点,与运算符
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=14)#黑色框,大小为14

    xy = X[class_member_mask & ~core_samples_mask]#非核心点
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
             markeredgecolor='k', markersize=6)#大小为6

plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()



这就是DBSCAN的案例了,你学会了么?


—— 推 荐 阅 读 ——
假如,人工智能也去摆地摊
作为一个乘风破浪的程序员,我每天除了疯就是浪
程序员最卑微的瞬间
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118897