数据挖掘与分析——聚类模型

一、人工数据集

  1. 使用make_blobs产生3个簇的数据,使用make_moons产生2个簇的数据;
  2. 分别使用K-means和DBSCAN算法对数据进行聚类。K-means的k值设定分别为3和4;
  3. 给出聚类前后数据散点图的对比,并说明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聚类后的散点图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱桃小叮当

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值