opencv K均值聚类(python)

本文深入探讨了K均值聚类算法,包括其基本步骤、无监督学习的特点以及在分类和回归任务中的区别。通过OpenCV库的cv2.kmeans()函数,展示了如何在Python中实现K均值聚类,并提供了三个具体的应用示例:一是对随机生成数据的分类,二是对二维数据点的分组,三是将灰度图像二值化。通过对不同数据集的处理,说明了K均值聚类在实际问题中的应用和效果。

K均值聚类

  • 预测的是一个离散值时,做的工作就是“分类”。

  • 预测的是一个连续值时,做的工作就是“回归”。

机器学习模型还可以将训练集中的数据划分为若干个组,每个组被称为一个“簇(cluster)”。这种学习方式被称为“聚类(clusting)”,它的重要特点是在学习过程中不需要用标签对训练样本进行标注。也就是说,学习过程能够根据现有训练集自动完成分类(聚类)。

根据训练数据是否有标签,可以将学习划分为监督学习和无监督学习。

K近邻、支持向量机都是监督学习,提供有标签的数据给算法学习,然后对数据分类

聚类是无监督学习,事先并不知道分类标签是什么,直接对数据分类。

聚类能够将具有相似属性的对象划分到同一个集合(簇)中。

聚类方法能够应用于所有对象,簇内的对象越相似,聚类算法的效果越好。

K均值聚类的基本步骤

K均值聚类是一种将输入数据划分为k个簇的简单的聚类算法,该算法不断提取当前分类的中心点(也称为质心或重心),并最终在分类稳定时完成聚类。

从本质上说,K均值聚类是一种迭代算法。

在实际处理过程中需要进行多轮的迭代,直到分组稳定不再发生变化,即可认为分组完成。

K均值聚类算法的基本步骤如下:

  1. 随机选取k个点作为分类的中心点。
  2. 将每个数据点放到距离它最近的中心点所在的类中。
  3. 重新计算各个分类的数据点的平均值,将该平均值作为新的分类中心点。
  4. 重复步骤2和步骤3,直到分类稳定。

可以是随机选取k个点作为分类的中心点,也可以是随机生成k个并不存在于原始数据中的数据点作为分类中心点。

距离最近: 要进行某种形式的距离计算。(在具体实现时,可以根据需要采用不同形式的距离度量方法。)

K均值聚类模块

OpenCV提供了函数cv2.kmeans()来实现K均值聚类。

该函数的语法格式为:

retval, bestLabels, centers=cv2.kmeans(data, K, bestLabels, criteria, attempts, 
flags) 
  • data:输入的待处理数据集合,应该是np.float32类型,每个特征放在单独的一列中。
  • K:要分出的簇的个数,即分类的数目,最常见的是K=2,表示二分类。
  • bestLabels:表示计算之后各个数据点的最终分类标签(索引)。实际调用时,参数bestLabels的值设置为None。
  • criteria:算法迭代的终止条件。当达到最大循环数目或者指定的精度阈值时,算法停止继续分类迭代计算。该参数由3个子参数构成,分别为type、max_iter和eps。
    • type表示终止的类型,可以是三种情况
      • cv2.TERM_CRITERIA_EPS:精度满足eps时,停止迭代。
      • cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过阈值max_iter时,停止迭代。
      • cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER:上述两个条件中的任意一个满足时,停止迭代。
    • max_iter:最大迭代次数。
    • eps:精确度的阈值。
  • attempts:在具体实现时,为了获得最佳分类效果,可能需要使用不同的初始分类值进行多次尝试。指定attempts的值,可以让算法使用不同的初始值进行多次(attempts次)尝试。
  • flags:表示选择初始中心点的方法,主要有以下3种。
    • cv2.KMEANS_RANDOM_CENTERS:随机选取中心点。
    • cv2.KMEANS_PP_CENTERS:基于中心化算法选取中心点。
    • cv2.KMEANS_USE_INITIAL_LABELS:使用用户输入的数据作为第一次分类中心点;如果算法需要尝试多次(attempts 值大于1时),后续尝试都是使用随机值或者半随机值作为第一次分类中心点。
  • retval:距离值(也称密度值或紧密度),返回 每个点到相应中心点距离的平方和(是一个数)。
  • bestLabels:各个数据点的最终分类标签(索引)。
  • centers:每个分类的中心点数据。
简单例子

例1:

随机生成一组数据,使用函数cv2.kmeans()对其分类。

  • 一组数据在[0,50]区间

  • 另一组数据在[200,250]区间

  • 使用函数cv2.kmeans()对它们分类。

主要步骤如下:

  1. 数据预处理

    使用随机函数随机生成两组数据,并将它们转换为函数cv2.kmeans()可以处理的格式。

  2. 设置参数

    设置函数cv2.kmeans()的参数形式。将参数criteria的值设置为“(cv2.TERM_CRITERIA_EPS+ cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)”,在达到一定次数或者满足一定精度时终止迭代。

  3. 调用函数cv2.kmeans()

    调用函数cv2.kmeans(),获取返回值,用于后续步骤的操作。

  4. 确定分类

    根据函数cv2.kmeans()返回的标签(“0”和“1”),将原始数据分为两组

  5. 显示结果

    绘制经过分类的数据及中心点,观察分类结果。

完整程序:

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
# 随机生成两组数组 
# 生成60个值在[0,50]内的数据 
num1 = np.random.randint(0,50,60) 
# 生成60个值在[200,250]内的数据 
num2 = np.random.randint(200,250,60) 
# 组合数据为num
num = np.hstack<
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴风雨中的白杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值