声明:代码的运行环境为Python3。Python3与Python2在一些细节上会有所不同,希望广大读者注意。本博客以代码为主,代码中会有详细的注释。相关文章将会发布在我的个人博客专栏《Python从入门到深度学习》,欢迎大家关注~


根据训练样本是否包含标签信息,机器学习可以分为监督学习和无监督学习(这里我们不考虑半监督学习)。聚类算法是典型的无监督学习算法,它是对事务自动归类的一种算法,在聚类算法中利用样本的标签,将具有相似属性的事物聚集到一类中。

一、常用的相似性度量

K-Means算法(K-均值算法)是基于相似性的无监督学习算法,即通过比较样本之间的相似性,将较为相似的样本划分到同一个类别中。为了度量两个样本(以样本X和样本Y为例)之间的相似性,通常会定义一个距离函数d(X,Y),利用这个距离函数来定义样本X和样本Y之间的相似性。

1、闵可夫斯基距离

空间中两个点X,Y的坐标分别为:

那么,点X与点Y之间的闵可夫斯基距离可以定义为:

2、曼哈顿距离

同样的两个点X,Y其曼哈顿距离可以表示为:

3、欧氏距离

同样的,点X与点Y的欧氏距离可以表示为:

由上面的定义可知,曼哈顿距离和欧式距离是闵可夫斯基距离的特殊形式。当p=1时,闵可夫斯基距离就是曼哈顿距离;当p=2时,闵可夫斯基距离就是欧式距离。在K-Means算法中,我们使用欧氏距离作为其相似性度量。因为欧氏距离的根号存在与否对其度量性没有影响,简单起见,我们使用欧氏距离的平方作为最终的相似性度量。

首先将需要加载相关的模块:

import numpy as np

欧氏距离的平方实现代码如下:

def distance(vecA, vecB):'''计算两个向量之间欧氏距离的平方:param vecA: 向量A的坐标:param vecB: 向量B的坐标:return: 返回两个向量之间欧氏距离的平方'''dist = (vecA - vecB) * (vecA - vecB).Treturn dist[0, 0]

二、K-Means算法原理

首先,我们需要人为的指定最终的聚类个数,假设我们最终的聚类个数为k个,即我们需要初始化k个聚类中心,通过计算每个样本与聚类中心的相似度,将样本点划分到距离最近的聚类中心。然后,通过每个类的样本重新计算每个类的聚类中心,重复这个操作直至聚类中心不再改变即为最终的聚类结果。

三、K-Means算法步骤

1、随机初始化K个聚类中心,其代码如下:

def randomCenter(data, k):'''随机初始化聚类中心:param data: 训练数据:param k: 聚类中心的个数:return: 返回初始化的聚类中心'''n = np.shape(data)[1]  # 特征的个数cent = np.mat(np.zeros((k, n)))  # 初始化K个聚类中心for j in range(n):  # 初始化聚类中心每一维的坐标minJ = np.min(data[:, j])rangeJ = np.max(data[:, j]) - minJcent[:, j] = minJ * np.mat(np.ones((k, 1))) + np.random.rand(k, 1) * rangeJ  # 在最大值和最小值之间初始化return cent

2、计算每个样本与k个聚类中心的相似度,将样本划分到与之最相似的类中;

3、计算划分到每个类别中所有样本特征的均值,并将该均值作为每个类别新的聚类中心;

4、重复2、3步操作,直至聚类中心不再改变,输出最终的聚类中心。

构建K-Means算法的代码如下:

def kmeans(data, k, cent):'''kmeans算法求解聚类中心:param data: 训练数据:param k: 聚类中心的个数:param cent: 随机初始化的聚类中心:return: 返回训练完成的聚类中心和每个样本所属的类别'''m, n = np.shape(data)  # m:样本的个数;n:特征的维度subCenter = np.mat(np.zeros((m, 2)))  # 初始化每个样本所属的类别change = True  # 判断是否需要重新计算聚类中心while change == True:change = False  # 重置for i in range(m):minDist = np.inf  # 设置样本与聚类中心的最小距离,初始值为正无穷minIndex = 0  # 所属的类别for j in range(k):# 计算i和每个聚类中心的距离dist = distance(data[i, ], cent[j, ])if dist < minDist:minDist = distminIndex = j# 判断是否需要改变if subCenter[i, 0] != minIndex:  # 需要改变change = TruesubCenter[i, ] = np.mat([minIndex, minDist])# 重新计算聚类中心for j in range(k):sum_all = np.mat(np.zeros((1, n)))r = 0  # 每个类别中样本的个数for i in range(m):if subCenter[i, 0] == j:  # 计算第j个类别sum_all += data[i, ]r += 1for z in range(n):try:cent[j, z] = sum_all[0, z] / rexcept:print("ZeroDivisionError: division by zero")return subCenter, cent

四、K-Means算法举例

1、数据集:数据集含有两个特征,如下图所示:

2、加载数据集

我们此处使用如下方法加载数据集,也可使用其他的方式进行加载,此处可以参考我的另外一篇文章《Python两种方式加载文件内容》。加载文件内容代码如下:

def load_data(file_path):'''导入数据:param file_path: 文件路径:return: 以矩阵的形式返回导入的数据'''f = open(file_path)data = []for words in f.readlines():row = []  # 记录每一行word = words.strip().split("\t")for x in word:row.append(float(x))  # 将文本中的特征转换成浮点数data.append(row)f.close()return np.mat(data)  # 以矩阵的形式返回

3、保存聚类结果

通过K-Means聚类之后,我们可以使用如下方法保存聚类结果:

def save_result(file_name, data):'''保存source中的结果到file_name文件中:param file_name: 保存的文件名:param data: 需要保存的数据:return:'''m, n = np.shape(data)f = open(file_name, "w")for i in range(m):tmp = []for j in range(n):tmp.append(str(data[i, j]))f.write("\t".join(tmp) + "\n")f.close()

4、调用K-Means算法

调用K-Means算法:

if __name__ == "__main__":k = 4  # 聚类中心的个数file_path = "tfidf.txt"subCenter, center = kmeans(load_data(file_path), k, randomCenter(load_data(file_path), k))save_result("result/kmeans_sub", subCenter)save_result("result/kmeans_center", center)

5、结果展示

得到的聚类结果如图所示:

你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了哪些问题。

Python实现K-Means聚类算法相关推荐

  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. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

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

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

  6. Python数据分析笔记:聚类算法之K均值

    我们之前接触的所有机器学习算法都有一个共同特点,那就是分类器会接受2个向量:一个是训练样本的特征向量X,一个是样本实际所属的类型向量Y.由于训练数据必须指定其真实分类结果,因此这种机器学习统称为有监督 ...

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

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

  8. Python金融数据挖掘 第11章 复习思考题1 (聚类)给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,用K均值聚类算法来训练模型,分4类。

    1.题目 给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,如图11-12所示. data_multivar.txt 图11-12 数据集 da ...

  9. 转载 | Python AI 教学│k-means聚类算法及应用

    关注我们的公众号哦!获取更多精彩哦! 1.问题导入 假如有这样一种情况,在一天你想去某个城市旅游,这个城市里你想去的有70个地方,现在你只有每一个地方的地址,这个地址列表很长,有70个位置.事先肯定要 ...

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

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

最新文章

  1. WMI技术介绍和应用——查询时间信息
  2. 《可解释机器学习》中文资源重磅来袭!复旦研究生翻译,原作者转发点赞!...
  3. Android适应方案汇总(三)
  4. 统计特定文件中的词频
  5. 常考数据结构与算法:进制转换
  6. C++数组与指针回顾总结
  7. [BUUCTF-pwn]——ciscn_2019_n_3
  8. 被忽略的知识点——switch语句
  9. python用xpath爬取10页网站图片
  10. 计算机英语一级考试试题,全国计算机一级考试试题及答案
  11. atoi函数_每日干货丨C语言中的字符串处理库函数介绍与实现
  12. js 指定滚动条位置
  13. 华为手机android怎么解锁,怎么查看华为手机解锁
  14. 佳能lbp611cn硒鼓_佳能lbp611cn说明书
  15. linux dnf配置文件,如何为CentOS 8配置本地Yum/DNF存储库
  16. 用Python蹭别人家图片接口,做一个【免费图床】吧
  17. java LPT1_Java 未知异常 求解
  18. Flask 数据生成/数据迁移/数据事件
  19. 解决photoshop菜单卡顿,闪动,停顿问题
  20. Android onKeyDown监听返回键无效

热门文章

  1. vueDialog弹框被遮罩层挡住
  2. LabVIEW使用G#框架实现面向对象编程
  3. 解决win10 VirtualBox无法启动(VERR_NEM_VM_CREATE_FAILED)/VMware Workstation 与 Device/Credential Guard 不兼容
  4. PaddleOCR二次全流程——5.FAQ记录
  5. 〖Python 数据库开发实战 - Python与MySQL交互篇⑮〗- 项目实战 - 实现新闻管理 - 删除新闻功能
  6. 小程序占服务器空间吗,小程序会占用手机存储空间吗?| 小程序问答 #21
  7. “好学若饥、谦卑若愚”
  8. 谷歌翻译插件imtranslator安装使用步骤
  9. Rxjava2原理流程+操作符+线程切换 浅析~
  10. 关于抖音网红推广,你想知道的50个问题都在这里!