K-Means聚类算法原理

"""
K-means impl, take square for example
"""
import random
import matplotlib.pyplot as plt
import numpy as npdef check_consistent(last_cluster, current_cluster):"""check whether last_cluster is the same as current_cluster:param: last_cluster [[ ]]:param: current_cluster [[ ]]:return: is_consistent  --bool"""if len(last_cluster) != len(current_cluster):return Falselenc = len(current_cluster)for i in range(0, lenc):if len(last_cluster[i]) != len(current_cluster[i]):return Falselencc = len(last_cluster[i])for j in range(0, lencc):if last_cluster[i][j] != current_cluster[i][j]:return Falsereturn Truedef calculate_dis(point_1, point_2):"""calculate the distance between point_1 and point_2@param: point_1 []@param: point_2 []@return: square distance  --float64"""lenp = len(point_1)dis = 0for i in range(0, lenp):dis += pow((point_1[i] - point_2[i]), 2)return disdef plot_cluster_result(clusters):"""plot clusters result (only 2D-dimension):param clusters: [[ ]]:return: none"""lenc = len(clusters)for i in range(0, lenc):plt.scatter(np.asarray(clusters[i])[:, 0], np.asarray(clusters[i])[:, 1])plt.show()def kmeans(data, K):"""kmeans kernel function:param: data  -- [[ ]]:param: K  -- number of clusters:return: clusters  -- [[ ]]"""if K <= 0:raise Exception("K should be equal or larger than zero!", K)# how many pointslent = len(data)# how many points does a segment containslens = lent // K# center of clusterscenters = []for i in range(0, K):centers.append(data[random.randint(i * lens, (i + 1) * lens - 1)])# clusters setclusters = []for i in range(0, K):clusters.append([])last_clusters = []while not check_consistent(last_clusters, clusters):last_clusters = clustersfor i in range(0, K):clusters[i].clear()# dis: [[]]  -- dis[i][j]: distance between centers[i] and data[j]dis = []for i in range(0, K):dis.append([])# calculate distance between each clusterfor i in range(0, lent):for j in range(0, K):dis[j].append(calculate_dis(centers[j], data[i]))# classify point into corresponding clusterfor i in range(0, lent):max_dis = float("inf")max_dis_id = -1for j in range(0, K):if dis[j][i] < max_dis:max_dis = dis[j][i]max_dis_id = jclusters[max_dis_id].append(data[i])# current clusters have generated, now calculate new centersnew_clusters_center_x = []new_clusters_center_y = []len_clusters = []for i in range(0, K):len_clusters.append(len(clusters[i]))new_clusters_center_x.append(0)new_clusters_center_y.append(0)for i in range(0, K):for j in range(0, len_clusters[i]):new_clusters_center_x[i] += clusters[i][j][0]new_clusters_center_y[i] += clusters[i][j][1]for i in range(0, K):new_clusters_center_x[i] /= len_clusters[i]new_clusters_center_y[i] /= len_clusters[i]centers[i] = [new_clusters_center_x[i], new_clusters_center_y[i]]return last_clustersif __name__ == '__main__':data = [[0, 0], [1, 0], [0, 1],[6, 5], [5, 6], [6, 6]]clusters = kmeans(data, 2)print(clusters)plot_cluster_result(clusters)

使用点集 data = [ [0, 0], [1, 0], [0, 1], [6, 5], [5, 6], [6, 6] ]

聚类结果:

再加上生成数据集的代码:

def generate_2d_points(n, x_min, x_max, y_min, y_max):"""generate 2D points:param n: how many points:param x_range: range of X:param y_range: range of Y:return: random points  [[ ]]"""data = []for i in range(0, n):x = random.randint(x_min, x_max)y = random.randint(y_min, y_max)data.append([x, y])return data

同时修改主函数代码(主要是修改生成数据):

if __name__ == '__main__':# data = [#     [0, 0], [1, 0], [0, 1],#     [6, 5], [5, 6], [6, 6]# ]data = generate_2d_points(100, 0, 300, 0, 300)data.extend(generate_2d_points(100, 500, 700, 500, 700))data.extend(generate_2d_points(100, 1000, 1200, 1000, 1200))clusters = kmeans(data, 3)# print(clusters)plot_cluster_result(clusters)

运行结果:

手写K-Means(K均值聚类的python实现)相关推荐

  1. 无监督学习——K均值聚类的Python实现

    目录 概要 一.K均值算法 二.K值的选取:手肘法 三.用聚类实现鸢尾花数据分类 四.应用案例 1. 读取数据 2. 绘制手肘图 3. 找到最佳K值 4. 分类结果可视化 机器学习类型和算法的分类 无 ...

  2. python手写数字识别实验报告_机器学习python实战之手写数字识别

    看了上一篇内容之后,相信对K近邻算法有了一个清晰的认识,今天的内容--手写数字识别是对上一篇内容的延续,这里也是为了自己能更熟练的掌握k-NN算法. 我们有大约2000个训练样本和1000个左右测试样 ...

  3. 利用python卷积神经网络手写数字识别_卷积神经网络使用Python的手写数字识别

    为了使机器更智能,开发人员正在研究机器学习和深度学习技术.人类通过反复练习和重复执行任务来学习执行任务,从而记住了如何执行任务.然后,他大脑中的神经元会自动触发,它们可以快速执行所学的任务.深度学习与 ...

  4. k均值聚类的python代码_k-均值聚类Python代码实现

    这里给出两种方式的k-均值实现,code主要来自于网络: # reference: https://mubaris.com/2017/10/01/kmeans-clustering-in-python ...

  5. kmeans中的k的含义_聚类的Python实现(二):确定分群数K

    对于KMeans算法聚类数k的选取非常重要,下面介绍两种常用的选择方法. 手肘法 手肘法的核心指标是SSE(sum of the squared errors,误差平方和): 其中,Ci是第i个簇,p ...

  6. K-means均值聚类算法python代码实现

    import numpy as np import matplotlib.pyplot as plt import math import random import pandas as pd dat ...

  7. 算法面试经常需要你手写的三个排序算法(Python语言)

    作者 | 程序员小吴 来源 | 五分钟学算法(ID: CXYxiaowu) 1. 归并排序 1.1 算法步骤 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列: 设定两个指针,最初 ...

  8. 聚类分析 | MATLAB实现k-Means(k均值聚类)分析

    目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...

  9. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

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

最新文章

  1. python如何将图片的像素矩阵绘制成图片(python,matplotlib):TypeError: Invalid shape (1, 28, 28) for image data
  2. 37、iamgeview 图层叠加
  3. JAVA API-----String类和StringBuffer类
  4. scan8[16+2*4]的内容
  5. SVG 入门——理解viewport,viewbox,preserveAspectRatio
  6. Redis在项目中的地位及使用场景剖析
  7. IOS自定义UITableViewCell的高亮背景色
  8. 车轮轨迹原理_倒车轮子原理是什么 倒车原理动画演示很有用
  9. 平均数 中位数 四分位数 方差 标准差
  10. 纯CSS实现正方体旋转效果
  11. 分发自动化_使用bitrise自动化应用分发
  12. 阿里巴巴2011公开赛1004 Level up HDU 3954 线段树
  13. 一线城市广州,再次对“双一流”毕业生放宽落户条件
  14. Android OpenGL基础(四、图片后处理)
  15. php ppt read_PHP生成PPT
  16. java反序列化漏洞分析
  17. 相机图像镜像翻转与旋转的关系
  18. 【动画】背景图片旋转(内容不旋转)
  19. android widget 布局,Android Widget Attributes——View
  20. Mycat分表分库原则

热门文章

  1. Python scrapy环境搭建
  2. Vimeo高级API:使用SCRIBE在JAVA中搜索公共视频
  3. 【服务器数据恢复】服务器硬盘黄灯的数据恢复案例分享
  4. 08.数据结构:第一个动态结构-链表
  5. POJ3414-Pots
  6. ZufeInfo 2018级软件工程专业毕业设计,开题报告常见格式问题解答
  7. 正则表达式,Math类,System类,日期日历对象
  8. opencv 之人眼人脸检测
  9. Elasticsearch实战---------相关名词介绍
  10. 安卓移动开发——用AsyncTask来实现计时器和进度条