文档章节

K-means算法

南寻
 南寻
发布于 2017/07/29 10:37
字数 674
阅读 7
收藏 0
点赞 0
评论 0

1. 归类: 

          聚类(clustering) 属于非监督学习 (unsupervised learning)

          无类别标记(class label)

2. 举例:

 

3. K-means 算法:

3.1 Clustering 中的经典算法,数据挖掘十大经典算法之一

3.2 算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。

3.3 算法思想:

    以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果

3.4 算法描述:         

          (1)适当选择c个类的初始中心;

          (2)在第k次迭代中,对任意一个样本,求其到c各中心的距离,将该样本归到距离最短的中心所在的类;

          (3)利用均值等方法更新该类的中心值;

          (4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。

 3.5 算法流程:

输入:k, data[n];

          (1) 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1];

          (2) 对于data[0]….data[n], 分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i;

          (3) 对于所有标记为i点,重新计算c[i]={ 所有标记为i的data[j]之和}/标记为i的个数;

          (4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值。

4. 举例:

5.算法优缺

优点:速度快,简单

缺点:最终结果跟初始点选择相关,容易陷入局部最优,需直到k值

6.代码实现如下

import numpy as np

def kmeans(x,k,maxIt):
    numPoints,numDim=x.shape

    dataSet=np.zeros((numPoints,numDim+1))
    dataSet[:,:-1]=x

    centroids=dataSet[np.random.randint(numPoints,size=k),:]
    # centroids=dataSet[0:2,:]

    centroids[:,-1]=range(1,k+1)

    iterations=0
    oldCentroids=None

    while not shouldStop(oldCentroids,centroids,iterations,maxIt):
        print("iteration:\n",iterations)
        print("dataSet:\n",dataSet)
        print("centroids:\n",centroids)

        oldCentroids=np.copy(centroids)
        iterations+=1

        updatelabels(dataSet,centroids)

        centroids=getCentroids(dataSet,k)
    
    return dataSet

def shouldStop(oldCentroids,centroids,iterations,maxIt):
    if iterations>maxIt:
        return True
    return np.array_equal(oldCentroids,centroids)

def updatelabels(dataSet,centroids):
    numPoints,numDim=dataSet.shape
    for i in range(0,numPoints):
        dataSet[i,-1]=getLabelFromCloseCentroid(dataSet[i,:-1],centroids)

def getLabelFromCloseCentroid(dataSetRow,centroids):
    label=centroids[0,-1];
    minDist=np.linalg.norm(dataSetRow-centroids[0,:-1])
    for i in range(1,centroids.shape[0]):
        dist=np.linalg.norm(dataSetRow-centroids[i,:-1])
        if dist < minDist:
            minDist=dist
            label=centroids[i,-1]
    
    print("minDist:",minDist)
    return label

def getCentroids(dataSet,k):
    result=np.zeros((k,dataSet.shape[1]))
    for i in range(1,k+1):
        oneCluster=dataSet[dataSet[:,-1]==i,:-1]
        result[i-1,:-1]=np.mean(oneCluster,axis=0)
        result[i-1,-1]=i
    return result

x1=np.array([1,1])
x2=np.array([2,1])
x3=np.array([4,3])
x4=np.array([5,4])
testX=np.vstack((x1,x2,x3,x4))

result=kmeans(testX,2,10)
print("result:\n" ,result)

 

 

© 著作权归作者所有

共有 人打赏支持
南寻
粉丝 60
博文 90
码字总数 35772
作品 0
朝阳
程序员

暂无相关文章

两道面试题,带你解析Java类加载机制

在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa{ static { System.out.println("爷爷在静态代码块"); }} cl...

1527 ⋅ 23分钟前 ⋅ 0

SpringCloud(Data Flow)

dataflow-server

赵-猛 ⋅ 33分钟前 ⋅ 0

深入理解Java虚拟机

这本书我读到第8章,之后就是在读不下去了。 读到后面是一种痛苦的体验,太多的东西是不全面的,大量的专有名词是没有解释的,读到最后很多东西仅仅是一个侧面,所以我觉得,这本书不适合初学...

颖伙虫 ⋅ 39分钟前 ⋅ 0

B树和B+树的总结

B树 为什么要B树 磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的...

浮躁的码农 ⋅ 42分钟前 ⋅ 0

NanoPi NEO core/ Ubuntu16.04单网卡配置3个IP地址(2个静态,1个动态)

配置 root@NanoPi-NEO-Core:/etc/network# cat interfacesauto loiface lo inet loopbackallow-hotplug eth0iface eth0 inet static address 172.31.188.249 netmask 255.......

SamXIAO ⋅ 今天 ⋅ 0

三步为你的App集成LivePhoto功能

摘要:LivePhoto是iOS9新推出的一种拍照方式,类似于拍摄Gif图或录制视频片段生成图片。如果没有画面感,可以联想《哈利波特》霍格沃茨城堡的壁画,哈哈,很炫酷有木有,但坑爹的是只有iphone6S以...

壹峰 ⋅ 今天 ⋅ 0

centos7 git安装

由于centos中的源仓库中git不是最新版本,需要进行源码安装。 1、查看yum仓库git信息 [root@iZm5e3d4r5i5ml889vh6esZ zh]# yum info gitLoaded plugins: fastestmirrorLoading mirror s...

xixingzhe ⋅ 今天 ⋅ 0

input file 重复上传同一张图片失效的解决办法

解决办法 方法一:来回切换input[type='file']的type属性值,可以是‘text’,'button','button'....,然后再切换回来‘file’ 方法二:每次取消图片预览后,重置input[type='file']的value的...

时刻在奔跑 ⋅ 今天 ⋅ 0

Mahout推荐算法API详解

前言 用Mahout来构建推荐系统,是一件既简单又困难的事情。简单是因为Mahout完整地封装了“协同过滤”算法,并实现了并行化,提供非常简单的API接口;困难是因为我们不了解算法细节,很难去根...

xiaomin0322 ⋅ 今天 ⋅ 0

WampServer默认web服务器根目录位置

安装WampServer之后的web服务器根目录默认位置在WampServer安装目录下的www:

临江仙卜算子 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部