iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python使用Numpy实现Kmeans算法的步骤详解
  • 700
分享到

Python使用Numpy实现Kmeans算法的步骤详解

2024-04-02 19:04:59 700人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录Kmeans聚类算法介绍:1.聚类概念:2.Kmeans算法:定义:大概步骤:Kmeans距离测定方式:3.如何确定最佳的k值(类别数):手肘法:python实现Kmeans算法

Kmeans聚类算法介绍:

1.聚类概念:

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。

2.Kmeans算法:

定义:

kmeans算法又名k均值算法,K-means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。

大概步骤:

  • 设置初始类别中心和类别数
  • 根据类别中心对全部数据进行类别划分:每个点分到离自己距离最小的那个类
  • 重新计算当前类别划分下每个类的中心:例如可以取每个类别里所有的点的平均值作为新的中心。如何求多个点的平均值? 分别计算X坐标的平均值,y坐标的平均值,从而得到新的点。注意:类的中心可以不是真实的点,虚拟的点也不影响。
  • 在新的类别中心下继续进行类别划分;
  • 如果连续两次的类别划分结果不变则停止算法; 否则循环2~5。例如当类的中心不再变化时,跳出循环。

Kmeans距离测定方式:

欧式距离:

曼哈顿距离:

余弦相似度:

A与B表示向量(x1,y1),(x2,y2)
分子为A与B的点乘,分母为二者各自的L2相乘,即将所有维度值的平方相加后开方。

3.如何确定最佳的k值(类别数):

本文选取手肘法

手肘法:

对于每一个k值,计算它的误差平方和(SSE):

其中N是点的个数,Xi 是第i 个点,ciXi 对应的中心。

  • 随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。
  • 当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数

Python实现Kmeans算法:

1.代码如下:


import numpy as np
import matplotlib.pyplot as plt
import math
 
k = eval(input("请输入想要划分的类别个数")) #规定类别数
n = eval(input("请输入要循环的次数"))#规定循环次数
sw = eval(input("请输入想要查询的元素在数据中的位置"))
 
def readdata():#获取data数据中坐标值
    data = np.loadtxt("E:\\Python\\Lab4\\Lab4.dat")#读取dat数据
    x_data = data[:,0]#横坐标
    y_data = data[:,1]#纵坐标
    return data,x_data,y_data
 
def init(k):#初始化生成k个随机类别中心
    data,x_data,y_data = readdata()
    class_center = []
    for i in range(k):
        #在数据的最大值与最小值间给出随机值
        x = np.random.randint(np.min(x_data),np.max(x_data))
        y = np.random.randint(np.min(y_data),np.max(y_data))
        class_center.append(np.array([x,y]))#以数组方式添加,方便后面计算距离
    return class_center
 
def dist(a,b):#计算两个坐标间的欧氏距离
    dist = math.sqrt(math.pow((a[0] - b[0]),2) + math.pow((a[1] - b[1]),2))
    return dist
 
def dist_rank(center,data):#得到与类中心最小距离的类别位置索引
    tem = []
    for m in range(k):
        d = dist(data, center[m])
        tem.append(d)
    loc = tem.index(min(tem))
    return loc
 
def means(arr):#计算类的平均值当作类的新中心
    sum_x,sum_y =0,0
    for n in arr:
        sum_x += n[0]
        sum_y += n[1]
    mean_x = sum_x / len(arr)
    mean_y = sum_y / len(arr)
    return [mean_x,mean_y]
 
def divide(center,data):#将每一个二维坐标分到与之欧式距离最近的类里
    cla_arr = [[]]
    for i in range(k-1):#创建与k值相同维度的空数组存取坐标
        cla_arr.append([])
    for j in range(len(data)):
        loc = dist_rank(center,data[j])
        cla_arr[loc].append(list(data[j]))
    return cla_arr
 
def new_center(cla):#计算每类平均值更新类中心
    new_cen = []
    for g in range(k):
        new = means(cla[g])
        new_cen.append(new)
    return new_cen
 
def index_element(arr,data,sw):#索引第sw个元素对应的类别
    index = []
    for i in range(len(data)):#遍历每一个数据
        for j in range(k):#遍历每一个类别
            tem = arr[j]
            for d in range(len(tem)):#遍历类别内的每一个数据
                if data[i][0] == tem[d][0] and data[i][1] == tem[d][1]:#如果横纵坐标数值都相等
                    index.append((j + 1))#归为j+1类
                else:
                    continue
    return index[sw]
 
def Kmeans(n,sw):#获取n次更新后类别中心以及第sw个元素对应的类别
    data, x_data, y_data = readdata()#读取数据
    center = init(k)  # 获取初始类别中心
    while n > 0:
        cla_arr = divide(center,data)# 将数据分到随机选取的类中心的里
        center = new_center(cla_arr)#更新类别中心
        n -= 1
    sse1 = 0
    for j in range(k):
        for i in range(len(cla_arr[j])):  # 计算每个类里的误差平方
            # 计算每个类里每个元素与元素中心的误差平方
            dist1 = math.pow(dist(cla_arr[j][i], center[j]), 2)
            sse1 += dist1
    sse1 = sse1 / len(data)
    index = index_element(cla_arr,data,sw)
    return center,index,sse1,cla_arr
center_l, index,sse1, cla_arr = Kmeans(n,sw)
print("类别中心为:",center_l)
print("所查元素属于类别:",index)
print('k值为{0}时的误差平方和为{1}'.fORMat(k,sse1))#format格式化占位输出误差平方和
 
def visualization(cla):#聚类可视化展现
    cla_x = [[]]
    cla_y = [[]]
    for m in range(k-1):#创建与k值相同维度的空数组存取x坐标和y坐标
        cla_x.append([])
        cla_y.append([])
    for i in range(k):#遍历k次读取k个类别
        for j in cla[i]:#遍历每一类存取横纵坐标
            cla_x[i].append(j[0])
            cla_y[i].append(j[1])
    plt.rcParams['axes.unicode_minus'] = False
    plt.rcParams['font.sans-serif']=['SimHei']#解决中文不能显示的问题
    plt.figure()
    plt.xlabel("x")
    plt.ylabel("y")
    plt.title("聚类图")
    plt.scatter(cla_x[0],cla_y[0],c = 'r',marker = 'h')
    plt.scatter(cla_x[1], cla_y[1], c='y', marker='.')
    plt.scatter(cla_x[2], cla_y[2], c='g', marker='o')
    plt.scatter(cla_x[3], cla_y[3], c='b', marker=',')
    plt.scatter(cla_x[4], cla_y[4], c='k', marker='p')
    plt.show()
 
visualization(cla_arr)
 
def hand():#画出手肘图
    #sse列表是循环次数为3,改变k从2到8一个一个人工测得存入
    sse = [17.840272113687078,12.116153021227769,8.563862232332205,4.092534331364449,3.573312882789776,3.42794767600246,3.2880646083752185]
    x = np.linspace(2,8,7)#创建等间距大小为7的数组
    plt.xlabel("k值")#横坐标名称
    plt.ylabel("误差平方和")#纵坐标名称
    plt.title("手肘图")#曲线名
    plt.plot(x,sse)#画出曲线
    plt.show()
hand()

2.代码结果展示:

聚类可视化图:

手肘图:

运行结果:

文章参考:

手肘法:K-means聚类最优k值的选取_qq_15738501的博客-CSDN博客_kmeans聚类k的选取

matplotpb.pyplot.scatter散点图的画法:

PYthon——plt.scatter各参数详解_yuanCruise-CSDN博客_plt.scatter

到此这篇关于Python使用Numpy实现Kmeans算法的文章就介绍到这了,更多相关Python Kmeans算法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python使用Numpy实现Kmeans算法的步骤详解

本文链接: https://www.lsjlt.com/news/157137.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python使用Numpy实现Kmeans算法的步骤详解
    目录Kmeans聚类算法介绍:1.聚类概念:2.Kmeans算法:定义:大概步骤:Kmeans距离测定方式:3.如何确定最佳的k值(类别数):手肘法:python实现Kmeans算法...
    99+
    2024-04-02
  • 学习Python中A*算法实现的详细步骤
    以此加权图为例,用Python实现A*算法。加权图中的节点用粉红色圆圈表示,并且给出了沿节点的路径的权重。节点上方的数字代表节点的启发式值。 首先为算法创建类。一个用于存储与起始节点的距离,另一个用于存储父节点。并将它们初始化...
    99+
    2024-01-23
  • OpenCV实现无缝克隆算法的步骤详解
    目录一、概述二、函数原型三、OpenCV源码1、源码路径2、源码代码四、效果图像示例一、概述 借助无缝克隆算法,您可以从一张图像中复制一个对象,然后将其粘贴到另一张图像中,从而形成一...
    99+
    2024-04-02
  • OpenCV实现图像去噪算法的步骤详解
    目录一、函数参考1、Primal-dual算法2、非局部均值去噪算法三、OpenCV源码1、源码路径2、源码代码四、效果图像示例一、函数参考 1、Primal-dual算法 Prim...
    99+
    2024-04-02
  • 用Python实现洗牌算法的运行步骤
    给定一个数组,编写一个程序来生成数组元素的随机排列,这个问题也被称为“洗牌”或“随机化给定的数组”。洗牌算法中数组元素的每种排列的可能性都应该是相同的。 洗牌算法是如何运行的 给定的数组是arr[],一个简单的解决方法是创建一个...
    99+
    2024-01-24
    算法的概念
  • 详解使用Numpy库求解矩阵的逆的步骤
    利用Numpy库求解矩阵逆的步骤详解 概述:矩阵逆是线性代数中一个重要的概念,它是指对于一个方阵A,如果存在一个方阵B,使得A与B的乘积为单位矩阵(即AB=BA=I),则称B是A的逆矩阵,记为A^{-1}。矩阵逆的求解在很多实际...
    99+
    2024-01-24
    存在一个矩阵B
  • 如何利用python的KMeans和PCA包实现聚类算法
    如何利用python的KMeans和PCA包实现聚类算法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。题目: 通过给出的驾驶员行为数据(trip.csv),对驾...
    99+
    2023-06-02
  • 使用PHPCMS实现微信登录的步骤详解
    使用PHPCMS实现微信登录的步骤详解 随着智能手机的普及和移动互联网的发展,微信已经成为人们日常生活中必不可少的社交工具之一。在网站开发中,实现微信登录功能可以为用户提供更加便捷的注...
    99+
    2024-04-02
  • Python实现Web服务器FastAPI的步骤详解
    目录1、简介2、安装3、官方示例3.1 入门示例 Python测试代码如下(main.py):3.2 跨域CORS3.3 文件操作3.4 WebSocket Python测试代码如下...
    99+
    2024-04-02
  • 详解Python AdaBoost算法的实现
    目录1. AdaBoost 算法简介2. AdaBoost算法 逻辑详解2.1 数据2.2 带权错误率2.3 损失函数 与 确定样本权重2.4 确定模型权重2.5 输出模型3.Ada...
    99+
    2024-04-02
  • Android PhotoView使用步骤实例详解
    Android PhotoView使用步骤实例详解步骤一:在布局文件中的代码:<uk.co.senab.photoview.PhotoView android:id="@+id/img_showimgview" andro...
    99+
    2023-05-31
    android photoview roi
  • Python实现KPM算法详解
    目录知识点说明:一、要获取KPM算法的next[]数组二、KMP函数知识点说明: 先说前缀,和后缀吧 比如有一个串:abab 则在下标为3处的(前缀和后缀都要比下标出的长度小1,此处...
    99+
    2024-04-02
  • vue使用AES.js的步骤详解
    AES加密的使用 对数据传输加密、解密处理---AES.js 第一步: 在vue中安装crypto-js依赖 npm install crypto-js --save-dev 第...
    99+
    2024-04-02
  • RRT与RRT*算法具体步骤与程序详解(python)
    提示:前面写了A*、Dijkstra算法 文章目录 前言一、RRT的原理与步骤二、RRT算法编写的步骤1.算法步骤2.算法的实现 三、RRT*算法编写的步骤1.算法的步骤2.算法的实...
    99+
    2023-09-05
    算法 python 机器学习
  • 用vscode开发python的步骤详解
            一个老程序员,各种开发语言和技术都有涉及。每种语言都有相对应的IDE,提供比较完善的功...
    99+
    2024-04-02
  • 用Python实现简单的人脸识别功能步骤详解
    前言 让我的电脑认识我,我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现简单的人脸识别技术! Python里,简单的人脸识别有很多种方法可以实现,依赖于pyth...
    99+
    2024-04-02
  • 如何使用Python numpy实现LeetCode算法题的快速响应?
    LeetCode是一个非常流行的算法题平台,它的题目涵盖了许多数据结构和算法的知识点,非常适合算法学习者练习和提高自己的编程能力。在解决LeetCode算法题的过程中,我们经常会用到Python的numpy库,这个库提供了很多高效的数学函...
    99+
    2023-06-05
    numpy 响应 leetcode
  • ElementUI在实际项目使用步骤详解
    目录1.表格自排序2.分页功能3.el-checkbox-group多选框4.封装日历组件5.用antv-G2实现雷达图6.多语言支持1.表格自排序 目标:点击入职时间后面的上下箭...
    99+
    2024-04-02
  • 使用spyder3调试python程序的实现步骤
    目录Spyder官方文档地址开始调试打断点的两种姿势普通的breakpoint带条件的breakpoint总结一下刚刚所讲的剩下的一些细节Step IntoReturn说是简明教程,...
    99+
    2024-04-02
  • 使用nginx+tomcat+keepalived实现高可用的详细步骤
    目录架构设计安装tomcat服务192.168.166.128192.168.166.129安装nginx服务安装keepalived验证架构设计 IP服务应用192.168.16...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作