机器学习—聚类5-3(DBSCAN算法)

使用DBSCAN对环形数据做聚类

主要步骤流程:

  • 1. 导入包
  • 2. 生成数据并可视化
  • 3. 使用DBSCAN做聚类并可视化
    • 3.1 参数组合1
    • 3.2 参数组合2
    • 3.3 参数组合3
    • 3.4 参数组合4
  • 4. 使用K-Means做聚类并可视化
  • 5. 打印调整兰德指数

 

1. 导入包

In [2]:
# 导入包
import numpy as np
import matplotlib.pyplot as plt

 

2. 生成数据并可视化

In [3]:
# 生成数据
from sklearn.datasets import make_circles
X, y = make_circles(n_samples=750, factor=0.3, noise=0.1, random_state=1)
In [4]:
# 可视化数据
plt.figure()
plt.scatter(X[:,0], X[:,1], c=y)
Out[4]:
<matplotlib.collections.PathCollection at 0x1a6d5026b08>
In [5]:
X.shape
Out[5]:
(750, 2)
In [6]:
y.shape
Out[6]:
(750,)
In [7]:
y
Out[7]:
array([1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0,
       1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0,
       0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1,
       0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0,
       0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0,
       1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0,
       0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1,
       0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,
       0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,
       1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0,
       0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0,
       0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0,
       1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0,
       1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1,
       0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
       1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1,
       0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1,
       0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0,
       1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0,
       0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0,
       1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0,
       1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1,
       0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0,
       1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1,
       0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1,
       0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,
       1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1,
       0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0,
       0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1,
       0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
       1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1,
       0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1,
       1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1,
       1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0,
       0, 0], dtype=int64)
 

3. 使用DBSCAN做聚类并可视化

3.1 参数组合1

In [8]:
# 使用DBSCAN做聚类
from sklearn.cluster import DBSCAN
y_dbscan_pred = DBSCAN(eps=0.05, min_samples=10).fit_predict(X)
In [9]:
# 可视化DBSCAN聚类效果
plt.figure()
plt.scatter(X[:,0], X[:,1], c=y_dbscan_pred)
Out[9]:
<matplotlib.collections.PathCollection at 0x1a6d6603048>

3.2 参数组合2

In [10]:
# 使用DBSCAN做聚类
from sklearn.cluster import DBSCAN
y_dbscan_pred = DBSCAN(eps=0.15, min_samples=10).fit_predict(X)
In [11]:
# 可视化DBSCAN聚类效果
plt.figure()
plt.scatter(X[:,0], X[:,1], c=y_dbscan_pred)
Out[11]:
<matplotlib.collections.PathCollection at 0x1a6d666a9c8>

3.3 参数组合3

In [12]:
# 使用DBSCAN做聚类
from sklearn.cluster import DBSCAN
y_dbscan_pred = DBSCAN(eps=0.3, min_samples=10).fit_predict(X)
In [13]:
# 可视化DBSCAN聚类效果
plt.figure()
plt.scatter(X[:,0], X[:,1], c=y_dbscan_pred)
Out[13]:
<matplotlib.collections.PathCollection at 0x1a6d66d1108>

3.4 参数组合4

In [14]:
# 使用DBSCAN做聚类
from sklearn.cluster import DBSCAN
y_dbscan_pred = DBSCAN(eps=0.15, min_samples=50).fit_predict(X)
In [15]:
# 可视化DBSCAN聚类效果
plt.figure()
plt.scatter(X[:,0], X[:,1], c=y_dbscan_pred)
Out[15]:
<matplotlib.collections.PathCollection at 0x1a6d6734388>
 

4. 使用K-Means做聚类并可视化

In [16]:
# 使用K-Means做聚类
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 2, init = 'k-means++', n_init=10, max_iter=300, random_state = 0)
kmeans.fit(X)
y_kmeans_pred = kmeans.predict(X)
In [17]:
# 可视化K-means聚类效果
plt.figure()
plt.scatter(X[:,0], X[:,1], c=y_kmeans_pred)
Out[17]:
<matplotlib.collections.PathCollection at 0x1a6dcbb6408>
 

5. 打印调整兰德指数

In [18]:
# 使用DBSCAN做聚类(调用最优的参数组合)
from sklearn.cluster import DBSCAN
y_dbscan_pred = DBSCAN(eps=0.15, min_samples=10).fit_predict(X)

由于样本数据有标签,所以可以用调整兰德指数衡量模型性能

In [19]:
# 打印出调整兰德指数
from sklearn import metrics
print("DBSCAN的调整兰德指数是:%0.3f" % metrics.adjusted_rand_score(y, y_dbscan_pred))
print("K-Means的调整兰德指数是:%0.3f" % metrics.adjusted_rand_score(y, y_kmeans_pred))
DBSCAN的调整兰德指数是:0.961
K-Means的调整兰德指数是:-0.001
 

由打印出的兰德系数可见,DBSCAN算法的效果远远优于K-Means算法。

 

 

 

 

posted @   Theext  阅读(538)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示