python-Kmeans\Kmeans++算法理解及代码实现

一、      环境:

  • Python 3.7.4
  • Pycharm Community 2019.3

二、      问题:

     对六个样本点[1, 5], [2, 4], [4, 1], [5, 0], [7, 6], [6, 7]进行K-means聚类。

三、      理论推导

 此处依照我个人理解所写,错误之处欢迎指出

K-means核心操作为:聚类中心选取—分类—调整聚类中心—再次分类并调整聚类中心直到调整幅度小于阈值或程序运行轮数大于阈值

  1. 选取聚类中心:
      聚类中心的选取可以选择随机选取、人工选取。K-means++相对K-means来说在第一次选取聚类中心方面有所改进,K-means++在初次选择聚类中心时会使各个聚类中心之间的距离都尽可能的远,以得到更合理的分类。如果条件允许的话,我认为人工选取聚类中心的结果会更符合我们的需求。
  2. 分类
      遍历所有待分类的点,根据我们选择的度量方法来判断点的类型。(我的代码直接以欧式距离作为度量来判断类型)
    度量方法的选择要根据实际情况以及需求具体分析选择。同一数据使用不同的度量方法最后的分类结果可能会不同。
  3. 调整聚类中心
      计算已经分好类的样本点的均值,以均值作为新的聚类中心。
    若首次聚类中心选择很不合理的话,聚类中心的调整也会受到影响,导致最后分类结果不理想。
  4. 再次分类并调整聚类中心直到调整幅度小于阈值或运行轮数大于阈值
      在调整了聚类中心之后再次进行步骤2,3直到聚类中心调整的幅度小于我们设定的一个阈值,或者循环运行的轮数大于我们的阈值,就认为分类结束。

四、      代码实现

  代码主要用于理解算法,有些地方可能不够严谨,还请轻喷??????

 因为样本点较少,所以俩个算法运行结果相同,读者可自行增加样本检测

K-means:

 1 # kmeans input_data为待分类数据,k为分类类别数
 2 def myKmeans(input_data, k):
 3     # region 选择类中心
 4     index_cls = []
 5     while index_cls.__len__() < k:
 6         n = np.random.randint(0, input_data.shape[0], 1)
 7         if n not in index_cls:
 8             index_cls.append(n[0])
 9     point_cls = input_data[np.array(index_cls)]  # piont_cls为选好的三个聚类中心
10     # endregion
11     # region 更新样本点类型
12     # tag_sample = [-1 for i in range(input_data.shape[0])]  # 六个样本点的标签
13     while True:
14         # 计算样本点到聚类中心的欧式距离平方(无需开根号) (x1-x2) ** 2 + (y1 - y2) ** 2
15         # axis = 0 为按行取值,axis = 1 为按列取值
16         dis_cls = np.array([np.sum((input_data - i) ** 2, axis=1) for i in point_cls])  # 计算六个点距离三个聚类中心的值,三行六列
17         # 0: 1 2 3 4 5 6
18         # 1: 6 5 4 2 3 4
19         # 2: 4 4 5 3 4 5
20         # 选取每一列最小值索引作为这个样本点的距离
21         min_tag = np.argmin(dis_cls, axis=0)  # 选取每一列的最小值(即最小距离),为本次计算样本点的tag
22         # endregion
23
24         # region 计算新类中心
25         new_piont_cls = np.array(list([np.average(input_data[min_tag == i], axis=0) for i in range(k)]))
26         # endregion
27
28         # region 计算新类中心的样本类别,做判断,若类别有变化,则更新类别,若不变化,结束算法
29         # 比较俩个类的中心是否满足一定条件(一般算和小于一定的值)
30         gap = np.sum((new_piont_cls - point_cls) ** 2)  # 若样本点改变值和小于1,则表示分类结束
31         if gap < 1:
32             break
33         else:
34             point_cls = new_piont_cls
35         # 可以比较样本的类别变化,若样本类别无变化,则停止
36         # endregion
37     return min_tag  # 返回input_data分类(0,1,2) 三类

K-means++:

 1 # kmeans++ input_data为待分类数据,k为分类类别数
 2 def myKmeanspp(input_data, k):
 3     # region 选择类中心
 4     # 选取相距距离最远的点作为聚类中心
 5     point_cls = [list([np.random.randint(0, input_data.shape[0]), 1])]
 6     # 计算第二个点,即获取离选好的类中心点最远的点
 7     while point_cls.__len__() < k:
 8         dis = np.array([sum((input_data[j] - point_cls[i]) ** 2 for i in range(point_cls.__len__())) for j in
 9                         range(input_data.__len__())])
10         sample_dis_cls_min = np.min(dis, axis=0)
11         index_max_dis_sample = np.argmax(sample_dis_cls_min)
12         point_cls.append(list(input_data[index_max_dis_sample]))
13     point_cls = np.array(point_cls)
14     # endregion
15     # region 更新样本点类型
16     # tag_sample = [-1 for i in range(input_data.shape[0])]  # 六个样本点的标签
17     while True:
18         # 计算样本点到聚类中心的欧式距离平方(无需开根号) (x1-x2) ** 2 + (y1 - y2) ** 2
19         # axis = 0 为按行取值,axis = 1 为按列取值
20         dis_cls = np.array([np.sum((input_data - i) ** 2, axis=1) for i in point_cls])  # 计算六个点距离三个聚类中心的值,三行六列
21         # 0: 1 2 3 4 5 6
22         # 1: 6 5 4 2 3 4
23         # 2: 4 4 5 3 4 5
24         # 选取每一列最小值索引作为这个样本点的距离
25         min_tag = np.argmin(dis_cls, axis=0)  # 选取每一列的最小值(即最小距离),为本次计算样本点的tag
26         # endregion
27
28         # region 计算新类中心
29         new_piont_cls = np.array(list([np.average(input_data[min_tag == i], axis=0) for i in range(3)]))
30         # endregion
31
32         # region 计算新类中心的样本类别,做判断,若类别有变化,则更新类别,若不变化,结束算法
33         # 比较俩个类的中心是否满足一定条件(一般算和小于一定的值)
34         gap = np.sum((new_piont_cls - point_cls) ** 2)  # 若样本点改变值和小于1,则表示分类结束
35         if gap < 1:
36             break
37         else:
38             point_cls = new_piont_cls
39         # 可以比较样本的类别变化,若样本类别无变化,则停止
40         # endregion
41     return min_tag

原文地址:https://www.cnblogs.com/FSeng/p/12199333.html

时间: 2024-08-03 09:41:24

python-Kmeans\Kmeans++算法理解及代码实现的相关文章

PCA算法理解及代码实现

github:PCA代码实现.PCA应用 本文算法均使用python3实现 1. 数据降维 ??在实际生产生活中,我们所获得的数据集在特征上往往具有很高的维度,对高维度的数据进行处理时消耗的时间很大,并且过多的特征变量也会妨碍查找规律的建立.如何在最大程度上保留数据集的信息量的前提下进行数据维度的降低,是我们需要解决的问题. ??对数据进行降维有以下优点: ??(1)使得数据集更易使用 ??(2)降低很多算法的计算开销 ??(3)去除噪声 ??(4)使得结果易懂 ??降维技术作为数据预处理的一部

数据挖掘-聚类分析(Python实现K-Means算法)

概念: 聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术.聚类分析也叫分类分析,或者数值分类.聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或者相似度将其划分成若干个组,划分的原则是组内距离最小化而组间(外部)距离最大化.聚类和分类的不同在于:聚类所要求划分的类是未知的. 聚类度量的方法:分距离和相似度来度量. ? ? 聚类研究分析的方法: 1.层次的方法(hierarchical  method) 2.划分方法(par

Python实现K-means聚类算法

因为自己对python也有一定的了解,之前也用R做过一些数据分析,又恰好看到几篇文章介绍python实现算法的,觉得挺有意思,所以参考了一些书籍来自己实现一个K-means的聚类算法.<Python数据分析基础教程:NumPy学习指南(第2版)>和 < Matplotlib手册>是做数据分析的挺不错的两个入门级教材,推荐给大家. 链接:http://pan.baidu.com/s/1FSheY 密码:ulsa 数据聚类是对于静态数据分析的一门技术,在许多领域内都被广泛地应用,包括机

k-means聚类算法python实现

K-means聚类算法 算法优缺点: 优点:容易实现缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去. 1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的选择方法有两种一种是elbow method,简单的说就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好.另一种则是根据具体的需求确定,比

K-Means 聚类算法原理分析与代码实现

前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经典的聚类问题展开讨论.所谓聚类,就是事先并不知道具体分类方案的分类 (允许知道分类个数). 本文将介绍一个最为经典的聚类算法 - K-Means 聚类算法以及它的两种实现. 现实中的聚类分析问题 - 总统大选 假设 M 国又开始全民选举总统了,目前 Mr.OBM 的投票率为48%(投票数占所有选民人数的百分比

K-means聚类算法的三种改进(K-means++,ISODATA,Kernel K-means)介绍与对比

  一.概述 在本篇文章中将对四种聚类算法(K-means,K-means++,ISODATA和Kernel K-means)进行详细介绍,并利用数据集来真实地反映这四种算法之间的区别. 首先需要明确的是上述四种算法都属于"硬聚类"算法,即数据集中每一个样本都是被100%确定得分到某一个类别中.与之相对的"软聚类"可以理解为每个样本是以一定的概率被分到某一个类别中. 先简要阐述下上述四种算法之间的关系,已经了解过经典K-means算法的读者应该会有所体会.没有了解过

Tensorflow快速入门1--实现K-Means聚类算法

快速入门1–实现K-Means聚类算法 环境: 虚拟机 版本:0.12.0(仅使用cpu下,pip命令安装) 目录 1.环境搭建 的安装 1.2简单测试 学习文档 相关的库Seaborn.pandas安装 实现K-Means聚类算法 2.1最基本的K-Means聚类算法步骤 实现K-Means聚类算法 2.3测试数据准备 2.4完整的kmeans.py文件 2.5简单测试结果 1.环境搭建 的安装 这里通过pip安装(只安装cpu单机版的,有条件的可以安装gpu下的). 1 2 1 2 注意:如

scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正 转载请注明出处 ====================================================================== K-means算法分析与Python代码实现请参考之前的两篇博客: <机器学习实战>k

转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正 转载请注明出处 ======================================