资讯专栏INFORMATION COLUMN

Python使用Numpy实现Kmeans算法

hankkin / 3140人阅读

摘要:如何确定最佳的值类别数本文选取手肘法手肘法对于每一个值,计算它的误差平方和其中是点的个数,是第个点,是对应的中心。随着聚类数的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和自然会逐渐变小。

目录

Kmeans聚类算法介绍:

1.聚类概念:

2.Kmeans算法:

定义:

大概步骤:

 Kmeans距离测定方式:

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

手肘法:

python实现Kmeans算法: 

1.代码如下:

 2.代码结果展示:

 聚类可视化图:

 手肘图:

 运行结果:

 文章参考:

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

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


Kmeans聚类算法介绍:

1.聚类概念

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

2.Kmeans算法:

定义:

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

大概步骤:

  1. 设置初始类别中心和类别数
  2. 根据类别中心对全部数据进行类别划分:每个点分到离自己距离最小的那个类
  3. 重新计算当前类别划分下每个类的中心:例如可以取每个类别里所有的点的平均值作为新的中心。如何求多个点的平均值? 分别计算X坐标的平均值,y坐标的平均值,从而得到新的点。注意:类的中心可以不是真实的点,虚拟的点也不影响。
  4. 在新的类别中心下继续进行类别划分;
  5. 如果连续两次的类别划分结果不变则停止算法; 否则循环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 npimport matplotlib.pyplot as pltimport mathk = 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_datadef 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_centerdef dist(a,b):#计算两个坐标间的欧氏距离    dist = math.sqrt(math.pow((a[0] - b[0]),2) + math.pow((a[1] - b[1]),2))    return distdef dist_rank(center,data):#得到与类中心最小距离的类别位置索引    tem = []    for m in range(k):        d = dist(data, center[m])        tem.append(d)    loc = tem.index(min(tem))    return locdef 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_arrdef new_center(cla):#计算每类平均值更新类中心    new_cen = []    for g in range(k):        new = means(cla[g])        new_cen.append(new)    return new_cendef 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_arrcenter_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的选取

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123201.html

相关文章

  • opencv python K-Means聚类

    摘要:指定最大迭代次数的整数要求的准确性重复试验算法次数,将会返回最好的一次结果该标志用于指定初始中心的采用方式。第一列对应于所有个人的高度,第二列对应于它们的权重。类似地,剩余的行对应于其他人的高度和重量。 K-Means Clustering in OpenCV cv2.kmeans(data, K, bestLabels, criteria, attempts, flags[, cen...

    superPershing 评论0 收藏0
  • 用户地理位置的聚类算法实现—基于DBSCAN和Kmeans的混合算法

    摘要:聚类算法简介聚类的目标是使同一类对象的相似度尽可能地大不同类对象之间的相似度尽可能地小。用户地理位置信息的的聚类实现本实验用实现,依赖等科学计算。 1. 聚类算法简介 聚类的目标是使同一类对象的相似度尽可能地大;不同类对象之间的相似度尽可能地小。目前聚类的方法很多,根据基本思想的不同,大致可以将聚类算法分为五大类:层次聚类算法、分割聚类算法、基于约束的聚类算法、机器学习中的聚类算法和用...

    garfileo 评论0 收藏0
  • K-means在Python中的实现

    摘要:算法的关键在于初始中心的选择和距离公式。并行设置的实现算法,有其中表示用方式实现虽然有很多参数,但是都已经给出了默认值。 K-means算法简介 K-means是机器学习中一个比较常用的算法,属于无监督学习算法,其常被用于数据的聚类,只需为它指定簇的数量即可自动将数据聚合到多类中,相同簇中的数据相似度较高,不同簇中数据相似度较低。 K-menas的优缺点: 优点: 原理简单 速度快 ...

    nanfeiyan 评论0 收藏0

发表评论

0条评论

hankkin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<