K-Means 聚类算法 参数解析

K-Means聚类算法的原理流程:

  • 第一步:确定K值,聚类成K个类簇。
  • 第二步:从数据中随机选择(或按照某种方式)K个数据点作为初始分类的中心。
  • 第三步:分别计算数据中每个点到每个中心的距离,将每个点划分到离中心最近的类中
  • 第四步:当每个中心都划分了一些点后,去每个类的均值,选出新的中心。
  • 第五步:比较新的中心和之前的中心,如果新的中心和之前的中心之间的距离小于某阈值,或迭代次数超过某阈值,认为聚类已经收敛,终止。
  • 第六步:否则继续迭代执行第三到五步,直到第五步满足。
函数原型:
retval, bestLabels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags, centers=None)
函数参数:
  • data: 需要分类数据,最好是np.float32的数据,每个特征放一列。

  • K: 聚类个数

  • bestLabels:预设的分类标签或者None

  • criteria:迭代停止的模式选择,这是一个含有三个元素的元组型数。格式为(type, max_iter, epsilon) 其中,type有如下模式:

    • cv2.TERM_CRITERIA_EPS :精确度(误差)满足epsilon,则停止。
    • cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过max_iter,则停止。
    • cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER:两者结合,满足任意一个结束。
  • attempts:重复试验kmeans算法次数,将会返回最好的一次结果

  • flags:初始中心选择,可选以下两种:

    • v2.KMEANS_PP_CENTERS:使用kmeans++算法的中心初始化算法,即初始中心的选择使眼色相差最大.详细可查阅kmeans++算法。(Use kmeans++ center initialization by Arthur and Vassilvitskii)
    • cv2.KMEANS_RANDOM_CENTERS:每次随机选择初始中心(Select random initial centers in each attempt.)
返回值:
  • compactness:紧密度,返回每个点到相应重心的距离的平方和

  • labels:结果标记,每个成员被标记为分组的序号,如 0,1,2,3,4…等

  • centers:由聚类的中心组成的数组

      import cv2
      import numpy as np
      import matplotlib.pyplot as plt
       
      #读取原始图像
      img = cv2.imread('img/autumn.png')
      print(img.shape)
      #(486, 654, 3)
      #图像二维像素转换为一维
      #转换成3列
      data = img.reshape((-1,3))
      data = np.float32(data)
       
      #定义终止条件 (type,max_iter,epsilon)
      criteria = (cv2.TERM_CRITERIA_EPS +
                  cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
       
      #设置初始中心的选择
      # flags = cv2.KMEANS_RANDOM_CENTERS
      flags = cv2.KMEANS_PP_CENTERS
       
      #K-Means聚类 聚集成4类
      compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)
       
      #图像转换回uint8二维类型
      centers = np.uint8(centers)
      res = centers[labels.flatten()]
      dst = res.reshape((img.shape))
       
      cv2.imwrite("img/autumn4.png",dst)
    

————————————————
版权声明:本文为CSDN博主「一只辛巴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lanshi00/article/details/104109963

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是对该函数代码的解析: ```matlab function [x,esq,j] = kmeans(d,k,x0) ``` 函数名称为`kmeans`,输入参数有三个:d,k,x0,输出参数有三个:x,esq,j。 ```matlab [n,m] = size(d); ``` 获取数据矩阵d的大小,n为样本数量,m为特征数量。 ```matlab x = x0; xnew = zeros(size(x)); j = 0; esq = 0; ``` 将初始聚类中心矩阵x赋值给变量x,初始化新的聚类中心矩阵xnew,迭代次数j设置为0,误差平方和esq初始化为0。 ```matlab while true j = j + 1; for i = 1:n [~,index] = min(sum((x - d(i,:)).^2,2)); xnew(index,:) = xnew(index,:) + d(i,:); end xnew = xnew./repmat(sum(xnew,1),[k,1]); if sum(sum((xnew - x).^2)) < 1e-6 break; end x = xnew; xnew = zeros(size(x)); end ``` 进入k-means算法主循环,每次循环迭代次数j加1。 遍历每个样本,计算其到每个聚类中心的距离,找到距离最近的聚类中心,并将该样本划分到该聚类中心所在的簇。 根据所有划分到同一个聚类中心的样本的坐标信息,计算该聚类中心簇内所有样本的均值,并将其作为新的聚类中心。 判断聚类中心是否收敛,如果新旧聚类中心之间的距离小于一个阈值(这里设为1e-6),则退出循环。 将新的聚类中心赋值给变量x,重置新的聚类中心矩阵xnew。 ```matlab for i = 1:n [~,index] = min(sum((x - d(i,:)).^2,2)); esq = esq + sum((d(i,:) - x(index,:)).^2); end ``` 计算最终聚类结果的误差平方和esq,遍历每个样本,计算其到所属聚类中心的距离,将距离的平方和累加到esq中。 最后,函数返回聚类中心矩阵x,误差平方和esq和迭代次数j。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值