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]:
K-Means聚类实验
In [7]:
from sklearn.cluster import KMeans kmeans = KMeans(n_clusters=2) kmeans.fit(X)
Out[7]:
注:
虽然K-Means是⽆无监督学习,但在sklearn中该算法也作为评估器而存在,因此 使用方法也要遵照评估器的⼀般使用规则,在模型训练完成后,可使用模型的 labels_ 属性查 看各训练数据所属簇的划分情况,也可调用predict方法再对原始数据进行预测,从而生成各个 点的所属簇标签
In [9]:
labels = kmeans.labels_
labels
Out[9]:
In [10]:
kmeans.predict(X)
Out[10]:
同时模型 clustercenters 属性保存了聚类结果的中心点
In [11]:
centers = kmeans.cluster_centers_
centers
Out[11]:
In [12]:
plt.scatter(X[:,0], X[:,1], c = labels) plt.plot(centers[:,0], centers[:,1], 'ro')
Out[12]:
明显没有捕捉到数据背后的客观规律
DBSCAN聚类实践
注:
调用sklearn中DBSCAN算法时,需要设置eps半径长度以及核心点的判别条件
In [13]:
from sklearn.cluster import DBSCAN db = DBSCAN(eps=0.3, min_samples=10) db.fit(X)
Out[13]:
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]: