热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python机器学习之手写Kmeans算法

上一期的机器学习算法更新到岭回归,然后看完了非监督的聚类算法就进入到深度学习了,机器学习剩下几章没更新,这几天上课时候老师讲到Kmeans

上一期的机器学习算法更新到岭回归,然后看完了非监督的聚类算法就进入到深度学习了,机器学习剩下几章没更新,这几天上课时候老师讲到Kmeans算法,于是我就觉得手写一下Kmeans算法,加深对聚类算法的理解。

1. K-means算法原理

K-means算法的思想:

  • 首先从数据集中随机选取K个点作为初始中心点。
  • 然后分别计算所有点到这K个点的距离,每个点选取距离最小的中心点将他们归成一类。
  • 重现计算各个类中所有点的平均值,选出新的中心点
  • 再次计算所有点到新的中心的距离,然后归类。
  • 循环多次,当中心点变动较小或不变时,算法结束。

2. 算法实现
  • 初始化初始点,计算距离的函数,分类的函数

def distance(a,b):#计算两点之间的欧式距离dis&#61;np.sqrt(((a[0]-b[0])**2)&#43;((a[1]-b[1])**2))return disdef initCenterpoint(k):#用随机数生成K个2维的初始中心点return np.random.random(k*2).reshape(k,2)def owner(dot,centerpoint):#属于哪个簇kclass&#61;0min_distance &#61; np.inf#距离初始化为无限大for i in range(len(centerpoint)):#分别计算各个点与中心点的距离&#xff0c;选取最小的距离的中心点作为分类d&#61;distance(dot,centerpoint[i])if d<min_distance:kclass&#61;imin_distance&#61;dreturn kclass#返回的是一个数

  • 计算每个类的中心点

def newCenter2(point,new_kclass):#求每组的平均值以确定中心k&#61;max(new_kclass)&#43;1#比如Kclass分类为&#xff08;0,1,2&#xff09;则K的取值为3newCenter&#61;np.zeros((k,2))#初始化一个&#xff08;K&#xff0c;3&#xff09;的矩阵,用来存放分类类别point&#61;pd.DataFrame(point,columns&#61;["x","y"])#点的数据转化为dataframenew_kclass&#61;pd.DataFrame(new_kclass,columns&#61;["kcalss"])#类别信息转化为dataframe类型point2&#61;point.join(new_kclass)#合并点的信息和点的分类信息point2.columns&#61;["x","y","kclass"]#将新的dataframe重新命名for i in range(k):#分别计算类别为0,1的平均值&#xff0c;保存为一个&#xff08;K&#xff0c;2&#xff09;的二维数组point3&#61;point2[point2["kclass"]&#61;&#61;i]newCenter[i]&#61;point3[["x","y"]].mean(axis&#61;0)return newCenter

  • 将计算出每个点的所属类整合成一个一维数组

def update_kcalss(point,centerpoint):#将获得的每个点的所属类的信息放在一个数组里n&#61;len(point)#点的个数为数组的长度new_kclass &#61; np.zeros((n))for i,point in enumerate(point):#利用循环给数组添加数new_kclass[i]&#61;owner(point,centerpoint)new_kclass&#61;new_kclass.astype(int)return new_kclass#返回数组

  • 组合成K-means算法

def kmeans(point):centerpoint&#61;initCenterpoint(2)#初始化K个类别&#xff0c;我这里是2个kclass&#61;update_kcalss(point,centerpoint)#初始化每个点所属的类别old_kclsss &#61; kclass#保留第一次的所属类别for i in range(200):#循环一个很大次数centerpoint&#61;newCenter2(point,kclass)#更新新的中心点kclass&#61;update_kcalss(point,centerpoint)#计算新的类别if np.array_equal(old_kclsss,kclass):#利用新的类别和旧类别进行比较&#xff0c;如果不同&#xff0c;说明分类没有结束&#xff0c;如果相同&#xff0c;分类结束。print("循环多少次&#xff1a;",i)breakelse:old_kclsss&#61;kclassreturn centerpoint,kclass#返回中心点和分类类别

  • 测试一下

#将c进行聚类
c &#61; np.array([[1,2],[1,1],[2,2],[5,5],[-0.10,-2.10],[-0.8,-1.8],[-2.9,-0.9],[-3.1,-2.2],[2,6],[7,10]])
a,b&#61;kmeans(c)
c2&#61;pd.DataFrame(c)
plt.plot(c2[0],c2[1],"or")
print(b)
a1&#61;pd.DataFrame(a)
print(a1)
plt.plot(a1[0],a1[1],"xb")
plt.show()

  • 结果
    在这里插入图片描述

3.全部代码

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
#二维数据Kmeans算法
def distance(a,b):#计算两点之间的欧式距离dis&#61;np.sqrt(((a[0]-b[0])**2)&#43;((a[1]-b[1])**2))return disdef initCenterpoint(k):#用随机数生成K个2维的初始中心点return np.random.random(k*2).reshape(k,2)def owner(dot,centerpoint):#属于哪个簇kclass&#61;0min_distance &#61; np.inffor i in range(len(centerpoint)):d&#61;distance(dot,centerpoint[i])if d<min_distance:kclass&#61;imin_distance&#61;dreturn kclassdef newCenter2(point,new_kclass):#求每组的平均值以确定中心k&#61;max(new_kclass)&#43;1#比如Kclass分类为&#xff08;0,1,2&#xff09;则K的取值为3newCenter&#61;np.zeros((k,2))#初始化一个&#xff08;K&#xff0c;3&#xff09;的矩阵,用来存放分类类别point&#61;pd.DataFrame(point,columns&#61;["x","y"])#点的数据转化为dataframenew_kclass&#61;pd.DataFrame(new_kclass,columns&#61;["kcalss"])#类别信息转化为dataframe类型point2&#61;point.join(new_kclass)#合并点的信息和点的分类信息point2.columns&#61;["x","y","kclass"]#将新的dataframe重新命名for i in range(k):#分别计算类别为0,1的平均值&#xff0c;保存为一个&#xff08;K&#xff0c;2&#xff09;的二维数组point3&#61;point2[point2["kclass"]&#61;&#61;i]newCenter[i]&#61;point3[["x","y"]].mean(axis&#61;0)return newCenterdef update_kcalss(point,centerpoint):#将获得的每个点的所属类的信息放在一个数组里n&#61;len(point)new_kclass &#61; np.zeros((n))for i,point in enumerate(point):new_kclass[i]&#61;owner(point,centerpoint)new_kclass&#61;new_kclass.astype(int)return new_kclassdef kmeans(point):centerpoint&#61;initCenterpoint(2)#初始化K个类别&#xff0c;我这里是2个kclass&#61;update_kcalss(point,centerpoint)#初始化每个点所属的类别old_kclsss &#61; kclass#保留第一次的所属类别for i in range(200):#循环一个很大次数centerpoint&#61;newCenter2(point,kclass)#更新新的中心点kclass&#61;update_kcalss(point,centerpoint)#计算新的类别if np.array_equal(old_kclsss,kclass):#利用新的类别和旧类别进行比较&#xff0c;如果不同&#xff0c;说明分类没有结束&#xff0c;如果相同&#xff0c;分类结束。print("循环多少次&#xff1a;",i)breakelse:old_kclsss&#61;kclassreturn centerpoint,kclass#返回中心点和分类类别#程序入口
c &#61; np.array([[1,2],[1,1],[2,2],[5,5],[-0.10,-2.10],[-0.8,-1.8],[-2.9,-0.9],[-3.1,-2.2],[2,6],[7,10]])
#这个是主程序
a,b&#61;kmeans(c)
c2&#61;pd.DataFrame(c)
plt.plot(c2[0],c2[1],"or")
print(b)
a1&#61;pd.DataFrame(a)
print(a1)
plt.plot(a1[0],a1[1],"xb")
plt.show()


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文介绍了在Python张量流中使用make_merged_spec()方法合并设备规格对象的方法和语法,以及参数和返回值的说明,并提供了一个示例代码。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
  • Window10+anaconda+python3.5.4+ tensorflow1.5+ keras(GPU版本)安装教程 ... [详细]
author-avatar
秘色瓷2502891691
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有