机器学习—聚类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]:
In [5]:
X.shape
Out[5]:
In [6]:
y.shape
Out[6]:
In [7]:
y
Out[7]:
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]:
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]:
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]:
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]:
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]:
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算法的效果远远优于K-Means算法。