声明:代码的运行环境为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. php 开发商城 注意,php开发微商城要注意什么
  2. JS 小数的常用处理方法
  3. 唯品会在 Flink 容器化与平台化上的建设实践
  4. 同一网段计算机无法共享打印机,Win7同一个局域网内共享打印机不成功的修复方法...
  5. php 查看扩展 代码,[扩展推荐] 使用 PHP Insights 在终端查看 PHP 项目代码质量
  6. Linux系统编程:使用semaphore信号量和mutex互斥量实现多个生产者和消费者模型
  7. 阿里云 API 签名机制的 Python 实现
  8. java查找字符串是否有单词_java – 用于搜索单词/字符串是否包含在实...
  9. pytorch clamp 与clamp_区别
  10. TypeScript 的存在削弱了 JavaScript 生态系统?
  11. ffdshow 源代码分析 9: 编解码器有关类的总结
  12. java date只保留年月日_入门之JAVA爬虫
  13. vs2015 hiredis编译使用
  14. WMS仓库管理系统---(12)货位库存管理
  15. php 函数 累乘 累加,如何实现EXCEL中的累加计算【累加累乘】
  16. 字符串处理工具类,主要是针对内容txt对标点符号进行处理-java处理字符串符号工具类实现逻辑
  17. 输入三角形边长,求面积
  18. Process terminated
  19. php函数param太多,关于php:在非对象上调用成员函数bind_param()
  20. 安卓adb工具的安装方法

热门文章

  1. 苹果新一代iPad Pro规格配置怎样?
  2. 套接字、UDP通信、TCP通信、TCP\IP协议簇
  3. 远程视频监控该如何组网
  4. 第十一次 作业 视图的应用
  5. 中百信玄武库Kubernetes实践与探索
  6. 受关注的两个投资市场就是港股和美股
  7. 27-TCP 协议(快重传与快恢复)
  8. 我们是如何创造世界上最大的神经网络大学“Сognitive Agro Data Factory”的
  9. 动态下载苹果提供的多种中文字体
  10. Vue3.x 报 Uncaught TypeError:Object(...) is not a function( Vue3对象不是函数解决思路)