文档章节

K-means算法

南寻
 南寻
发布于 2017/07/29 10:37
字数 674
阅读 7
收藏 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)

 

 

© 著作权归作者所有

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

暂无文章

OSChina 周五乱弹 —— 这就是不要女朋友的理由

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @狄安娜的猫 :分享丁家鑫的单曲《丁家鑫 - 克罗地亚狂想曲 - 古筝remix》 《丁家鑫 - 克罗地亚狂想曲 - 古筝remix》 手机党少年们想听歌,请...

小小编辑
22分钟前
124
6
CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
今天
5
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
4
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
5
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部