sklearn常用聚类算法模型【KMeans、DBSCAN】实践

sklearn常用聚类算法模型【KMeans、DBSCAN】实践聚类算法是很重要的一类算法模型,在实际的应用实践中是会经常使用到的,最近的工作类型中大多偏向于有监督学习类型模型的使用,而对于无监督算法模型的使用则使用得相对少了很多,今天就简单的回归一下聚类算法模型,主要是KMeans模型和DBSACN模型的使用。这两种模型可以说是聚类算法领域里面很具有代表性的算法了,前者是基于样本之间距离的聚类,后者是基于样本集密度的聚类。殊途同…

大家好,又见面了,我是你们的朋友全栈君。

       聚类算法是很重要的一类算法模型,在实际的应用实践中是会经常使用到的,最近的工作类型中大多偏向于有监督学习类型模型的使用,而对于无监督算法模型的使用则使用得相对少了很多,今天就简单的回归一下聚类算法模型,主要是KMeans模型和DBSACN模型的使用。

      这两种模型可以说是聚类算法领域里面很具有代表性的算法了,前者是基于样本之间距离的聚类,后者是基于样本集密度的聚类。殊途同归,本二者的本质都是为了最终实现:簇间距离最大,簇内距离最小的目的。

       本来想好好介绍一番原理,可是忽然觉得想着想着就越想越多了,这里索性就不再讲解原理了,网上也有很多系列的原理讲解的文章,可以去看看的,这里主要是实践使用分析为主。

        使用聚类算法,首先我们要有数据集才可以,这里为了简单,直接使用的是sklearn提供的数据集生成模块,来直接生成我们所需要的数据集,具体实现如下:

def getClusterData(flag=True,ns=1000,nf=2,centers=[[-1,-1],[1,1],[2,2]],cluster_std=[0.4,0.5,0.2]):
    '''
    得到回归数据
    centers(簇中心的个数或者自定义的簇中心)
    cluster_std(簇数据方差代表簇的聚合程度)
    '''
    if flag:
        cluster_X,cluster_y=datasets.make_circles(n_samples=ns,factor=.6,noise=.05)
    else:
        cluster_X,cluster_y=datasets.make_blobs(n_samples=ns,n_features=nf,centers=centers,
                                                cluster_std=cluster_std,random_state=9)
    return cluster_X,cluster_y

       数据集生成的代码块中已经加入了我的注释,相信是比较容易看明白的。

       接下来,我们要对原始生成的数据集进行划分,生成训练集和测试集,具体实现方法如下:

def dataSplit(dataset,label,ratio=0.3):
    '''
    数据集分割-----训练集、测试集合
    '''
    try:
        X_train,X_test,y_train,y_test=train_test_split(dataset,label,test_size=ratio)
    except:
        dataset,label=np.array(dataset),np.array(label)
        X_train,X_test,y_train,y_test=train_test_split(dataset,label,test_size=ratio)
    print '--------------------------------split_data shape-----------------------------------'
    print len(X_train), len(y_train)
    print len(X_test), len(y_test)
    return X_train,X_test,y_train,y_test

       上述代码块实现了原始数据集的分割。

        之后,我们需要做一点模型持久化存储于加载使用的工作,这也是机器学习或者是深度学习里面很重要的组成部分了,因为当数据集体量增大的时候,每次使用模型都重复去训练模型的时间代价或者是计算代价都是很大的,所以这里要做好已训练完成模型的持久化工作,具体实现方式如下:

def saveModel(model,save_path="model.pkl"):
    '''
    模型持久化存储
    '''
    joblib.dump(model,save_path)
    print u"持久化存储完成!"


def loadModel(model_path="model.pkl"):
    '''
    加载保存本地的模型
    '''
    model=joblib.load(model_path)
    return model

          上述的代码块实现了训练完成模型的本地化存储于加载使用。

           完成上述全部工作后,就要开始模型的搭建使用了,具体如下:

def clusterModel(flag=True):
    '''
    Kmeans算法关键参数:
    n_clusters:数据集中类别数目

    DBSCAN算法关键参数:
    eps: DBSCAN算法参数,即我们的ϵ-邻域的距离阈值,和样本距离超过ϵ的样本点不在ϵ-邻域内
    min_samples: DBSCAN算法参数,即样本点要成为核心对象所需要的ϵ-邻域的样本数阈值
    '''
    X,y=getClusterData(flag=flag,ns=3000,nf=5,centers=[[-1,-1],[1,1],[2,2]],
                       cluster_std=[0.4,0.5,0.2])
    X_train,X_test,y_train,y_test=dataSplit(X,y,ratio=0.3)
    #绘图
    plt.figure(figsize=(16,8))
    #Kmeans模型
    model=KMeans(n_clusters=3,random_state=9)
    model.fit(X_train)
    y_pred=model.predict(X_test)
    plt.subplot(121)
    plt.scatter(X_test[:, 0], X_test[:, 1],c=y_pred)
    plt.title('KMeans Cluster Result')
    #DESCAN模型
    # 下面的程序报错:AttributeError: 'DBSCAN' object has no attribute 'predict'
    # model=DBSCAN(eps=0.1,min_samples=10)
    # model.fit(X_train)
    # y_pred=model.predict(X_test)
    # 改为这样形式的可以了
    y_pred=DBSCAN(eps=0.05,min_samples=10).fit_predict(X_test)
    plt.subplot(122)
    plt.scatter(X_test[:, 0], X_test[:, 1],c=y_pred)
    plt.title('DBSCAN Cluster Result')
    if flag:
        plt.savefig('circleData.png')
    else:
        plt.savefig('blobData.png')

       上述代码块实现了KMeans模型和DBSACN模型的构建、训练和使用,我们对测试集的预测结果进行了可视化分析具体如下所示:

Circle数据集模型结果:

sklearn常用聚类算法模型【KMeans、DBSCAN】实践

非Circle数据集模型结果:

sklearn常用聚类算法模型【KMeans、DBSCAN】实践

      整体来看,上述两个数据集KMeans的综合表现优于DBSACN模型,不过这个只是一个简单的实验说明,就是为了熟练一下这两种常用聚类模型的使用,记录学习一下。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152335.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • webstorm激活码2021-激活码分享

    (webstorm激活码2021)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.htmlWK…

  • panda’_pandas map

    panda’_pandas mappandas.DataFrame.iloc()纯基于位置的整数索引输入格式:一个整数列表或数组,如[4,3,0]。一个带有int类型的slice对象,例如1:7。一个布尔值数组。一个具有一个参数的可调用函数,返回索引案例mydict=[{‘a’:1,’b’:2,’c’:3,’d’:4},{‘a’:100,’b’:200,’c’:300,’d’:400},{‘a’:1000,’b’:2000,’c’:30

  • 零拷贝详解_深拷贝和浅拷贝如何实现

    零拷贝详解_深拷贝和浅拷贝如何实现一、概念1、用户态与内核态⽤户态和内核态是操作系统的两种运⾏状态。(1)内核态:处于内核态的CPU可以访问任意的数据,包括外围设备,⽐如⽹卡、硬盘等,处于内核态的CPU可以从⼀个程序切换到另外⼀个程序,并且占⽤CPU不会发⽣抢占情况,⼀般处于特权级0的状态我们称之为内核态。(2)⽤户态:处于⽤户态的CPU只能受限的访问内存,并且不允许访问外围设备,⽤户态下的CPU不允许独占,也就是说CPU能够被其他程序获取。注意:1)为什么要有⽤户态和内核态呢?  这个主要是访问能⼒的限制

  • mac 下安装双系统同时启动方案「建议收藏」

    mac 下安装双系统同时启动方案「建议收藏」本文经过实测后记录,以备后查,原本是买回来的本子上,销售商已帮我装上了MACOSX和WIN7双系统,WIN7单独装在一个区下面,后来觉得OSX系统东西太多,清理麻烦,就重装了一下OSX,重装后发现原来的WIN7还是可以启动的,直接在开机状态下按住option键,选择WIN7的启动分区就可以。这点倒是比WINDOWNS系统要好。但这种情况下想使用WIN7的话,就得重启系

  • Arduino连接LCD1602显示屏

    Arduino连接LCD1602显示屏LCD1602液晶屏带I2C接口使用I2C接口,省IO口,只需要4条线即可。通过背光灯,和可调节对比度(就是背面蓝色那块可以旋转的调)自从1.6.6版本的IDE出来后,不断有反应LCD1602IIC液晶显示不正常,打印一字符串,却只显示第一个字符!最初解决办法换低版本IDE,就可以解决该问题!现在问题找出来了,只需要更改LiquidCrystal_I2C.cpp文件中的一个语…

  • 查看 CUDA 版本 正确方法(亲测有效)

    查看 CUDA 版本 正确方法(亲测有效)查看CUDA版本正确方法!(亲测有效)

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号