博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
k-means 聚类算法
阅读量:6230 次
发布时间:2019-06-21

本文共 2455 字,大约阅读时间需要 8 分钟。

聚类

聚类主要内容是将样本进行归类,同种类别的样本放到一起,所有样本最终会形成K个簇,它属于无监督学习。

核心思想

根据给定的K值和K个初始质心将样本中每个点都分到距离最近的类簇中,当所有点分配完后根据每个类簇的所有点重新计算质心,一般是通过平均值计算,然后再将每个点分到距离最近的新类簇中,不断循环此操作,直到质心不再变化或达到一定的迭代次数。数学上可以证明k-means是收敛的。

伪代码

随机选择k个质心,即为簇数while(true){ 计算每个点到最近距离的质心,归为该类。 重新计算每个类的质心。 if(质心与上一次质心一样or达到最大迭代次数)   break;}复制代码

缺点

  1. 需要事先确定类簇的数量。
  2. 质心的选取会影响最终的聚类结果。

代码实现

from numpy import *import matplotlib.pyplot as pltfrom sklearn.cluster import KMeansdef kmeans(dataSet, k):    sampleNum, col = dataSet.shape    cluster = mat(zeros((sampleNum, 2)))    centroids = zeros((k, col))    ##choose centroids    for i in range(k):        index = int(random.uniform(0, sampleNum))        centroids[i, :] = dataSet[index, :]    clusterChanged = True    while clusterChanged:        clusterChanged = False        for i in range(sampleNum):            minDist = sqrt(sum(power(centroids[0, :] - dataSet[i, :], 2)))            minIndex = 0            for j in range(1,k):                distance = sqrt(sum(power(centroids[j, :] - dataSet[i, :], 2)))                if distance < minDist:                    minDist  = distance                    minIndex = j            if cluster[i, 0] != minIndex:                clusterChanged = True                cluster[i, :] = minIndex, minDist**2        for j in range(k):            pointsInCluster = dataSet[nonzero(cluster[:, 0].A == j)[0]]            centroids[j, :] = mean(pointsInCluster, axis = 0)    return centroids, clusterdataSet = [[1,1],[3,1],[1,4],[2,5],[11,12],[14,11],[13,12],[11,16],[17,12],[28,10],[26,15],[27,13],[28,11],[29,15]]dataSet = mat(dataSet)k = 3centroids, cluster = kmeans(dataSet, k)sampleNum, col = dataSet.shapemark = ['or', 'ob', 'og']for i in range(sampleNum):    markIndex = int(cluster[i, 0])    plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])mark = ['+r', '+b', '+g']for i in range(k):    plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize=12)plt.show()复制代码

结果:

这里写图片描述

直接用机器学习库更加方便

from numpy import *import matplotlib.pyplot as pltfrom sklearn.cluster import KMeansdataSet = [[1,1],[3,1],[1,4],[2,5],[11,12],[14,11],[13,12],[11,16],[17,12],[28,10],[26,15],[27,13],[28,11],[29,15]]dataSet=mat(dataSet)k = 3markers = ['^', 'o', 'x']cls =KMeans(k).fit(dataSet)for i in range(k):    members=cls.labels_==i    plt.scatter(dataSet[members,0],dataSet[members,1],marker=markers[i])plt.show()复制代码

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 进行预定。感谢各位朋友。

=========================

欢迎关注:

这里写图片描述

转载地址:http://ucxna.baihongyu.com/

你可能感兴趣的文章
从零开始搭建一个简单的基于webpack的vue开发环境
查看>>
【功能盘点】升级后的媒体处理MPS有哪些能力?
查看>>
【iOS 印象】Swift 中值类型与引用类型指北
查看>>
python-path配置问题解决
查看>>
创建使用 framework和 a静态库
查看>>
最好的Linux发行版
查看>>
利用AudioContext来实现网易云音乐的鲸鱼音效
查看>>
JS原型与原型链总结篇
查看>>
react学习笔记二----nodejs服务器搭建及异常处理
查看>>
开了香槟的Kubernetes并不打算放慢成功的脚步
查看>>
关于Mac 下 Charles的使用 以及碰到无法抓包的问题
查看>>
7月份前端资源分享
查看>>
搜狗手机助手联合腾讯御安全 共建APP安全生态环境
查看>>
Codeigniter 4.0-dev 版源码学习笔记之五——相对于 3.x 的变化
查看>>
(译 & 转载) 2016 JavaScript 后起之秀
查看>>
GB(一)
查看>>
方面和服务,差别大吗?
查看>>
Infor喜获中国智能制造与电商物流大奖
查看>>
瑞士科学家研发飞行夹克,用户可以像鸟一样任意飞翔
查看>>
互金启示录:流量思维的末路
查看>>