K均值聚类

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

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

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

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

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

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

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

K均值聚类的基本步骤

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

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

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

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

  • 随机选取k个点作为分类的中心点。
  • 将每个数据点放到距离它最近的中心点所在的类中。
  • 重新计算各个分类的数据点的平均值,将该平均值作为新的分类中心点。
  • 重复步骤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()对它们分类。

主要步骤如下:

数据预处理

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

设置参数

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

调用函数cv2.kmeans()

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

确定分类

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

显示结果

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

完整程序:

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((num1, num2))
# 使用reshape函数将其转换为(120,1)  
num = num.reshape((120,1))  #每个数据为1列
# 转换为float32类型 
num = np.float32(num) 
# 调用kmeans模块 
# 设置参数criteria的值 
criteria = (cv2.TERM_CRITERIA_EPS   cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) 
# 设置参数flags的值 
flags = cv2.KMEANS_RANDOM_CENTERS 
# 调用函数kmeans 
retval, bestLabels, centers = cv2.kmeans(num,2, None, criteria,10, flags) 

# 打印返回值 
print(retval) 
print(bestLabels) 
print(centers) 

# 获取分类结果 
n1 = num[bestLabels==0] 
n2 = num[bestLabels==1] 
    
# 绘制分类结果 
# 绘制原始数据 
plt.plot(np.ones(len(n1)),n1,'ro') 
plt.plot(np.ones(len(n2)),n2,'bo') 
# 绘制中心点 
#plt.plot([1],centers[0],'rx') 
#plt.plot([1],centers[1],'bx') 
plt.show() 
 

例2:

有两种物体:

  • 物体1的长和宽都在 [0,20] 内
  • 物体2的长和宽都在[40,60] 内

使用随机数模拟两种物体的长度和宽度,并使用函数cv2.kmeans()对它们分类。

根据题目要求,主要步骤如下:

  • 随机生成数据,并将它们转换为函数cv2.kmeans()可以处理的形式。
  • 设置函数cv2.kmeans()的参数形式。
  • 调用函数cv2.kmeans()。
  • 根据函数cv2.kmeans()的返回值,确定分类结果。
  • 绘制经过分类的数据及中心点,观察分类结果。
import numpy as np 
import cv2 
from matplotlib import pyplot as plt 
# 随机生成两组数值 
#长和宽都在[0,20]内 
m1 = np.random.randint(0,20, (30,2)) 
#长和宽的大小都在[40,60] 
m2 = np.random.randint(40,60, (30,2)) 
# 组合数据 
m = np.vstack((m1, m2)) 
# 转换为float32类型 
m = np.float32(m) 
# 调用kmeans模块 
# 设置参数criteria值 
criteria = (cv2.TERM_CRITERIA_EPS   cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) 
# 调用kmeans函数 
ret, label, center=cv2.kmeans(m,2, None, criteria,10, cv2.KMEANS_RANDOM_CENTERS) 
    
''' 
#打印返回值 
print(ret) 
print(label) 
print(center) 
''' 
# 根据kmeans的处理结果,将数据分类,两大类 
res1 = m[label.ravel()==0] 
res2 = m[label.ravel()==1] 
# 绘制分类结果数据及中心点 
plt.scatter(res1[:,0], res1[:,1], c = 'g', marker = 's') 
plt.scatter(res2[:,0], res2[:,1], c = 'r', marker = 'o') 
plt.scatter(center[0,0], center[0,1], s = 200, c = 'b', marker = 'o') 
plt.scatter(center[1,0], center[1,1], s = 200, c = 'b', marker = 's') 
plt.xlabel('Height'), plt.ylabel('Width') 
plt.show() 

例3:

使用函数cv2.kmeans()将灰度图像处理为只有两个灰度级的二值图像。

需要对灰度图像内的色彩进行分类,将所有的像素点划分为两类。然后,用这两类的中心点像素值替代原有像素值,满足题目的要求。

主要步骤如下:

图像预处理

读取图像,并将图像转换为函数cv2.kmeans()可以处理的形式。

在读取图像时,如果是3个通道的RGB图像,需要将图像的RGB值处理为一个单独的特征值。具体实现时,用函数cv2.reshape()完成对图像特征值的调整。

为了满足函数cv2.kmeans()的要求,需要将图像的数据类型转换为numpy.float32类型。

设置函数cv2.kmeans()的参数形式

设置参数criteria的值为“(cv2.TERM_CRITERIA_EPS cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)”,让函数cv2.kmeans()在达到一定精度或者达到一定迭代次数时,即停止迭代。

设置参数K的值为2,将所有像素划分为两类

调用函数cv2.kmeans()

调用函数cv2.kmeans(),得到距离值、分类中心点和分类标签,用于后续操作。

值替换

将像素点的值替换为当前分类的中心点的像素值。

显示变换前后的图像

分别显示原始图像和二值化图像。

import numpy as np 
import cv2 
import matplotlib.pyplot as plt 
# 读取待处理图像 
img = cv2.imread('./img/hand2.png') 
# 使用reshape将一个像素点的RGB值作为一个单元处理 
data = img.reshape((-1,3))    # n行 3列
# 转换为kmeans可以处理的类型 
data = np.float32(data) 
# 调用kmeans模块 
criteria = (cv2.TERM_CRITERIA_EPS   cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) 
K =2 
ret, label, center=cv2.kmeans(data, K, None, criteria,10, cv2.KMEANS_RANDOM_CENTERS) 
    
# 转换为uint8数据类型,将每个像素点都赋值为当前分类的中心点像素值 
# 将center的值转换为uint8 
center = np.uint8(center) 
# 使用center内的值替换原像素点的值 
res1 = center[label.flatten()]   # 根据索引来取值,最后结果的大小同索引的大小
# 使用reshape调整替换后的图像 
res2 = res1.reshape((img.shape)) 
# 显示处理结果 
plt.subplot(121) 
plt.imshow(img[:,:,::-1]) 
plt.axis('off') 
plt.subplot(122) 
plt.imshow(res2[:,:,::-1]) 
plt.axis('off')
plt.show()

调整程序中的K值,就能改变图像的显示结果。例如,K=8,则可以让图像显示8个灰度级。

到此这篇关于python中opencv K均值聚类的实现示例的文章就介绍到这了,更多相关opencv K均值聚类内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

python中opencv K均值聚类的实现示例的更多相关文章

  1. iOS使用openCV检测来自摄像头的矩形

    如果我在处理它之前克隆matimage,通过记录它,它似乎处理图像甚至找到矩形,但矩形不会被绘制到图像输出到imageView.我很确定我错过了一些东西,可能是因为我没有正确传递某个对象,指向对象的指针等等,而我需要修改的对象则没有.无论如何,如果这不是正确的方法,我真的很感谢他们做这样的事情的教程或例子,使用openCV或GPUImage…它不需要尝试使用matimage来设置imageView.image,而只需要将matimage转换为在imageView中实际修改,因为CvVideoCamera已

  2. 使用Xcode为OS X Lion / Mountain Lion编译OpenCV(2.3.1)

    任何人都可以为我提供一些如何使用Xcode在OSXLion上编译OpenCV2.3.1的详细指南吗?我对此感到生气…我得到了源码,使用cmake创建Xcode模板并尝试构建它,但它失败了大约200个错误.提前致谢,大教堂解答我的回答帖子.解决方法详细指南如何使用MacPorts在Xcode4.2.1的OSXLion下启动和运行OpenCV2.3.1编辑08/06/2012:这也适用于OpenCV2.4.1.只需确保您获得最新版本的Xcode并安装“命令行工具”.编辑15/08/2012:使用Mountai

  3. ios – OpenCV构建问题,找不到ext/atomicity.h

    我得到编译器错误抱怨在构建包含OpenCV的项目时.环境是针对iOS的Xcode4.5.它为模拟器编译良好,但在为设备构建时失败.这是错误文本:我正在使用opencv2.framework,使用指令here构建cmake.解决方法默认情况下,XCode4.5使用libc(支持C11的LLVMC标准库)生成要构建的新项目.但OpenCV期望针对GNUlibstd

  4. 从IOS / iPad / iPhone的最大速度

    我使用OpenCVforiOS完成计算密集型应用程序.当然这很慢.但它比我的PC原型慢了200倍.所以我正在优化它.从最初的15秒,我能够获得0.4秒的速度.我想知道我是否找到了所有的东西以及别人想要分享的东西.我做了什么:>将OpenCV中的“double”数据类型替换为“float”.双倍是64位,32位cpu不能轻易处理,所以浮动给了我一些速度.OpenCV经常使用双倍.>为编译器选项添加了

  5. 在Swift iOS中使用OpenCV

    在我的xcode项目中添加OpenCV2框架后,我试图搜索samlpes或教程与swift集成。有什么好的教程同样吗?OpenCV是用C编写的框架。苹果的reference告诉我们YoucannotimportC++codedirectlyintoSwift.Instead,createanObjective-CorCwrapperforC++code.所以你不能在一个swift项目中直接导入和使用OpenCV,但这实际上并不坏,因为你(需要)继续使用框架的C语法,这是在网络上有很多文档。那么你怎么进行呢

  6. 在Android Studio中解决已弃用的NDK警告

    或者除了添加所有已编译的代码并设置我之前提到的标志之外,还有其他方法可以将OpenCV导入Android项目吗?任何有关这方面的帮助将不胜感激.解决方法我建议迁移到使用cmake的本机支持.您可以查看链接,该链接提供了使用cmake通过以下link添加OpenCV的分步教程.您的代码应该保持不变而不做任何更改,只有必要的操作才能弄清楚如何使用CMakeLists.txt将它们包含在构建过程中.

  7. android – opencv管理器包没找到?如何自动安装?

    我正在使用openCV,每当我运行代码时它都会给我包管理器没有安装,那么如何通过我的应用程序安装它.是必须从Play商店下载它还是我们可以在设备中自动安装它.请帮我.提前致谢.解决方法您需要使用静态初始化来包含apk中的所有OpenCV二进制文件.请参阅此文档:ApplicationDevelopmentwithStaticInitialization

  8. 如何从Android相机中找到框架的轮廓并将其转换为box2d实体?

    使用openframeworks,OpenCV和Box2D,我能够以良好的帧速率实现它.使用Android似乎是一项更复杂的任务(部分原因是我是JAVA新手).这就是我的开始:>使用“OpenCV示例–图像处理”并删除除“canny”效果之外的所有内容,这会产生一个漂亮的黑色&白色图像,非常适合找到轮廓.>从“OpenCVSample–color-blob-detection”中我抓住了在Mat中

  9. 在Android上的OpenCV中逐帧处理视频

    如果是的话,你知道任何例子.>编译适用于Android的FFMPEG也是一种选择.但是,我认为自己编写FrameGrabber和FrameRecorder有点过分.我认为除了JavaCV之外,还必须存在一些解决方案.>从API18开始,Android中有MediaCodec和Mediamuxer.也许他们可以帮助我?

  10. 使用opencv进行android角点跟踪

    当我相对于Android相机移动它时,我试图跟踪一张纸的角落的位置(您可以假设纸张将是与背景完全不同的颜色).我想找到android屏幕上每个角落的x,y坐标.我也希望能够改变纸张的角度,因此它不一定会一直呈现出完美的矩形.我正在使用opencv2.4.1forAndroid,但我在包中找不到cvgoodfeaturetotrack或cvfindcornersubpix.现在我正在考虑使用CvCa

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部