`
鬼大来晚了
  • 浏览: 66179 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

《机器学习实战》6:K-均值聚类

 
阅读更多

有两个月的时间没有更新博客了。最近很忙,中断了机器学习的学习。这两天又把这本书拿出来接着看,SVM还是没有看明白,索性就看了个简单的K-均值聚类。

1、聚类定义:聚类是一种无监督学习(也就是在聚类结果出来之前我们不知道每个簇是什么),它将相似的对象归为一类,和我们常说的“人以群分,物以类聚”是相似的。

在学习K个好邻居的时候说过数据挖掘的流程,这里再次回忆一下:

2、开发机器学习应用程序的步骤 
(1)收集数据:收集各种样本数据,为了节省时间,可以使用公开的可用数据源 
(2)准备输入数据:确保数据格式符合要求,本书采用的格式是Python语言的List。 
(3)数据分析:人工分析以前得到的数据,确保数据集中没有垃圾数据。 
(4)训练算法,这一步才是机器学习真正的开始,对于监督学习,我们把之前的格式化数据输入到算法中,得到分类模型,方便后续处理。对于无监督学习,不存在目标变量,因此也不需要训练算法!!!
(5)测试算法:这一步使用第4步机器学习的模型。这一步主要测试算法的工作效率。 
(6)使用算法:将机器学习算法转换为应用程序,执行实际任务。 

3、K-均值聚类

首先,随机确定k个初始点作为质心。然后为每个点找距离其最近的质心,将其分配到该质心所对应的簇中。完成这一步之后,更新每个簇的质心为该簇所有点的平均值。迭代以上过程,直到簇分配结果不再改变,完成K-均值聚类。

 伪代码:很重要!!!代表着算法的逻辑

 


随机创建K个质心为起始点
当任意一个点的簇分配结果发生变化时
    对每一个数据点
         对每个质心
              计算数据点和之心之间的距离
         将数据点分配到距离最近的簇中
    对每个簇,计算所有点的均值更新质心

 4、算法的实现

 

(1)创建文件kMeans.py,编写k-均值算法需要用到的通用函数,代码如下:

from numpy import *

#加载数据集
def loadDataSet(fileName):
    dataMat=[]
    fr=open(fileName)
    for line in fr.readlines():
        curLine=line.strip().split('\t')
        #map函数的主要功能是
        #对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表
        #这里从文件中读取的信息是字符型,通过map函数将其强制转化为浮点型
        frtLine=map(float,curLine)
        dataMat.append(frtLine)
    return dataMat

#计算两个向量之间的距离
def distEclud(vecA,vecB):
    return sqrt(sum(power(vecA-vecB,2)))

#随机构建初始质心
def randCent(dataSet,k):
    #数据列数
    n=shape(dataSet)[1]
    #初始化质心
    centroids=mat(zero(k,n))
    for j in range(n):
        #求每一维数据的最大值和最小值,保证随机选取的质心在边界之内
        minJ=min(dataSet[:,j])
        maxJ=max(dataSet[:,j])
        rangeJ=float(maxJ-minJ)
        centroids[:,j]=minJ+rangeJ*random.rand(k,1)
    return centroids

对上面的随机选点函数进行测试:

 

 

有了以上的通用函数,我们就可以实现k-均值算法了,具体的算法如下:

 

#kMeans算法
def kMeans(dataSet,k,distMeas=distEclud,createCent=randCent):
    #数据点的行数
    m=shape(dataSet)[0]
    #用于记录数据点到之心的距离平方
    clusterAssment=mat(zeros((m,2)))
    #中心点
    centroids=createCent(dataSet,k)
    #聚类结束标志
    clusterChanged=True
    while clusterChanged:
        clusterChanged=False;
        #遍历每条数据
        for i in range(m):
            #设置两个变量,分别存放数据点到质心的距离,及数据点属于哪个质心
            minDist=inf;minIndex=-1;
            #遍历每个质心
            for j in range(k):
                distJI=distMeas(centroids[j,:],dataSet[i,:])
                if(distJI<minDist):
                    #将数据归为最近的质心
                    minDist=distJI;minIndex=j;
            #簇分配结果发生变化,更新标志
            if clusterAssment[i,0]!=minIndex:clusterChanged=True
            clusterAssment[i,:]=minIndex,minDist**2
        print centroids
        #更新质心
        for cent in range(k):
            ptsInClust=dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]
            centroids[cent,:]=mean(ptsInClust,axis=0)
    return centroids,clusterAssment

 

 

测试结果如下:

 

 

经过三次迭代,找到了4个合适的质心。

 

这样我们就完成了k-均值算法的实现,那么我们如何知道我们生成的簇结果是比较好的呢?我们通过点到簇新的平方和来估计结果的好坏,即通过误差平方和SSE(Sum of SquaredError)来度量。由于sse并不是一个凸函数,我们使用K-means算法有些情况下得到的局部最小值,并不是最有的聚类结果。为了改善这种局部最优的缺点,可以通过多次执行k-means算法,找到使得SSE最小的聚类。另一种方法就是有人提出了二分k-均值算法。

5、二分K-均值

 该算法首先将所有的点当成一个簇,然后将该簇一分为二。之后选择其中一个簇进行划分,选择哪一个簇进行划分取决于对其划分是否可以最大程度降低SSE的值。不断重复该过程,直到达到用户所需要的簇个数为止。

将所有的点看成一个簇
当簇数目小于k时
   对每一个簇
        计算总误差
        在给定的簇上面进行二分k-均值聚类
        计算一分为二之后的总误差
    选择使得误差最小的那个簇进行划分

 编写代码如下:

def biKmeans(dataSet,k,distMeas=distEclud):
    m=shape(dataSet)[0]
    clusterAssment=mat(zeros((m,2)))
    #创建一个初始簇
    centroid0=mean(dataSet,axis=0).tolist()[0]
    centList=[centroid0]
    #计算初始误差
    for j in range(m):
        clusterAssment[j,1]=distMeas(mat(centroid0),dataSet[j,:])**2
    while(len(centList)<k):
        lowestSSE=inf
        #遍历每个簇,尝试划分每个簇
        for i in range(len(centList)):
            ptsInCurrCluster=\
                dataSet[nonzero(clusterAssment[:,0].A==i)[0],:]
            centroidMat,splitClustAss=\
                kMeans(ptsInCurrCluster,2,distMeas)
            #划分后的误差平方和
            sseSplit=sum(splitClustAss[:,1])
            #剩余的误差之和
            sseNotSplit=\
                sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1])
            print "ssesplit,sseNotSplit",sseSplit,sseNotSplit
            if(sseSplit+sseNotSplit)<lowestSSE:
                bestCentToSplit=i
                bestNewCents=centroidMat
                bestClustAss=splitClustAss.copy()
                lowestSSE=sseSplit+sseNotSplit
        #更新分配结果
        bestClustAss[nonzero(bestClustAss[:,0].A==1)[0],0]=\
                    len(centList)
        bestClustAss[nonzero(bestClustAss[:,0].A==0)[0],0]=\
                    bestCentToSplit
        print "the bestCentToSplit is:",bestCentToSplit
        print "the len of bestClustAss is:",len(bestClustAss)
        centList[bestCentToSplit]=bestNewCents[0,:]
        centList.append(bestNewCents[1,:])
        clusterAssment[nonzero(clusterAssment[:,0].A==\
                               bestCentToSplit)[0],:]=bestClustAss
        print centList
    return mat(centList),clusterAssment

 

 

  • 大小: 9.1 KB
  • 大小: 8.7 KB
分享到:
评论

相关推荐

    机器学习实战之K-均值聚类

    K-MEANS算法是输入聚类个数k,以及包含 n个数据对象的数据库,输出满足方差最小标准k个聚类的一种算法。

    k——均值聚类代码

    K均值聚类代码,机器学习实战K均值聚类代码,机器学习实战

    K-均值聚类算法中的testSet.txt

    机器学习实战这本书中的数据集文本。

    Python——机器学习实战——K均值聚类算法分组

    本代码主要利用Python工具实现K均值聚类算法分组,简单明了,易于理解

    Machine Learning in action

    10.) 使用K-均值聚类算法对未标注数据分组:k-means聚类 11.) 使用Apriori算法进行关联分析 12.) 使用FP-growth算法来高效发现频繁项集 第四部分 其他工具 13.) 利用PCA来简化数据 14.) 利用SVD简化数据 15.) 大数据...

    python机器学习实战之K均值聚类

    本文实例为大家分享了python K均值聚类的具体代码,供大家参考,具体内容如下 #-*- coding:utf-8 -*- #!/usr/bin/python ''''' k Means K均值聚类 ''' # 测试 # K均值聚类 import kMeans as KM KM.kMeansTest() #...

    第 22 章 基于 K-means 聚类算法的图像区域分割.zip

    深度学习机器学习图像处理的matlab源代码--基于均值聚类算法的图像分割应用实战

    『ML』利用K-Means聚类算法对未标注数据分组——《机器学习实战》学习笔记(Ch10)

    主要参考《机器学习实战》—— Peter Harrington著。 导航K-Means简介代码实现(一)数据集读入(二)距离计算(三)构建随机质心(四)数据聚类(五)完整代码改进:采用二分法(一)简介(二)代码最后 K-Means...

    k均值、合并聚类和DBSCAN聚类算法对鸢尾花数据集聚类代码.zip

    k均值、合并聚类和DBSCAN聚类算法对鸢尾花数据集聚类代码.zip

    机器学习实战 源代码(Machine Learning in Action)

    那么,着实推荐你看《机器学习实战》,每一个算法都配有代码实现,以及该算法适合做哪类项目。 多种经典的监督学习算法,k近邻算法、朴素贝叶斯算法、Logistic回归算法、支持向量机、AdaBoost集成方法、基于树的回归...

    机器学习实战_机器学习_

    机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的... 第三部分则重点介绍无监督学习及其一些主要算法:k均值 聚类算法 、 Apriori 算法、 FP-Growth 算法。

    machine_learning

    主要用于机器学习实战这本书为参考,进行的代码编写,原书中的代码是用python2实现的,这里用python3进行了改写! 1.K-近邻算法 2.决策树 3.朴素贝叶斯算法 4.Logistic回归 5.支持向量机 线性SVM 非线性SVM Sklearn...

    《Machine Learning in Action》(Peter Harrington著)

    第三部分则重点介绍无监督学习及其一些主要算法:k均值聚类算法、Apriori算法、FP-Growth算法。第四部分介绍了机器学习算法的一些附属工具。 本书主要具有 4 个优点: 1-不调包,从0写起实现主流机器学习算法 2-所有...

    《机器学习实战》学习代码.zip

    无监督学习算法:K均值聚类(K-Means Clustering)层次聚类(Hierarchical Clustering)高斯混合模型(Gaussian Mixture Models)主成分分析(Principal Component Analysis,PCA)关联规则学习(Association Rule ...

    《机器学习实战》 学习笔记.zip

    无监督学习算法:K均值聚类(K-Means Clustering)层次聚类(Hierarchical Clustering)高斯混合模型(Gaussian Mixture Models)主成分分析(Principal Component Analysis,PCA)关联规则学习(Association Rule ...

    《机器学习实战》代码学习.zip

    无监督学习算法:K均值聚类(K-Means Clustering)层次聚类(Hierarchical Clustering)高斯混合模型(Gaussian Mixture Models)主成分分析(Principal Component Analysis,PCA)关联规则学习(Association Rule ...

    《机器学习实战》书籍的学习.zip

    无监督学习算法:K均值聚类(K-Means Clustering)层次聚类(Hierarchical Clustering)高斯混合模型(Gaussian Mixture Models)主成分分析(Principal Component Analysis,PCA)关联规则学习(Association Rule ...

Global site tag (gtag.js) - Google Analytics