一、人工数据集
- 使用make_blobs产生3个簇的数据,使用make_moons产生2个簇的数据;
- 分别使用K-means和DBSCAN算法对数据进行聚类。K-means的k值设定分别为3和4;
- 给出聚类前后数据散点图的对比,并说明2种聚类算法在不同数据集上的性能,以及原因。
from matplotlib import pyplot as plt, pyplot
from numpy import unique, where
from sklearn.cluster import KMeans, DBSCAN
from sklearn.datasets import make_blobs, make_moons
def data_show(X, y):
plt.scatter(X[:, 0], X[:, 1], c=y, cmap="rainbow") # 可视化展示
plt.show()
def K_Means(X, k):
# kmeans训练并可视化 n_clusters:聚类中心数量
y_pre = KMeans(n_clusters=k, random_state=9).fit_predict(X)
# 可视化展示
plt.scatter(X[:, 0], X[:, 1], c=y_pre)
plt.show()
def _DBSCAN(X):
model = DBSCAN(eps=1, min_samples=10)
# 模型拟合与聚类预测
yhat = model.fit_predict(X)
# 检索唯一群集
clusters = unique(yhat)
# 为每个群集的样本创建散点图
for cluster in clusters:# 获取此群集的示例的行索引
row_ix = where(yhat == cluster)
pyplot.scatter(X[row_ix, 0], X[row_ix, 1]) # 创建这些样本的散布
pyplot.show() # 绘制散点图
def test(X, y):
data_show(X, y)
K_Means(X, 3)
K_Means(X, 4)
_DBSCAN(X)
if __name__ == '__main__':
n_samples = 1500
X_moons, y_moons = make_moons(n_samples=n_samples, noise=.05)
X_blobs, y_blobs = make_blobs(n_samples=n_samples)
test(X_blobs, y_blobs)
test(X_moons, y_moons)
make_blobs()用于生成图1中所示的3个簇的数据,其参数n_samples为样本量。 make_moons()函数用于生成图1中所示的2个簇的月亮形数据,其参数n_samples为样本量,noise为噪声。
data_show()函数用于簇的可视化显示,scatter函数绘制散点图,参数x,y用于输入数据,c设置颜色序列,cmap设置colormap。
K_Means()函数实现了K-Means算法。其中KMeans函数设置聚类器,参数n_clusters为聚类中心数量,fit_predict函数用于聚类并对进行预测。
_DBSCAN()函数实现了DBSCAN算法。其中DBSCAN函数设置聚类器,参数eps为领域半径,min_samples为成为核心对象的在领域半径内的最少点数。fit_predict函数用于聚类并对进行预测,unique函数去除重复的聚类核心,检索唯一群集。随后通过for循环,根据聚类核心逐一创建样本散布,最后绘制散点图。
test函数根据实验需求,调用相应函数。
根据图2、图3可知,KMeans算法对于make_blobs()生成的球形簇的聚类效果更加好,而对make_blobs()生成的月亮形簇的聚类效果并不理想。这是因为KMeans算法仅考虑到最近簇中心的距离,无法处理非球形的簇,所以它对月亮形簇进行了错误的分类。此外,对于三个球形簇,k值选为3的聚类效果比k值选为4的聚类效果更好,因此k值的选择十分重要。
根据图4可知,DBSCAN算法对两种类型的簇的聚类效果都不错,因为它不断根据给定的eps和min_samples确定所有的核心点,并对每一个核心点查找密度可达的样本生成聚类簇,从而达到良好的聚类效果。左图中,DBSCAN对于球形簇的聚类,eps设置为1,导致一个簇样本量过大;右图中,DBSCAN对于月亮形簇的聚类,eps设置为0.3,聚类效果很好。 此外,若是eps设置得过小,则意味着没有点是核心样本,可能会导致所有点被标记为噪声;若是eps设置得过大,则可能导致所有点形成单个簇。因此,eps的设定尤为重要,对于不同的样本需要进行相应的更改。
图 1 聚类前散点图
图 2 k值为3时,Kmeans聚类后的散点图