本文完成程序及测试数据集详细见:https://github.com/HanXia001/k-means-python3-

本文主要内容:

1.k-means解决的问题;

2.k-means原理介绍;

3.k-means的简单实现。

1.k-means解决的问题

k-means算法属于无监督学习的一种聚类算法,其目的为:在不知数据所属类别及类别数量的前提下,依据数据自身所暗含的特点对数据进行聚类。对于聚类过程中类别数量k的选取,需要一定的先验知识,也可根据“类内间距小,类间间距大“(一种聚类算法的理想情况)为目标进行实现。

2.k-means原理介绍

k-means算法以数据间的距离作为数据对象相似性度量的标准,因此选择计算数据间距离的计算方式对最后的聚类效果有显著的影响,常用计算距离的方式有:余弦距离、欧式距离、曼哈顿距离等。本文以欧式距离为例(会一种,其余也就会了)。

欧式距离公式:

例子:若数据为其计算欧式距离如下(可理解为D表示维度,i,j表示行数):

通过公式(1)可计算出每对数据对象间的距离,根据距离的远近进行聚类成指定的类别数K。对每一类中的数据初步选取类心,取的方式有多种如:

1.该类所有数据的均值;

2.随机取k个数据作为类心;

3.选取距离最远的k个点作为类心等。

以上方法均需要对初步的类心进行迭代,当类心变化缓慢时便可认为收敛,此时该点便为最终的类型。本文以方法1为例:

表示第k类,表示第k类中数据对象的个数。类心迭代过程如下:

通常迭代终止的条件有两种:1)达到指定的迭代次数T;2)类心不再发生明显的变化,即收敛。

3.k-means的简单实现

原理讲过,此处直接上代码(python3实现):

import numpy as np
import matplotlib.pyplot as plt# 加载数据
def loadDataSet(fileName):data = np.loadtxt(fileName,delimiter='\t')return data# 欧氏距离计算
def distEclud(x,y):return np.sqrt(np.sum((x-y)**2))  # 计算欧氏距离# 为给定数据集构建一个包含K个随机质心的集合
def randCent(dataSet,k):m,n = dataSet.shapecentroids = np.zeros((k,n))for i in range(k):index = int(np.random.uniform(0,m)) #centroids[i,:] = dataSet[index,:]return centroids# k均值聚类
def KMeans(dataSet,k):m = np.shape(dataSet)[0]  #行的数目# 第一列存样本属于哪一簇# 第二列存样本的到簇的中心点的误差clusterAssment = np.mat(np.zeros((m,2)))clusterChange = True# 第1步 初始化centroidscentroids = randCent(dataSet,k)while clusterChange:clusterChange = False# 遍历所有的样本(行数)for i in range(m):minDist = 100000.0minIndex = -1# 遍历所有的质心#第2步 找出最近的质心for j in range(k):# 计算该样本到质心的欧式距离distance = distEclud(centroids[j,:],dataSet[i,:])if distance < minDist:minDist = distanceminIndex = j# 第 3 步:更新每一行样本所属的簇if clusterAssment[i,0] != minIndex:clusterChange = TrueclusterAssment[i,:] = minIndex,minDist**2#第 4 步:更新质心for j in range(k):pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0].A == j)[0]]  # 获取簇类所有的点centroids[j,:] = np.mean(pointsInCluster,axis=0)   # 对矩阵的行求均值print("Congratulations,cluster complete!")return centroids,clusterAssmentdef showCluster(dataSet,k,centroids,clusterAssment):m,n = dataSet.shapeif n != 2:print("数据不是二维的")return 1mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']if k > len(mark):print("k值太大了")return 1# 绘制所有的样本for i in range(m):markIndex = int(clusterAssment[i,0])plt.plot(dataSet[i,0],dataSet[i,1],mark[markIndex])mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']# 绘制质心for i in range(k):plt.plot(centroids[i,0],centroids[i,1],mark[i])plt.show()
dataSet = loadDataSet("test.txt")
k = 4
centroids,clusterAssment = KMeans(dataSet,k)showCluster(dataSet,k,centroids,clusterAssment)

效果如图:

所用数据有些少,因此效果不明显。

k-means聚类算法原理及python3实现相关推荐

  1. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  2. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

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

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

  4. python(scikit-learn)实现k均值聚类算法

    k均值聚类算法原理详解 示例为链接中的例题 直接调用python机器学习的库scikit-learn中k均值算法的相关方法 from sklearn.cluster import KMeans imp ...

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

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

  6. k均值聚类算法案例 r语言iris_K-means算法原理

    聚类的基本思想 俗话说"物以类聚,人以群分" 聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中.簇内 ...

  7. 干货 | 非常全面的谱聚类算法原理总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 谱聚类算法是目前最流行的聚类算法之一,其性能及适用场景优于传统的聚 ...

  8. 层次聚类算法原理总结

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 层次聚类(hierarchical clustering)基于簇间 ...

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

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

  10. 【模式识别】K均值聚类算法应用实验报告及MATLAB仿真

    一. 实验目的 1.掌握K均值聚类算法的原理和实现过程: 2.掌握K均值聚类算法的应用方法. 二. 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图).步 ...

最新文章

  1. 清理和删除svn信息
  2. 修改java和mysql_关于mysql和java的数据修改
  3. golang 远程传输文件
  4. 使用WebRTC开发Android Messenger:第1部分
  5. php开发客服系统(持久连接+轮询+反向ajax)
  6. 用java创建一个单例模式,采用Java实现单例模式
  7. Redis和MongoDB的区别
  8. 报纸、电商、PC互联网颠覆传统行业,带来新的生态,自媒体也一样
  9. Tomcat 配置数据库连接池
  10. 【图像去噪】基于matlab GUI HSI彩色图像去噪【含Matlab源码 1786期】
  11. 无锁循环缓冲区的实现c语言,C++ 无锁环形缓冲区实现
  12. C. New Year Ratings Change
  13. MySQL-存储IP地址一文解决(随便问~)
  14. 阿昆同学的Java学习日记Day3
  15. 对象及日期定时器、延时器
  16. C语言题解:谁是凶手!
  17. Origin绘图的步骤?
  18. 牛客wannafly27 C 树形dp
  19. JAVASE点餐系统源码
  20. 常见java各种单位换算

热门文章

  1. 新十年,智竞未来AWE2021正式启动
  2. 电子计算机人工智能,人工智能的起源 ENIAC开启的电子计算机时代
  3. 黄沙百战穿金甲,不破python终不还!
  4. 一键智能视频编辑与视频修复算法——ProPainter源码解析与部署
  5. 【无标题】JAVA IO流学习笔记
  6. 计算机英语技术性词汇,雅思英语必备词汇计算机类
  7. web基础格式化文本与段落
  8. Web前端开发——HTML基础、格式化文本与段落
  9. 【01.24-02.06】长赢计划主理人“ETF拯救世界”微博精选
  10. 三星g9298颜值最高的 价位还亲民的精仿顶级g9298