机器学习笔记-K-means算法

原创 2016年05月31日 15:26:51

写个python小程序复习一遍K-means算法,算法本身思想很简单,下面这篇文章介绍的很详细。http://home.deib.polimi.it/matteucc/Clustering/tutorial_html/kmeans.html

一、算法主函数

给定一个n维的向量集合points,将其划分为k个类别,采用闵氏距离作为两点之间距离的判定方法,算法参数就有三个:

1、points:向量集合

2、kcentroids:初始k个类别的质心位置的集合

3、p:闵氏距离的计算参数,1就是manhattan距离,2就是欧式距离

返回值是分好类的二维数组,行数为k,表示k个类别,每一行内的元素是int类型,表示向量数据在points中的下标,从0开始

主算法代码如下:

def alg_kmeans(points, kcentroids, p):
    assert(len(points) > 1);
    assert(len(kcentroids) > 1);
    assert(len(points[0]) == len(kcentroids[0]));

    k = len(kcentroids);
    # centroids for clusters, each centroid is a vector
    centroids = kcentroids;
    # clusters, set of point's index
    c1 = [[] for row in range(k)];
    c2 = [[] for row in range(k)];

    change = True;
    while change:
        change = False;
        # cluster once
        c2 = PointstoCluster(points, centroids, p);
        # if cluster change
        change = (cmp(c1,c2) != 0);
        # if not change, do again
        if change:
            c1 = c2;
            # recalculate cluster centroids
            centroids = RecalculateCentroids(points, centroids, c2);
    return c2;

主循环中每一轮计算,都会根据k个质心计算出分类的数据集合,将其保存在主算法中定义的二维数组c2中,c1为上一轮计算结果,c1与c2相同则表示算法结束。

二、计算函数

每一轮计算的函数参数与主函数相同,这是第二个参数质心集合是每一轮的计算结果,代码如下:

def PointstoCluster(points, kcentroids, p):
    assert(len(points) > 1);
    assert(len(kcentroids) > 1);
    assert(len(points[0]) == len(kcentroids[0]));

    k = len(kcentroids);
    clusters = [[] for i in range(k)];
    
    for i in range(len(points)):
        # cal distance to each centroid
        mindis = sys.float_info.max;
        point = points[i];
        clusteridx = -1;
        for j in range(0, k):
            dis = dis_minkowski(point, kcentroids[j], p);
            if dis < mindis:
                clusteridx = j;
                mindis = dis;
        clusters[clusteridx].append(i);

    return clusters;
函数遍历所有向量数据,每一个向量均计算与各个质心之间的距离,取最近距离质心的类别作为其归属分类。

三、质心计算函数
每一轮计算过后,都要重新计算每个分类的质心,函数需要参数参数:

1、points:同上

2、k:类别数目

3、clusters:PointstoCluster的返回值

代码如下:

def RecalculateCentroids(points, k, clusters):
    assert(len(points) > 1);
    assert(k > 1);

    dimention = len(points[0]);
    centroids = [[0 for d in range(dimention)] for row in range(k)];
    for i in range(k):
        if len(clusters[i]) == 0:
            continue;
        for d in range(0, dimention):
            centroids[i][d] = 0;
            for pidx in clusters[i]:
                centroids[i][d] += points[pidx][d];
            centroids[i][d] /= len(clusters[i]);
    return centroids;

算法较为简单,对于某一个类别内的所有数据,取其内所有向量,对每个维度取平均值。

四、效果

为验证效果,另外写了一个壳程序,维度取2(平面),p取2(欧式距离),随机生成1000个点,分为5类,结果图示如下。


代码的github地址:https://github.com/wsxwang/ML-practise.git


机器学习笔记-聚类分析之K-means算法案例及其Python实现

引言: 数据挖掘的本质是“计算机根据已有的数据做出决策”,其对社会的价值不必多言,相关的应用已经有很多,包括垃圾邮件拦截、客户价值分析等。 尽管数据挖掘实现过程的细节千差万别,但是从思路来...
  • lilu916
  • lilu916
  • 2017年06月10日 17:46
  • 634

机器学习(十一):K-Means算法

1. K-Means1.1 核函数的另一种观点之前我们提到过高斯核函数:K(x1,x2)=ϕ(x1)ϕ(x2)=exp(η||x1−x2||2)K(x_1,x_2)=\phi(x_1)\phi(x_2...

机器学习之k-means算法

K-means(k均值) 一、算法分析 K-means(k均值)是基于数据划分的无监督聚类算法,是数据挖掘领域的十大算法之一。样本集预先不知所属类别或标签,需要根据样本之间的距离或相似度来自动进行分类...

斯坦福大学机器学习——K-means算法

k-means通过设置重心和移动中心两个简答的步骤,就实现了数据的聚类。下面就来介绍下k-means算法。 一、   数值属性距离度量 度量数值属性相似度最简单的方法就是计算不同数值间的“距离”,如果...

机器学习--物以类聚(k-means算法)

k-means算法是无监督学习算法,没有标签值,通过自身分析自身的数据,自己进行分类。 此次实现参考了其他博客的实现。 k-means中k的意思表示的是分类数目。 数据集下载地址:链接:http://...
  • Enche
  • Enche
  • 2017年11月17日 21:45
  • 45

机器学习之K-means算法(Python描述)基础

Python 2.7 IDE Pycharm 5.0.3 numpy 1.11.0 matplotlib 1.5.1可以扩展阅读: 1.(大)数据处理:从txt到数据可视化 2.机器学习之K...

机器学习实战ByMatlab(三)K-means算法

K-means算法属于无监督学习聚类算法,其计算步骤还是挺简单的,思想也挺容易理解,而且还可以在思想中体会到EM算法的思想。K-means 算法的优缺点: 1.优点:容易实现 2.缺点:可能...
  • llp1992
  • llp1992
  • 2015年04月17日 13:31
  • 5293

机器学习实战ByMatlab(四)二分K-means算法

前面我们在是实现K-means算法的时候,提到了它本身存在的缺陷: 1.可能收敛到局部最小值 2.在大规模数据集上收敛较慢 对于上一篇博文最后说的,当陷入局部最小值的时候,处理方法就是多运...

机器学习之K-means算法

K-means也是聚类算法中最简单的一种了,但是里面包含的思想却是不一般。最早我使用并实现这个算法是在学习韩爷爷那本数据挖掘的书中,那本书比较注重应用。看了Andrew Ng的这个讲义后才有些明白K-...

【机器学习】K-Means算法

1.引言有人认为k-means算法是由J.B.MacQueen在1967年提出的,也有人认为k-means聚类算法是由Steinhaus(1955)、Lloyd(1957)、Ball和Hall(196...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:机器学习笔记-K-means算法
举报原因:
原因补充:

(最多只允许输入30个字)