精华内容
下载资源
问答
  • 对于一个多维数据集,首先对分析对象进行特征提取,构建出每个对象的特征向量,通过计算皮尔森相关系数来度量不同特征向量之间的相似性,从而构建出一个相似性网络,采用Blondel算法对该网络进行社团划分达到聚类的...
  • python实现K-means多维数据聚类代码

    千次阅读 2020-06-10 17:03:20
    python实现K-means多维数据聚类 #!/usr/bin/env python #-*- coding:utf-8 -*- # author:wanglubao # datetime:2019/9/22 14:31 # software: PyCharm import numpy as np import matplotlib.pyplot as plt import ...

    python实现K-means多维数据聚类

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # author:wanglubao
    # datetime:2019/9/22 14:31
    # software: PyCharm
    import numpy as np
    import matplotlib.pyplot as plt
    import pandas as pd
    #加载数据
    def loadDataSet(fileName):
        data = np.loadtxt(fileName,delimiter='\t')
        #data = np.loadtxt(fileName, delimiter='\t', dtype=float, skiprows=1)
        return data
        #data =  np.loadtxt(fileName)
    
    #欧氏距离计算
    def distEclud(x,y):
        return np.sqrt(np.sum((x-y)**2))
    # 为给定数据集构建一个包含K个随机质心的集合
    def randCent(dataSet,k):
        # 获取样本数与特征值
        m,n = dataSet.shape#把数据集的行数和列数赋值给m,n
        # 初始化质心,创建(k,n)个以零填充的矩阵
        centroids = np.zeros((k,n))
        # 循环遍历特征值
        for i in range(k):
            index = int(np.random.uniform(0,m))
            # 计算每一列的质心,并将值赋给centroids
            centroids[i,:] = dataSet[index,:]
            # 返回质心
        return centroids
    
    
    # k均值聚类
    def KMeans(dataSet,k):
        m = np.shape(dataSet)[0]
        # 初始化一个矩阵来存储每个点的簇分配结果
        # clusterAssment包含两个列:一列记录簇索引值,第二列存储误差(误差是指当前点到簇质心的距离,后面会使用该误差来评价聚类的效果)
        clusterAssment = np.mat(np.zeros((m,2)))
        clusterChange = True
    
        # 创建质心,随机K个质心
        centroids = randCent(dataSet,k)
        # 初始化标志变量,用于判断迭代是否继续,如果True,则继续迭代
        while clusterChange:
            clusterChange = False
    
            #遍历所有样本(行数)
            for i in range(m):
                minDist = 100000.0
                minIndex = -1
                # 遍历所有数据找到距离每个点最近的质心,
                # 可以通过对每个点遍历所有质心并计算点到每个质心的距离来完成
                for j in range(k):
                    # 计算数据点到质心的距离
                    # 计算距离是使用distMeas参数给出的距离公式,默认距离函数是distEclud
                    distance = distEclud(centroids[j,:],dataSet[i,:])
                    # 如果距离比minDist(最小距离)还小,更新minDist(最小距离)和最小质心的index(索引)
                    if distance < minDist:
                        minDist = distance
                        minIndex = j
                # 如果任一点的簇分配结果发生改变,则更新clusterChanged标志
                if clusterAssment[i,0] != minIndex:
                    clusterChange = True
                    # 更新簇分配结果为最小质心的index(索引),minDist(最小距离)
                    clusterAssment[i,:] = minIndex,minDist
            # 遍历所有质心并更新它们的取值
            for j in range(k):
                # 通过数据过滤来获得给定簇的所有点
                pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0].A == j)[0]]
                # 计算所有点的均值,axis=0表示沿矩阵的列方向进行均值计算
                centroids[j,:] = np.mean(pointsInCluster,axis=0)
        print("Congratulation,cluster complete!")
        # 返回所有的类质心与点分配结果
        return centroids,clusterAssment
    
    def showCluster(dataSet,k,centroids,clusterAssment):
        m,n = dataSet.shape
        #if n != 2:
           # print("数据不是二维的")
            #return 1
    
        mark = ['or','ob','og','ok','^r','+r','sr','dr','<r','pr']
        if k > len(mark):
            print("k值太大了")
            return 1
        #绘制所有样本
        for i in range(m):
            markIndex = int(clusterAssment[i,0])
            plt.plot(dataSet[i,0],dataSet[i,1],mark[markIndex])
    
        mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']
        #绘制质心
        for i in range(k):
            plt.plot(centroids[i,0],centroids[i,1],mark[i])
    
        plt.show()
    dataSet = loadDataSet("C:/Users/Mr zhu/Desktop/cc.txt")
    k = 3
    centroids,clusterAssment = KMeans(dataSet,k)
    showCluster(dataSet,k,centroids,clusterAssment)
    
    
    
    

    数据图片:
    在这里插入图片描述
    结果截图:
    在这里插入图片描述

    展开全文
  •   《实例》阐述算法,通俗易懂,助您对算法的理解达到...昨天实现推送了,GMM高斯混合的EM算法实现的完整代码,这是不掉包的实现,并且将结果和sklearn中的掉包实现做了比较:聚类结果基本一致,要想了解这个算法实

    请点击上面公众号,免费订阅。 

    《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来!


    01

    回顾

    昨天实现推送了,GMM高斯混合的EM算法实现的完整代码,这是不掉包的实现,并且将结果和sklearn中的掉包实现做了比较:聚类结果基本一致,要想了解这个算法实现代码的小伙伴,可以参考:


    机器学习高斯混合模型:聚类原理分析(前篇)

    机器学习高斯混合模型(中篇):聚类求解

    机器学习高斯混合模型(后篇):GMM求解完整代码实现

    机器学习储备(13):概率密度和高斯分布例子解析



    以上包括了高斯混合模型的原理,公式推导过程,完整的代码实现,以及高斯概率密度公式的例子解析。



    02

    二维高斯分布聚类数据生成

    在此不再将完整的代码黏贴上,有需要的请参考上个推送或者在微信或QQ群中和我要Jupyter NoteBook的实现代码。


    下面仍然借助sklearn的高斯分布的数据簇生成功能,注意参数n_features的含义是生成2维(2个特征)的数据集。


    x,label = make_blobs(n_samples=500,n_features=2, centers=3,

                         cluster_std=[0.6,1.2,1.8],

                         random_state=1)  


    sklearn生成的满足二维高斯分布的3簇数据如下所示:


    0?wx_fmt=png

    这是生成3簇二维的高斯分布数据,下面借助自己实现的GMM聚类接口直接对以上模型进行聚类(详细代码请参考之前的推送,文章开头)。



    03

    二维数据的聚类分析

    下面是调用自己写的GMM聚类接口的代码,最终聚类的结果为:3类,可以看出聚类结果较好。

    #一维特征的GMM聚类模拟

    px,aves,sigmas =GMM(x,3)

    mylabel = classifior(px)

    #可以看到不掉包的实现与sklearn的模拟结果是基本一致的

    plt.scatter(x[:, 0],x[:,1],marker='o', c=mylabel) 


    0?wx_fmt=png

    因为GMM聚类会返回每个样本点属于每个簇的概率密度,因此500个样本点,会有一个500 by 3的概率密度结果矩阵,即代码中的 px,下面列出px的部分数据,选取最大值对应的簇即为样本的聚类归属。

    array([[  2.82354561e-01,   9.62092908e-09,   1.55829697e-10],

           [  1.21224887e-35,   7.71577880e-02,   8.29431337e-06],

           [  9.79082071e-37,   1.06570065e-01,   3.55996295e-05],

           ..., 

           [  1.29709523e-33,   9.55957280e-02,   2.51601671e-05],

           [  8.36655897e-02,   1.17357149e-10,   4.61517416e-12],

           [  4.68328153e-87,   3.51016335e-13,   1.18809399e-02]])


    看下预测的3个簇的平均值:

    array([[ 3.2710034 , -4.3257953 ],

           [-0.90882595,  2.05269608],

           [ 1.64356224,  8.96388503]])


    重点看下每个簇的协方差,这个是多维高斯分布的一个重要区别于一维的高斯分布之处,它是一个D by D (D表示数据的维数(特征数))的方阵,而不再是一个标量,


    #簇0的协方差矩阵

    sigmas[:,:,0]

    array([[ 0.27663524,  0.02760814],

           [ 0.02760814,  0.40283533]])


    #簇1的协方差矩阵

    sigmas[:,:,1]

    array([[ 1.62581999, -0.16528428],

           [-0.16528428,  1.29252665]])


    #簇2的协方差矩阵

    sigmas[:,:,2]

    array([[ 2.74381182,  0.02889155],

           [ 0.02889155,  4.21288365]])


    注意:

    1.多维高斯分布的协方差矩阵是对称矩阵

    2.主对角线上的元素为方差

    3. 非主对角线上的元素为两两特征间的相关系数



    04

    总结和展望

    至此,高斯混合模型从原理,到公式推导,再到编写完整代码借助EM算法求解,都完整的走了一遍,可以看到GMM模型的聚类特点,能给出样本点属于每个簇的概率,取概率最大的簇为所属簇。


    在最近几天的推送中,我们先后模拟了一维和两维的高斯分布的数据样本,实际上,我们已经实现的算法可以模拟更多维度的数据,因为假定了是D维,但是当维度很高时,我们往往不容易分析,计算效率慢,同时也容易发生奇异问题,尤其有几个维度具有强相关性时,那么应该怎么办呢?


    因此,当我们面对一堆样本由100维组成的数据时,学会如何提取出主要的特征,是非常重要的。本节描述的协方差矩阵将会大展身手,常用的算法是PCA降维,这通常是数据预处理的常用降维手法,通过降维,一来方便画图展示,二来也是去掉次要矛盾解决主要矛盾的过程。


    预知PCA降维的原理和操作过程,请看接下来的推送。


    640?wx_fmt=png

    请记住:每天一小步,日积月累一大步!


    0?wx_fmt=jpeg

    《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来!



    展开全文
  • 该方法把每一个多维数据看做一个多维向量,利用与向 量有关的范数对其中的数据进行排序,得到一个近似聚类族解。同理,对每一个近似聚类使用另一 个范数做进一步分解,求解多维数据模糊聚类的近似解。最后,对得到的每一...
  • C#下实现的基础K-MEANS多维聚类

    千次阅读 2018-01-25 20:11:59
    转自:... C#下实现的基础K-MEANS多维聚类 #本文PDF版下载  C#下实现的基础K-MEANS多维聚类PDF  #本文代码下载 基于K-Means的成绩聚类程序 前言 最近由于上C # 课的时候,老师提到了-我

    转自:http://www.cnblogs.com/lzxwalex/p/7708266.html

    C#下实现的基础K-MEANS多维聚类

    #本文PDF版下载 

    C#下实现的基础K-MEANS多维聚类PDF 

    #本文代码下载

    基于K-Means的成绩聚类程序

    前言

    最近由于上C # 课的时候,老师提到了-我们的课程成绩由几个部分组成.分别是「最终作品展示」「小组合作聊天记录评分」「组内成员匿名互评」「报告书评分」这四项综合评价.老师希望我能够通过这四个项目对所有同学进行聚类,然后根据离每簇的中心距离来评价最终的分数.由于我没有接触过这方面的算法,所以就选了实现较为方便并且直观的聚类方法K-MEANS.所以下文中就会对我这次学习到的一些心得进行分享.由于是C # 课程,所以本次的算法将以C# 为例子进行介绍.

     

    聚类&K-Means

    聚类

    百科上对于聚类的解释是这样的:
    将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异.
    简单的来说聚类就是将相似的归在一起产生一个簇,使不相似的分在不同的簇里.

    聚类和分类的区别

    分类:从特定的数据中根据人为打上的数据表浅进行数据挖掘,做出判断.是将类别已知.并且样本数据已经做了标记的数据进行归类.是一个有监督的过程.
    聚类:目的是分类数据,但是在分类结束前我们都不知道数据是怎么分类的,有什么特点,只是根据算法,自动的将相似性的分类在了一起.数据本身没有标记.本身也没有类别.通过聚类的算法将相似性高的数据通过算法打上的标签归类在一起.是一种无监督的过程.

     K-Means算法

    K-Means算法是基于距离(我在这次中使用了欧几里德距离)的聚类算法  ,  采用距离或者特征向量作为相似程度的考量,数据之间的距离/向量余弦越接近, 其相似度就越大.在K-Means聚类算法中-簇是由距离较为相近的数据对象构成的,故用K-Means算法的目的是想要得到数据对象相对紧凑且独立的不同簇.

     

    「评分系统」和K-Means的结合

    这次老师让我做的就是希望我能通过给出的「最终作品展示」「小组合作聊天记录评分」「组内成员匿名互评」「报告书评分」这四个维度的数据对所有同学的成绩使用K-Means聚成四个类,分别对应90-100/80-90/70-80/60-70/不及格这五个等第.分出登第后,五个类的中心分别是95/85/75/65/55,根据离数据中心的欧几里得距离按比例来决定最终的成绩.这就是老师让我实现的功能.

    K-Means的非适用性

    K-Means算法适应于连续形式的数据,由于数据的分布不同,有时候就无法分得准确的类,比如下面的两种形式

     

    1.非标准正态分布

    非标准正态分布

    K-Means用于表示聚类趋势只是说在数据符合正态分布或偏态不太严重时才是合理的.如果偏态严重,或者有异常的极大极小值,对均数影响很大,这时K-MEANS不能代表聚类的趋势.
    故在实际的样本中,我们作出的假设可能会并不适用,这个时候用基础的K-Means算法就不是特别的恰当了.这个时候我们就应该用到一些改进的算法,比如 Kernel K-means和Spectral Clustering.这两种算法会在后面的文章中进行介绍.

     

    2.非均匀分布

    非均匀分布

     

    由于分布的不均匀,疏密程度就会对中心的选取造成影响.就会偏向左侧较密的地方.如下所示:

    非均匀分布中心

    K-Means的优点和缺点

    优点:

    1. 算法简单并且效率很高,迭代次数.
    2. K-Means聚类算法的时间复杂度是O(nkt) {n数据量/k簇的个数/t算法迭代次数}故时间复杂度近似为线性.
    3. 自身具有优化迭代的特点,通过不断的计算中心来修正聚类结果.
    4. 对于数据有着很好的伸缩性.

     缺点:

    1. 需要指定K的值 我们在每次聚类之前需要指定数据会被分成几类即要有几个中心点.
    2. 对于离群值较为敏感 由于在每次聚类之后都要重新生成簇的中心.而中心是根据所有簇种数据对象的”质心”来的,所以当数据集不大的时候,这些离群的特殊点对中心就会产生很大的影响.这可以通过对数据集进行预处理,筛出离群的点.离群的点可以全部归类为第(k+1)类,因为它们本身有着非常独特的性质,是我们分析时候可以研究的对象.
    3. 初始点的选取对结果会产生影响 初始的点我们一般通过随机选定,但是随机选出的点可能点和点之间并不合理,会造成最终聚类的结果会不相同.
    4. 最终的聚类结果是一个球形的簇 由于使用了欧几里得距离,最终一定是以簇中心为球心(圆心)的一个球形(圆形)的簇.
    5. 维度对聚类结果的贡献无法得到 无法确定哪一个维度对聚类结果的产生的影响比较大.

    K-Means的一些细节

    欧几里德距离

    欧几里德距离简称欧式距离,是我们平时经常用到的一个距离度量公式,具体就是基础求距离公式,并且拓展至了n维空间.我们以三维空间举一个例子,如下图所示.A,B点根据欧几里得距离公式算出来的就是中间灰色线上方的距离公式

    欧几里德公式

    “质心”公式计算

     “质心”的选取是因为每一次聚类后都需要通过簇中的数据对象生成新的中心,而生成新中心的方式就是产生所有数据对象的”质心”.公式也可以拓展至n维,这里我们以3维的空间为例子

    质心计算公式

    A/B/C三个点的”质心”就是图中的灰点,坐标为((X1+X2+X3)/3),(Y1+Y2+Y3)/3,(Z1+Z2+Z3)/3)拓展到n维就是((X1+…+Xn)/n,…,((Z1+…Zn)/n)).

    K-Means算法实现步骤

    这里我们介绍的是K-Means算法的本身步骤,没有加上任何的优化方式,总共分为 5 步,分别如下:
    1. 首先,就像上文中说的一样.K-Means算法必须提供k即簇的树目.使我们能够通过聚类算法得到k个分组
    2. 从我们要进行聚类的数据集中随机选择k个点作为每个簇的初始中心
    3. 通过一定的计算方法(欧几里德距离)来计算每个数据对象距离每一个簇中心的距离.并且得到距离最近的簇的中心点,那么这个数据对象就被归类到了这个簇中.
    4. 当所有的点都被聚类后,对于每一个簇算出新的中心.(通过算法找到”质心”).
    5. 迭代3,4两个步骤,直到4步骤选出来的新中心和原来的中心小于某个我们默认的阈值(几乎中心不再发生变化),算法停止.我们已经通过聚类算法得到了我们最终的结果.

    接下来我们通过举例子的方法来更好的理解一下K-Means算法,我们随机生成了七个点,它们的位置即坐标如下图所示

    K-Means算法1

    很明显,我们如果有监督的将他们分类,那么结果一定是如下图所示的情况

    K-Means算法2

    那么我们按照K-Means算法的步骤,看一下聚类的过程是怎么样的.
    1.首先我们先随机选择两个点作为簇的中心,就选A1/B3这两个点

    K-Means算法3

    2.计算么个数据对象距离各个簇中心的距离
    对于A2 - 距A1的距离就是((1-2)^2 + (1-2)^2)^(1/2) = √2/距A2的距离就是((1-6)^2+(1-3)^2)^(1/2) = √29 由于√29>√2,所以A2被归类为以A1为中心的簇,同理,其他的点经过归类后的结果如下图所示:

    K-Means算法4

    3.重新计算每个簇的中心
    我们现在得到了两个簇,现在我们把每个簇里的数据对象的中心求出来,根据质心的求法,我们可以知道红色A组的新中心是((2+1+3)/3,(2+1+1)/3) = (2,4/3),棕色B组的新中心是((5+6+6+7)/4,(4+4+3+2)/4) = (6,3)这个时候我们发现B的中心就是B3这个点,所以对于B组而言不需要再次进行聚类了.
    对于A组我们可以发现,A1,A2,A3距离新的中心(2,4/3)相等,故再进行计算新中心的话中心也不会发生改变,所以聚类停止.
    4.最终的聚类结果就是A1/A2/A3一组.B1/B2/B3/B4一组.

    K-Means在C#下算法的实现

    (在这里我展示的是没有优化过的K-Means实现)

    1.首先是初始化中心.

    根据我们设定的簇的数量,我们可以随机从所有的数据对象中选择k个点作为初始的中心点.这里只需要使用Random类的Next方法即可,所以此步骤不进行介绍.

     2.聚类步骤的实现

    代码特点解释:
    1. 我的程序是先将数据从Excel的Xls文件中导出到了C#控件中的ListView里,这个控件的名字是:XlsDataSh,在程序的代码里可以看到这个控件的名字.
    2. 由于我们的Xls文件中并不是只有这四个项的数据,其中的其他几项是另外的一些信息,有着编号/姓名/学号姓息分别占了ListView的0/1/2这三列,而3-6这四个列分别是对应四个维度的.这就是为什么循环中经常会出现类似for (int k = 3; k < 7; k++)的原意.

    我们先来看一下聚类这个方法中的运行步骤,如下所示:

    聚类步骤流程图

    解释:
    1. ArrayList中存储的事每一个簇所拥有的数据的编号.所以当我们每一次重新计算出了簇的中心之后,会对数据所在的簇进行重新聚类,故首先我们要把ArrayList中所存储的数据进行清除.
    2. 判断簇为0是一个重要的步骤.这也是我“偷懒”了之后用的方法,由于我们的初始中心是随意选择的,所以很有可能选择的数据中心再一次聚类之后没有分得任何的数据点,这时候这个类就是无效的.我们应该对它进行处理,而我用的方法就是偷懒的让它再次随机选定中心,直到每个类都一定能分到其他的数据点.
    3. ClassNum - 设定的簇的数目.即k
    4. RowCount - 数据对象的个数.即n

    下面就是聚类方法中的代码:

    复制代码
    private void Cluster()
            {
                int tmpclass = 0;
                double tmpClusDis = 0, tmpClusMinDis = 0;
                //清除每一个簇里原来的项
                for (int i = 0; i < ClassNum; i++)
                {
                    ClusterAssem[i].Clear();
                }
    
                //进行欧几里德距离计算并聚类
                for (int i = 0; i < RowCount - 1; i++)
                {
                    tmpClusMinDis = vurMax;
                    for (int j = 0; j < ClassNum; j++)
                    {
                        tmpClusDis = 0;
                        //这里是取出每个维度的数据进行加和
                        for (int k = 3; k < 7; k++)
                        {
                            tmpClusDis += Math.Pow((System.Convert.ToDouble(XlsDataSh.Items[i].SubItems[k].Text) - CenterArrayParams[j, k - 3]), 2);
                        }
                        if (tmpClusDis < tmpClusMinDis)
                        {
                            tmpclass = j;
                            tmpClusMinDis = tmpClusDis;
                        }
                    }
                    ClusterAssem[tmpclass].Add(i);
                }
                //重新初始化
                if (ClusterAssem[0].Count == 0 || ClusterAssem[1].Count == 0 || ClusterAssem[2].Count == 0 || ClusterAssem[3].Count == 0 || ClusterAssem[4].Count == 0)
                {
                    InitCenter();//重新初始化中心的方法.
                    Cluster();
                }
            }
    复制代码

    3.重新生成每个簇的中心

    解释:
    ClusterAssem - 存储每一个簇中包含的数据对象ArrayList
    RenewCenterArrayParams - 存储每个簇中心的各个维度的ArrayList

    复制代码
    private void RenewCenter() {
                double tmpSameDis = 0;
    
                for (int i = 0; i < ClassNum; i++) {
                    for (int k = 3; k < 7; k++)
                    {
                        tmpSameDis = 0;
                        //遍历每个簇的点,求出中心点
                        foreach (object n in ClusterAssem[i]) {
                            tmpSameDis += System.Convert.ToDouble(XlsDataSh.Items[System.Convert.ToInt16(n)].SubItems[k].Text);
                        }
                        RenewCenterArrayParams[i, k - 3] = (tmpSameDis * 1.0 / (ClusterAssem[i].Count+1));
                    }
                }
            }
    复制代码

    4.计算结束的标记

    结束标志的意图就是当中心不再发生变化或小于一个阈值的时候就停止算法的进行了.
    解释:
    1. BalEndFlag:用于存储前一次的中心加和用于和本次进行比对

    复制代码
    private Boolean CalEndFlag() {
                double tmpDifferDis = 0, tmpSameDis = 0;
    
                for (int i = 0; i < ClassNum; i++) {
                    tmpSameDis = 0;
                    for (int j = 0; j < 4; j++) {
                        tmpSameDis += Math.Pow((RenewCenterArrayParams[i, j] - CenterArrayParams[i, j]),2);
                    }
                    tmpDifferDis += Math.Pow(tmpSameDis,1.0/2);
                }
                //判断中心点和前一次的偏移
                if ((BalEndFlag - tmpDifferDis) <= EndFlag) return false;
                else {
                   //算法没有结束,所以将新的中心赋给用于计算的ArrayList
                    for (int i = 0; i < ClassNum; i++) {
                        for (int j = 0; j < 4; j++) {
                            CenterArrayParams[i, j] = RenewCenterArrayParams[i, j];
                        }
                    }
                    BalEndFlag = tmpDifferDis;
                    tmpDifferDis = 0;
                    return true;
                }
            }
    复制代码

     结果展示

    下面就是我做的基于K—Means的自动聚类评分系统的界面.首先我们先看看有监督下的聚类是否符合预期,如下图所示:

    结果展示1

     

    我们通过上图的红色框中可以看出这个聚类的结果和我们的预期是十分的符合的.下面就是我通过随机的生成方法生成的数据,来观察K-Means算法在无监督下的运行结果.如下图所示:

    结果展示2

     

    以上就是本次探究的最终成果展示.

     K—Means的收敛性

    K-Means算法一定是收敛的,否则就会陷入一直寻找新的”质心”而没有最终的结果了.具体的证明步骤较为复杂.通过参考一些文章(会在下文中参考中标出)涉及到了E-M算法.将一个聚类问题转化为一个最大似然估计问题可证明K-Means是E-M算法的一个特例.在E-M算法下,求得的参数一定是收敛的.在K-Means算法中目标是使损失函数最小,所以在E-step时,找到一个最逼近目标的函数,在M-step时,固定这个函数(数据对象的分配),更新均值(簇的中心),所以最后一定会收敛了.

     基础K-Means算法的优化

    由于K-Means是非常成熟的算法,所以有很多先辈们改良了这个算法,在这里仅仅只是介绍在各个方面有哪些能够参考改进的方法.
    * 通过上文,我们可以知道.K-Means算法容易受到离群值的干扰.所以我们可以通过预处理比如「LOF算法」来先检测出离群点.单独处理这部分点.
    * K-Means的k值在没有指定的时候是很难选择的,这个时候,可以通过「k-Means算法的k值自适应优化方法」
    * 聚类的中心的选择.由于本文是随机选择初始的k个点,但是这是不合理的,应该是选择数据中距离尽可能远的K个点,这里也有一个算法「Canopy算法」
    * 现在有许多改进了的K-Means的算法,比较出名的有「K-means++」「ISODATA」「Kernel K-means」等,在后面的文章中我会进行分享.

    参考

    1.「K-Means算法的收敛性和如何快速收敛超大的KMeans? - 大数据躺过的坑 - 博客园」(传送门)(http://www.cnblogs.com/zlslch/p/6965209.html?utm_source=itdadao&utm_medium=referral)
    2.「请问如何用数学方法证明K-means是EM算法的特例?」(传送门)https://www.zhihu.com/question/49972233?sort=created

    展开全文
  • 我的数据是115*64维的,需要进行聚类操作,于是自己动手进行了实验,运用的是matlab语言,最后选取部分进行可视化展示,效果还不错。(代码注释完整)
  • 多维k-means聚类算法java简单实现,导入运行KmeansTest.java可看到结果 多维k-means聚类算法java简单实现,导入运行KmeansTest.java可看到结果
  • 使用octave编程的时候,一定要注意使用向量化编程的思想,下面我就说说我今天做题遇到的一个K-means聚类问题,如何使用octave中的函数向量计算聚类中心centroids。 octave几个函数:  bsxfun:  二元操作函数...

      使用octave编程的时候,一定要注意使用向量化编程的思想,下面我就说说我今天做题遇到的一个K-means聚类问题,如何使用octave中的函数向量计算聚类中心centroids。

     

    octave几个函数:

      bsxfun:

        二元操作函数,调用方式: bsxfun (F, A, B),A为 向量、二维矩阵或多维矩阵,B也为 向量、二维矩阵或多维矩阵,F为二元操作函数。如果 A 和 B 维度数不一样,或者 对应维度长度不一样,此函数会首先尝试把 A 和 B 都broadcast 到相同维度,且对应维度长度相同的两个向量。然后,再把A和B中一一的两个元素使用二元函数F做计算,返回的结果是与broadcast之后的A和B相同维度、对应维度相同长度的一个向量。

        例如:

          A = [1, 2, 3];  #这里A 可以看做是行向量

          B = [1, 2, 3];  #这里B 可以看做是行向量

          C = bsxfun(@plus, A, B);

          则 C = [2, 4, 6]

     

        因为它天生支持broadcast,所以如果必须要broadcast,系统不会产生 “warning: operator +: automatic broadcasting operation applied”

        警告。

     

        例如:

          A2 = A';  # 这里表示 撇号的作用就是求转置。即C是A向量的转置 ,即C是列向量。

          D = bsxfun(@plus, A2, B);

          则 D = [ 2, 3, 4,

                3, 4, 5,

                4, 5, 6] 

          解释:

            发现A2是3×1,B是1×3,于是将A2 broadcast 到3×3,其他两列拷贝第一列的值;B 也broadcast到3×3,

          其他两行拷贝第一行的值;接着,将A2与B对应位置的元素,进行plus操作,这里是求和操作,于是得到结果D。

     

      accumarray:

        分组计算函数,调用方式: accumarray (SUBS, VALS, SZ, FUNC, FILLVAL, ISSPARSE),SUBS为一个数组,

      其元素内容为新的数组下标值,VALS为一个数组,其元素为要进行操作的数值,缺省的动作是 sum 求和操作。

        例如:

          A = [1, 2, 3, 4]' #注意A为列向量

          B = [1, 2, 1, 2]' #注意B为列向量

          C = accumarray(B, A)

            则 C = [4, 6]' #注意C为列向量。

            解释:

              B的值对应分配到新的数组的对应下标,由于B(1) = B(3) = 2,于是A(1),A(3) 的值分到C(1),且缺省FUNC是求和操作,

            于是C(1)=A(1)+A(3) = 4,同理C(2) = A(2) + A(4) = 6

     

        accumarray函数调用,返回的结果是一维向量,如果想返回矩阵呢,那就必须用到下面的accumdim函数。

     

      accumdim:

        分组计算函数,调用方式:accumdim (SUBS, VALS, DIM, N, FUNC, FILLVAL)

        例如:

          A = [1, 1, 1; 2, 2, 2; 3, 3, 3; 4, 4, 4] #A为4×3矩阵

          B = [1, 2, 1, 2]' #B为列向量

          C = accumdim(B, A)

            则 C = [ 4, 4, 4; 6, 6, 6]  #2×3矩阵。

            解释,简单的说,就是将A矩阵中的行向量,按B下标分组,每组中的向量对应列求和,得到新的一个向量。

     

     

     

        假设,X为样本点矩阵,m×n,表示m个样本点,n个特征;idx为一维列向量,其值为m个样本点对应的聚类下标,取值(1..K),即K个聚类。

     centroids即为K个聚类中心,为K×n矩阵,每一行表示一个中心,第k行表示第k个聚类的中心。现在要求新的聚类中心。

    代码如下:

    position = unique(idx)
    
    cmeans = accumdim(idx, X, 1, 0, @mean)
    
    centroids(position, :) = cmeans
    

      

     

     

    转载于:https://www.cnblogs.com/simplelovecs/p/5137455.html

    展开全文
  • 聚类

    千次阅读 2013-08-16 15:19:20
    现在有一些数据需要做聚类处理。  那什么叫做聚类呢 跟分类有什么区别。 分类:明确知道类别,然后把数据归类。 聚类:你不知道类别,但你想把这些数据分成N类,根据某种算法把数据进行分组,相似或相近的自动...
  •   多维随机变量的相似性由相关系数阵 R\mathbf RR度量 R=[cov(xi,xj)σiiσjj]=[r11⋯r1p⋮⋮rp1⋯rpp]\mathbf R=\begin{bmatrix}\frac{cov(x_i,x_j)}{\sqrt{\sigma_{ii}}\sqrt{\sigma_{jj}}}\end{bmatrix}=\begin...
  • 一种新的矩形聚类算法

    千次阅读 2009-09-26 14:06:00
    一种新的矩形聚类算法 作者:陈玉进 李泉 聚类,是数据挖掘一种重要的手段,通常所见到的聚类,大都是多维向量点、基于距离的聚类算法,比如k-means、密度聚类等。本文所讨论的是扩展对象的聚类,与多维向量聚类...
  • 高维数据的聚类分析 高维聚类研究方向 高维数据聚类的难点在于:  1、适用于普通集合的聚类算法,在高维数据集合中效率极低  2、由于高维空间的稀疏性以及最近邻特性,高维的空间中基本不存在数据簇。 在高维...
  • 聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量(Measurement)的向量,或者是多维空间中的一个点。
  • 聚类学习

    2019-03-23 15:15:35
    聚类,无监督学习,将无标签样本分为几个簇,两个基本问题,性能度量和距离计算 聚类性能度量大致分为2类,外部指标:将聚类结果与某个“参考模型”进行比较;内部指标:直接考察聚类结果但是不利用任何参考模型。 ...
  • 聚类分析

    2015-04-14 14:08:51
    聚类思想聚类分析主要是基于在多维空间中,同类样本距离近,不同类的样本比同类之间得距离大。聚类需要解决的问题(1)如何衡量两个样本的相似度 (2)相似到什么程度归为一类问题(1)我们把每个样本看为一个多维...
  • 聚类算法Python代码

    2018-07-23 21:45:15
    聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量(Measurement)的向量,或者是多维空间中的一个点。 聚类分析以相似性为基础,在一个聚类中的模式之间比不在同一聚类中的模式之间具有更多...
  • 聚类算法

    千次阅读 2017-05-18 15:33:38
    聚类分析是典型的无监督学习算法,一般用于自动分类。  聚类分析是按照某个特定标准(通常是某种距离)把一个数据集分割成不同的类(Class),使得类内相似性尽可能的大,同时使得不同的类之间区别性也尽可能的大...
  • Python计算机视觉编程图像聚类(一)K-means 聚类1.1 SciPy 聚类包1.2 图像聚类1.1 在主成分上可视化图像1.1 像素聚类(二)层次聚类(三)谱聚类 图像聚类 (一)K-means 聚类 1.1 SciPy 聚类包 1.2 图像聚类 ...
  • 图像聚类-层次聚类

    万次阅读 热门讨论 2016-07-15 11:16:56
    最近做的一个东西跟这个相关,本来希望是...因此,比较容易想到,对于无标签又需要分类的图像数据,可以尝试先采用聚类来解决.   下面的内容是译自Jan Erik Solem的《Programming Computer Vision with Python》的第6
  • k-means聚类算法

    2020-04-26 10:06:39
    聚类(Cluster)分析是由若干模式(Pattern)组成的,通常,模式是一个度量(Measurement)的向量,或者是多维空间中的一个点。聚类分析以相似性为基础,在一个聚类中的模式之间比不在同一聚类中的模式之间具有更多的相似...
  • 文本聚类算法介绍

    万次阅读 热门讨论 2015-04-10 12:58:14
    本博客通过对当前比较成熟的聚类算法分析,介绍如何对非结构的数据(文档)做聚类算法;如何利用搜索引擎的相关知识来解决文本聚类问题等

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,416
精华内容 3,366
关键字:

多维向量聚类