K-Means

  • K-Means

    • 先来看看相似度/距离的计算方法
    • K-Means算法详解
    • K-Means算法实现总结:

先来看看相似度/距离的计算方法

闽可夫斯基距离(Minkowski)/欧式距离(p=2) :

dist(X,Y)=(∑i=1n∣∣xi−yi∣∣p)1pdist(X,Y)=(∑i=1n|xi−yi|p)1p

\mathit{dist(X,Y) = \left ( \sum_{i=1}^{n} \left |x^{i}-y^{i} \right |^{p}\right )^{\frac{1}{p}} }

杰卡德相似系数(Jaccard):

J(a,b)=A∩BA∪BJ(a,b)=A∩BA∪B

\mathit{J\left ( a,b \right ) = \frac{A\cap B }{A\cup B}}

余弦相似度(cosine similarity )

cos(θ)=aTb|a||b|cos⁡(θ)=aTb|a||b|

\mathit{\cos(\theta ) = \frac{a^{T}b}{\left | a \right |\left | b \right |} }

Pearson相似系数

ρXY=cov(X,Y))σxσY=E[(X−μX)(Y−μY)]σxσY=∑ni=1(X−μX)(X−μY)∑ni=1(X−μX)2−−−−−−−−−−−−√∑ni=1(X−μX)2−−−−−−−−−−−−√ρXY=cov(X,Y))σxσY=E[(X−μX)(Y−μY)]σxσY=∑i=1n(X−μX)(X−μY)∑i=1n(X−μX)2∑i=1n(X−μX)2

\mathit{\rho _{XY} = \frac{cov(X,Y))}{\sigma _{x} \sigma_{Y}}=\frac{E[(X-\mu_X )(Y-\mu_Y)]}{\sigma _{x} \sigma_{Y}}= \frac{\sum_{i=1}^{n} (X-\mu_X)(X-\mu_Y)}{\sqrt{\sum_{i=1}^{n} (X-\mu_X)^{2}}\sqrt{\sum_{i=1}^{n} (X-\mu_X)^{2}}}}

相对熵(K-L距离)

D(p||q)=∑xp(x)logp(x)q(x)=Ep(x)logp(x)q(x)D(p||q)=∑xp(x)logp(x)q(x)=Ep(x)logp(x)q(x)

\mathit{D(p||q) = \sum_{x}p(x)log\frac{p(x)}{q(x)} =E_{p(x)}log\frac{p(x)}{q(x)} }


K-Means算法详解

K-Means算法,即k-均值算法,是一种广泛使用的聚类算法。


基本思想


对一个给定的含有N个对象的数据集,构造数据的k个簇,k≤Nk≤N\mathit{k\leq N} 。

首先给定k,给出初始划分,通过迭代改变样本和簇的隶属关系,使得每一次改进之后的划分方案都比前一次好。

伪代码

创建k个点作为起始质心(经常是随机选择)
当任意一个点的簇分配结果发生改变时对数据集中的每个数据点对每个质心计算质心与数据点之间的距离将数据点分配到距离最近的簇对每一个簇,计算簇中所有点的均值作为质心

python代码实现
数据与代码来源于:《机器学习实战》

from numpy import *
import random
from matplotlib import pyplot as pltdef loadData(fileName):data = []with open(fileName) as fr:for line in fr.readlines():lines = line.strip().split('\t')L = list(map(float, lines)) #注意与书中的不同data.append(L)return mat(data)# 欧式距离计算
def distEclud(vecA,vecB):return sqrt(sum(square(vecA-vecB)))# 构建随机质心
def randCent(data,k):m,n = shape(data)centroids = mat(zeros((k,n)))for i in range(k):for j in range(n):minJ = min(data[:, j])  # 找出每列中最小的值rangeJ = float(max(data[:, j]) - minJ)  # 找出每一列的范围值centroids[(i,j)] = mat(minJ + rangeJ * random.random())return centroidsdef k_Means(data,k):m,n = shape(data) # 每一行为一个simple,共有n个样本# 初始化一个矩阵来存储每个点的簇分配结果 ## 一列记录簇索引值,第二列存储误差(误差是指当前点到簇质心的距离,后面会使用该误差来评价聚类的效果)clusterAssemt = mat(zeros((m,2)))centroids = randCent(data,k)clusterChanged = Truewhile clusterChanged:clusterChanged = Falsefor i in range(m):minDist = infminIndex = 0for j in range(k):distJI = distEclud(centroids[j,:],data[i,:]) #采用欧式距离if distJI < minDist:minDist = distJIminIndex = j# 找到每个样本最近距离的质点if clusterAssemt[i,0] != minIndex:clusterChanged = TrueclusterAssemt[i,:] = minIndex, minDist **2for cent in range(k):ptsInClust = data[nonzero(clusterAssemt[:,0].A == cent)[0]]centroids[cent,:] = mean(ptsInClust,axis=0)return centroids,clusterAssemtif __name__ == '__main__':# data = loadData('testSet.txt')data = loadData('testSet2.txt')fig = plt.figure()p1 = plt.scatter(data[:, 0].flatten().A[0], data[:, 1].flatten().A[0], marker='o')myCentroids, clustAssing = k_Means(data,3)print(myCentroids)print(clustAssing)p2 = plt.scatter(myCentroids[:,0].flatten().A[0],myCentroids[:,1].flatten().A[0], marker='x', edgecolors='r')plt.show()

上述代码运行后,得到的图如下:

K-Means算法实现总结:

1、python版本的差异
我使用的是python3.x,书中的代码是python2

2、计算欧式距离时,无法使用pow(x,2)函数,报错为数据维数不符合。而改用直接用是sqart()
具体原因:未知。欢迎拍砖!

3、random.rand(k,1)这个也是无法使用。报错为:
random中无rand模块。我dir了一下,python3中确实没有。不知道是不是2和3的差异。要想在3中使用,只能用numpy模块中的rand模块了。
因此我相应的把代码改了。

4、使用数据预测时,出现了数据类型不符合的情况~
什么list、matrix等混乱~这个得我一条条代码调试,更改相应的数据类型~ 吐血!希望以后加强这个方面的训练,能尽量少报这方面的错误!

5、使用matplotlib画图时,总算明白了flatten()的奥妙之处~散点画图能力加强了~

二分K-Means 算法后面在总结

机器学习之K-Means相关推荐

  1. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  2. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

  3. 为了联盟还是为了部落 | K means

    1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...

  4. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  5. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  6. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  7. 文献记录(part89)--I-k-means-+:An iterative clustering algorithm based on an enhanced k -means

    学习笔记,仅供参考,有错必究 关键词:k均值:解决方案改进:准确的k均值:迭代改进 I-k-means-+:An iterative clustering algorithm based on an ...

  8. sklearn机器学习:K均值聚类

    K-Means 均值聚类聚类算法可以说是最简单但是使用最广的一种聚类算法了,原理也简单易懂,sklearn中提供了很多聚类算法的实现,所以这里就学习一下K-Means算法.接下来会介绍一些关键性的概念 ...

  9. 百面机器学习—7.K均值算法、EM算法与高斯混合模型要点总结

    文章目录 一.总结K均值算法步骤 二.如何合理选择K值? 三.K均值算法的优缺点是什么? 四.如何对K均值算法进行调优? 五.EM算法解决什么问题? 六.EM算法流程是什么? 六.EM算法能保证收敛嘛 ...

  10. 机器学习:k邻近算法(KNN)

    title: 机器学习:k邻近算法(KNN) date: 2019-11-16 20:20:41 mathjax: true categories: 机器学习 tags: 机器学习 什么是K邻近算法? ...

最新文章

  1. 解读 | 2019 年 10 篇计算机视觉精选论文(上)
  2. 实操教程|使用图像分割来做缺陷检测的一个例子
  3. C# 操作Excel
  4. 复杂分组统计---表在文件中
  5. .xyz域名注册总量TOP10服务商:中国占据4个席位
  6. java文件下载出现文件名乱码解决办法
  7. 建立和使用Maven项目骨架Archetype
  8. 马斯克超扎克伯格 跻身全球第三大富豪
  9. Qt C/C++统计运行时间
  10. 把dataset作为一个xml文件传给客户端
  11. 电脑集显linux版本,Intel即将推出新的Linux驱动 核显性能最高可提升20%
  12. python自定义规律绘制_ForMaiR - 自定义规则的邮件自动转发工具
  13. mfc 通过按钮发弹幕_BiliBiliChat
  14. 中国《人工智能标准化白皮书2018》发布完整版
  15. 先进核反应堆 ——新能源概论结课作业
  16. python 模拟登录超星强智系统
  17. 今日头条网页数据采集接口
  18. c++/c语言(高质量程序设计指南林锐建议总结)
  19. 指针练习 - 使用指针找出函数中最大值和最小值
  20. ipa反编译修改icon,简洁教程

热门文章

  1. 如何成为一名Top DevOps Engineer
  2. Error: Exported bands must have compatible data types; found inconsistent types: Float64 and Float32
  3. 教你玩转自己的机械键盘
  4. linux中yum provide,Liunx 安装YUM有没有详细的教程。
  5. 序列标注 | (5) 命名实体识别技术综述
  6. 华中科技大计算机全国排名,2017华中科技大学全国排名第几
  7. html5 自动扣图,js+html5 canvas实现ps钢笔抠图
  8. python实现rar解压和压缩
  9. 利用Pytorch搭建简单的图像分类模型(之二)---搭建网络
  10. ORB2单目读代码笔记5--利用灰度质心计算ORB特征点方向,实现旋转不变性