文档章节

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)

 

 

© 著作权归作者所有

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

暂无文章

驼峰变量名的转换

package com.mmall.test;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 需求:1. 将字符串 user_name_abc 转换为 userNameAbc * 2. 将字符串 us......

蚂蚁-Declan
27分钟前
3
0
HTTP请求方法

根据HTTP标准,HTTP请求可以使用多种请求方法。 HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。 HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 序号 方...

踏破铁鞋无觅处
30分钟前
1
0
知识点043-selenium自动化测试网页工具的使用

【摘要】 Selenium是一个主要用于Web应用自动化测试的工具集合。但其作用不仅仅局限于测试领域,还可以用于浏览器行为模拟以及屏幕抓取等,在行业内有着广泛的应用。Selenium支持主流的浏览器...

侠客行之石头
37分钟前
1
0
B250F I219V安装windows server 网卡驱动

https://blog.csdn.net/ryu2003/article/details/50855146

梦想游戏人
37分钟前
1
0
MacOS Install Docker

使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker。 Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装: $ brew cask install dock...

Linux就该这么学
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部