热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

机器学习面试必知:K均值聚类

假设我们有一个数据集{x1,,xN}\left\{x_{1},,x_{N}\right\}{x1​,,xN​},它由D维欧几里得空间中的随机变量xx

假设我们有一个数据集{x1,...,xN}\left\{x_{1},...,x_{N} \right\}{x1,...,xN},它由D维欧几里得空间中的随机变量xxxNNN次观测组成。引入一组DDD维向量uk,k=1,...,Ku_{k},k=1,...,Kuk,k=1,...,K,对于每个数据点xnx_{n}xn,我们引入一组对应的二值指示向量rnk∈{0,1}r_{nk}\in \left\{0,1 \right\}rnk{0,1},只有当xnx_{n}xn被分配到uku_{k}uk中,rnk=1r_{nk}=1rnk=1。那么很容易地我们就得到了这样一个目标函数又是也会被称为目标度量J=∑n=1N∑k=1Krnk∣∣xn−uk∣∣2J=\sum_{n=1}^{N}\sum_{k=1}^{K}r_{nk}||x_{n}-u_{k}||^{2}J=n=1Nk=1Krnkxnuk2它表示每个数据点与它被分配的向量uku_{k}uk之间的距离的平方和。我们可以用迭代的方法来最小化这个目标函数。


  1. 我们初始化uku_{k}uk
  2. 保持uku_{k}uk不变,我们改变rnkr_{nk}rnk来最小化JJJ
  3. 保持rnkr_{nk}rnk不变,我们改变uku_{k}uk来最小化JJJ
  4. 不断重复2,3步骤直到收敛

整体来看,更新rnkr_{nk}rnk和更新uku_{k}uk的两个阶段分别对应于EM算法中的E(期望)步骤和M(最大化)步骤。
先来看第二步,很好理解,通俗易懂的来说就是把xnx_{n}xn分配到离它最近的uku_{k}uk上。从公式上看也很好理解,JJJrnkr_{nk}rnk的一个线性函数,求其求导得到∣∣xn−uk∣∣2||x_{n}-u_{k}||^{2}xnuk2。也就是说我们要对每个xnx_{n}xn分配到离它最近的uku_{k}uk上,这样才能使∣∣xn−uk∣∣2||x_{n}-u_{k}||^{2}xnuk2最小。用公式可以这样表示rnk={1ifk=argminj∣∣xn−uj∣∣20otherwiser_{nk}=\left\{\begin{matrix} 1 \qquad if \quad k=arg \ min_{j}||x_{n}-u_{j}||^{2}\\0 \qquad otherwise \qquad \qquad\quad\quad\quad\quad \end{matrix}\right.rnk={1ifk=arg minjxnuj20otherwise再来看第三步,对uku_{k}uk求导=0即∑n=1Nrnk(xn−uk)=0\sum_{n=1}^{N}r_{nk}(x_{n}-u_{k})=0n=1Nrnk(xnuk)=0uk=∑nrnkxn∑nrnku_{k}=\frac{\sum_{n}r_{nk}x_{n}}{\sum_{n}r_{nk}}uk=nrnknrnkxn这个结果也个简单的含义即令uku_{k}uk等于类别kkk中所有数据点的均值。


python代码如下

import numpy as np
import matplotlib.pyplot as pltx=1+np.random.randn(20,1)
y=2+np.random.randn(20,1)
z1=np.concatenate((x,y),axis=1)
x=-3-np.random.randn(20,1)
y=1+np.random.randn(20,1)
z2=np.concatenate((x,y),axis=1)
x=-4-np.random.randn(20,1)
y=-6-np.random.randn(20,1)
z3=np.concatenate((x,y),axis=1)
x=1+np.random.randn(20,1)
y=-4-np.random.randn(20,1)
z4=np.concatenate((x,y),axis=1)
z=np.concatenate((z1,z2,z3,z4),axis=0)
z5=z.T
plt.scatter(z5[0],z5[1])
plt.show() def distEclud(vecA,vecB):return np.sqrt(np.sum(np.power(vecA-vecB,2)))
def Randcenter(dataset,k):data=dataset.Tn=dataset.shape[1]centoids=np.mat(np.zeros((k,n)))xmax,xmin=max(data[0]),min(data[0])ymax,ymin=max(data[1]),min(data[1])dx,dy=(xmax-xmin)/(k+1),(ymax-ymin)/(k+1)for i in range(k):centoids[i,0]=xmin+dx*(i+1)centoids[i,1]=ymin+dy*(i+1)return centoids
def KMeans(dataset,k,distMeans&#61;distEclud,creatCen&#61;Randcenter):m&#61;dataset.shape[0]n&#61;dataset.shape[1]clusterAssment &#61; np.mat(np.zeros((m,1)))centoids&#61;creatCen(dataset,k)flag&#61;Truecount&#61;0while flag:count&#43;&#61;1print(&#39;第%d次迭代&#39;%count)flag&#61;Falseclusternum&#61;np.mat(np.zeros((k,1)))newcentoids&#61;np.mat(np.zeros((k,n)))for i in range(m):minDist&#61;np.infminIndex&#61;-1for j in range(k):temp_dist&#61;distMeans(centoids[j],dataset[i])if temp_dist<minDist:minDist&#61;temp_distminIndex&#61;jclusterAssment[i]&#61;minIndexnewcentoids[minIndex]&#43;&#61;dataset[i]clusternum[minIndex]&#43;&#61;1print(centoids)for cnt in range(k):newcentoids[cnt]/&#61;clusternum[cnt]if distMeans(centoids[cnt],newcentoids[cnt])>1e-10:flag&#61;Truecentoids&#61;newcentoidsreturn newcentoids,clusterAssmentcenters,asse&#61;KMeans(z,4)

推荐阅读
  • Python教学练习二Python1-12练习二一、判断季节用户输入月份,判断这个月是哪个季节?3,4,5月----春 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
author-avatar
mobiledu2502931637
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有