A--无监督学习算法示例: DBSCAN(聚类)

K-Means对非球形边界的数据很难达到⼀个较好的分类效果,因此我们需要借助另外的数学理论工具对其进行进一步的完善。利⽤密度进行聚类的方法: DBSCAN。

 

DNSCAN是⼀种基于密度的聚类方法,旨在寻找被低密度区域分离的高密度区域。 DBSCAN是⼀种简单、有效的基于密度的聚类算法,且包含了基于密度的许多方法中的重要概念

 

聚类分析: DBSCAN算法伪代码

​1:将所有点标记为核⼼心点、边界点或噪声点

​2:删除噪声点

​3:为举例例在Eps之内的所有核⼼心点之间赋予⼀一条边

​4:每个彼此联通的核⼼心点组成⼀一个簇

​5:将每个边界点指派到⼀一个与之关联的核⼼心点的簇当中

In [5]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
In [3]:
from sklearn.datasets import make_moons
X, y = make_moons(200, noise=0.05, random_state=0)
#生成了一个⼆维数组数据集X,数据集形如弯月,且内部每个元素根据初始簇设置有对应的
#标签,该初始簇归属情况由原始质⼼划分方法决定
 
In [6]:
plt.scatter(X[:,0], X[:,1], c = y)
Out[6]:
<matplotlib.collections.PathCollection at 0x15db2692470>
 
 

K-Means聚类实验

In [7]:
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=2)
kmeans.fit(X)
Out[7]:
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
    n_clusters=2, n_init=10, n_jobs=1, precompute_distances='auto',
    random_state=None, tol=0.0001, verbose=0)
注:

虽然K-Means是⽆无监督学习,但在sklearn中该算法也作为评估器而存在,因此 使用方法也要遵照评估器的⼀般使用规则,在模型训练完成后,可使用模型的 labels_ 属性查 看各训练数据所属簇的划分情况,也可调用predict方法再对原始数据进行预测,从而生成各个 点的所属簇标签

In [9]:
labels = kmeans.labels_
labels

Out[9]:

array([1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1,
       0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0,
       1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0,
       0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0,
       1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0,
       0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0,
       0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0,
       1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1,
       1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,
       0, 1])
In [10]:
kmeans.predict(X)
Out[10]:
array([1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1,
       0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0,
       1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0,
       0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0,
       1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0,
       0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0,
       0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0,
       1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1,
       1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0,
       0, 1])
 

同时模型 clustercenters 属性保存了聚类结果的中心点

In [11]:
centers = kmeans.cluster_centers_
centers

Out[11]:

array([[-0.2003285 ,  0.58035606],
       [ 1.20736718, -0.0825517 ]])
In [12]:
plt.scatter(X[:,0], X[:,1], c = labels)
plt.plot(centers[:,0], centers[:,1], 'ro')
 
Out[12]:
[<matplotlib.lines.Line2D at 0x15db2b6c908>]
 
 

明显没有捕捉到数据背后的客观规律

 

DBSCAN聚类实践

注:

调用sklearn中DBSCAN算法时,需要设置eps半径长度以及核心点的判别条件

In [13]:
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=0.3, min_samples=10)
db.fit(X)

Out[13]:

DBSCAN(algorithm='auto', eps=0.3, leaf_size=30, metric='euclidean',
    metric_params=None, min_samples=10, n_jobs=1, p=None)
In [14]:
db.labels_
array([0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1,
       0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1,
       1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0,
       0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0,
       1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0,
       0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0,
       0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,
       1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1,
       1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,
       0, 1], dtype=int64)
 
             
In [15]:
plt.scatter(X[:,0], X[:,1], c = db.labels_)

Out[15]:

<matplotlib.collections.PathCollection at 0x15db2ec0ba8>
 
 
 

猜你喜欢

转载自www.cnblogs.com/Koi504330/p/11910839.html