kmeans算法详解和python代码实现

kmeans算法

无监督学习和监督学习

监督学习:

是通过已知类别的样本分类器的参数,来达到所要求性能的过程

简单来说,就是让计算机去学习我们已经创建好了的分类模型

像作者之前提到过朴素贝叶斯算法 ,就是一种监督学习。

无监督学习:

指根据类别未知(没有被标记)的训练样本解决模式识别中的各种问题的过程

简单来说就是不知道分类的前提下,让计算机进行学习做事情

其中有个重要的分类就是基于样本相似度的简单聚类方法,而kmeans算法就是其中的代表之一

kmeans算法的理解

有个著名的牧师,村民模型可以用来很好的理解kmeans:

有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的村民,于是每个村民到离自己家最近的布道点去听课。

听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的村民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。

牧师每一次移动不可能离所有人都更近,有的人发现A牧师移动以后自己还不如去B牧师处听课更近,于是每个村民又去了离自己最近的布道点……

就这样,牧师每个礼拜更新自己的位置,村民根据自己的情况选择布道点,最终稳定了下来。

kmeans 算法的流程

样本点x[n] #可以理解成村民居住的位置
随机选取k个点means[k]  #可以理解成牧师随机选取的点
while(t) :#终止条件for i in n :for j in k :计算每一个样本点和每一个聚类点的代价   #就是牧师和村民的距离for j in k :计算每一个样本代价最低的聚类点,并进行归类             #有哪些村民是属于我的修改聚类点的位置为所在簇中心点的位置                  #重新规划聚类点
end

python代码实现

在实现之前 有一个问题,我们会发现聚类的结果和k息息相关,但是我们没办法事先知道k的取值,k太小显然分类结果不够友好,k太大又会导致过度分类,和过拟合一样,也不是一件好事,那么如何选取一个合适的k就是重中之重。

鉴于初学者本文采用最简单的手肘法,方法如下:
SSE(sum of the square errors,误差平方和)

其中Ci为dii个簇,mi为第i个质心,p为属于Ci的数据点。
SSE代表了聚类效果。

def findk(data):# 确定k值k = np.arange(1, 11)ja = []for i in k:model = KMeans(n_clusters=i)model.fit(data)ja.append(model.inertia_)# 给这几个点施加标记plt.annotate(str(i), (i, model.inertia_))plt.plot(k, ja)plt.show()# 经确定,k=4k = 4

结果如上,所以k取4

函数体属下所示

if __name__ == '__main__':file = open("testSet.txt", 'r')data = []while (True):dataline = file.readline()if not dataline:breakdataline = dataline.split()data.append([float(dataline[0]), float(dataline[1])])  # 这里是二维数组,可以根据需要自行修改data = np.array(data)findk(data)means, label = kmean(data, 4)                              #训练plt.figure()for j in range(4):x, y = getallmenas(j, data, label)                    #按照不同类别进行画图plt.scatter(x=x, y=y, marker='o', cmap=plt.cm.Paired)plt.scatter(means[:,0],means[:,1],marker='*',s=80)       #画出各个聚点中心的位置plt.show()

结果如上图所示:

其余代码如下:

# kmeans.py
import randomimport numpy as np
import matplotlib.pylab as pltfrom sklearn.cluster import KMeans# 计算两点距离
def distance(a, b):return np.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2)def kmean(data, k):n, m = np.shape(data)means = np.zeros((k, m))temp = random.sample(range(n), k)  # 随机选取k个点作为初始点for i in range(k):mean = data[temp[i]]means[i] = meanlabel = np.zeros(n)  # 分类结果con = Truefor x in range(10):           #此处可以换成所需要的终止条件oldmeans = np.copy(means)for i in range(n):disline = np.zeros(k)for j in range(k):dis = distance(data[i], means[j])disline[j] = dislabel[i] = np.argmin(disline)for j in range(k):means[j] = np.mean(data[label == j], axis=0)return means, label#获取同类型的点的x,y坐标
def getallmenas(k, data, label):thedata = data[label == k]xlist = np.zeros(len(thedata))ylist = np.zeros(len(thedata))for i in range(len(thedata)):xlist[i] = thedata[i][0]ylist[i] = thedata[i][1]return xlist, ylist

以上为全部内容。

kmeans算法详解和python代码实现相关推荐

  1. K-means算法详解及python代码实现

    K-means算法 算法步骤 对数据的要求 算法的优缺点 算法需要注意的点 算法实现(python)(待更.......) 算法步骤 1.随机选取K个点作为初始聚类中心 2.计算各个数据到个聚类中心的 ...

  2. k-means算法详解及python代码

    K-means算法原理 K-means聚类属于原型聚类(基于原型的聚类,prototype-based clustering).原型聚类算法假设聚类结构能够通过一组原型进行刻画,在现实聚类任务中极为常 ...

  3. 编辑距离算法详解和python代码

    编辑距离(Levenshtein Distance)算法详解和python代码 最近做NLP用到了编辑距离,网上学习了很多,看到很多博客写的有问题,这里做一个编辑距离的算法介绍,步骤和多种python ...

  4. 敏感词或关键词过滤,DFA算法详解及python代码实现

    一.前言 近期项目有了一个过滤敏感词的功能需求,在网上找了一些方法及解说,发现DFA算法比较好用,容易实现,但很多文章解释得不太清楚,这里将其详细描述,并用python代码实现. 二.DFA算法详解 ...

  5. python机器学习算法.mobi_机器学习之ID3算法详解及python代码实现

    在生活中我们经常会用到决策树算法,最简单的就是二叉树了:相信大家也会又同样的困扰,手机经常收到各种短信,其中不乏很多垃圾短信.此时只要设置这类短信为垃圾短信手机就会自动进行屏蔽.减少被骚扰的次数,同时 ...

  6. python决策树 value_机器学习之ID3算法详解及python代码实现

    在生活中我们经常会用到决策树算法,最简单的就是二叉树了:相信大家也会又同样的困扰,手机经常收到各种短信,其中不乏很多垃圾短信.此时只要设置这类短信为垃圾短信手机就会自动进行屏蔽.减少被骚扰的次数,同时 ...

  7. 朴素贝叶斯算法详解及python代码实现

    朴素贝叶斯算法 算法原理 对数据的要求 算法的优缺点 算法需要注意的点 算法实现(python)(待更.......) 算法原理 P(Ck∣xi)=p(xi∣ck)∗p(ck)p(xi)=p(x1∣c ...

  8. python直线拟合_RANSAC算法详解(附Python拟合直线模型代码)

    之前只是简单了解RANSAC模型,知道它是干什么的.然后今天有个课程设计的报告,上去讲了一下RANSAC,感觉这个东西也没那么复杂,所以今天就总结一些RASAC并用Python实现一下直线拟合. RA ...

  9. RRT(Rapidly-Exploring Random Trees)算法详解及python实现

    RRT(Rapidly-Exploring Random Trees)算法详解及python实现 前言 一.原理 二.伪代码 三.代码详解 总结 前言 快速探索随机树(RRT):作为一种随机数据结构, ...

最新文章

  1. 2022-2028年中国模胚行业市场研究及前瞻分析报告
  2. C++编译器Qt Creator下载地址
  3. 笔记工具这么多,但这款有点不一样
  4. 轻松学习Linux之自动执行任务
  5. java engine_java使用OGEngine开发2048
  6. linux查询.gz日志,linux2-查日志
  7. 台式计算机哪款好,台式一体机电脑哪款好
  8. JAVA中实用的一个工具类--Hutool
  9. nodejs 端口被占解决
  10. 高性能MySQL(第2版)中文版pdf
  11. [C#]六十甲子纳音WM版 v2.1 By:LESLIE
  12. hbase解决海量图片存储
  13. 聚合数据左磊:不走寻常路 做国内最好的数据聚合平台
  14. no moudle named dlib
  15. 容器化技术(Docker相关)
  16. qrcode生成一个带有图片的二维码
  17. 现代轻奢风格装修讲解
  18. SIMULINK rlc电路仿真
  19. Python:数的分解
  20. 计算机考研复试【面试真题】

热门文章

  1. 【UNCTF】逆向WriteUp以及出题笔记
  2. 关于 IEEE PDF Checker无法嵌入字体等问题(Font ArialMT is not embedded) 已解决
  3. 微信公众号清除缓存方法
  4. 前端实现弹幕代码分享
  5. 无心插柳——ZUN和“东方Project”对游戏女性角色设计的影响
  6. Excel中HLOOKUP函数的用法
  7. 史上最全的iOS各种设备信息获取总结
  8. uni-app混合开发 navigateTo、reLaunch、redirectTo、switchTab区别
  9. error Component name “xxx“ should always be multi-word vue/multi-word-comp
  10. [实用技能] 安装程序双击无反应,重新下载也没用怎么办?