资讯专栏INFORMATION COLUMN

OpenCV4机器学习(六):K-means原理及实现

Xufc / 910人阅读

摘要:均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。对分配在每个集合中样本,求样本均值,并作为当前的类别中心。

前言:

本专栏主要结合OpenCV4,来实现一些基本的图像处理操作、经典的机器学习算法(比如K-Means、KNN、SVM、决策树、贝叶斯分类器等),以及常用的深度学习算法。

系列文章,持续更新:


一、基本介绍

K-means,即K均值, 是一种迭代求解的聚类算法。聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。

K 均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目 K,K 由用户指定,K 均值算法根据某个距离函数反复把数据分入 K 个聚类中。

二、算法原理

对于给定的数据集,通过K-means方法进行聚类的流程如下:

  • 初始化K个聚类中心。
  • 样本分配。将每个样本放入与其最近的类别中心所在的集合。通过设定的距离函数来判断样本距离哪个中心最近,并放入对应的样本中。距离函数一般采用:欧式距离、曼哈顿距离、闵可夫斯基距离、汉明距离。
  • 更新类别中心。对分配在每个集合中样本,求样本均值,并作为当前的类别中心。
  • 判断终止条件。 判断类别标签是否达到收敛精度或达到训练轮数。

三、函数解释

在 OpenCV4 中,cv::kmeans 函数实现了 K-means,该算法找到 K 个类别的中心,并对类别周围的输入样本进行分组。

cv::kmeans 函数定义如下:

double cv::kmeans(InputArray data,  //样本				  int K, //类别数				  InputOutputArray bestLabels,  //输出整数数组,用于存储每个样本的聚类类别索引				  TermCriteria criteria,  //算法终止条件:即最大迭代次数或所需精度				  int attempts,  //用于指定使用不同初始标记执行算法的次数				  int flags,  //初始化均值点的方法				  OutputArray centers = noArray()  //聚类中心的输出矩阵,每个聚类中心占一行				  )

四、实战演示

下面将演示一个示例,采用 OpenCV 中的 kmeans() 方法对二维坐标点集进行聚类。

#include#includeusing namespace std;using namespace cv;int main() {	const int MAX_CLUSTERS = 5; //最大类别数	Scalar colorTab[] = {   //绘图颜色						 Scalar(0, 0, 255),						 Scalar(0, 255, 0),						 Scalar(255, 100, 100),						 Scalar(255, 0, 255),						 Scalar(0, 255, 255)						};	Mat img(500, 500, CV_8UC3); //新建画布	img = Scalar::all(255); //将画布设置为白色	RNG rng(35345); //随机数产生器	//初始化类别数	int clusterCount = rng.uniform(2, MAX_CLUSTERS + 1);	//在指定区间,随机生成一个整数,样本数	int sampleCount = rng.uniform(1, 1001);	//输入样本矩阵:sampleCount行x1列, 浮点型,2通道	Mat points(sampleCount, 1, CV_32FC2);	Mat labels; 	//聚类类别数 < 样本数	clusterCount = MIN(clusterCount, sampleCount); 	//聚类结果索引矩阵	vector<Point2f> centers;	//随机生成多高斯分布的样本	//for (int k = 0; k < clusterCount; k++) {	Point center;	center.x = rng.uniform(0, img.cols);	center.y = rng.uniform(0, img.rows);	//对样本points指定进行赋值	Mat pointChunk = points.rowRange(0, sampleCount / clusterCount);				//以center为中心,产生高斯分布的随机点,把坐标点保存在 pointChunk 中	rng.fill(pointChunk, RNG::NORMAL, Scalar(center.x, center.y), Scalar(img.cols*0.05, img.rows*0.05));	//打乱points中的值	randShuffle(points, 1, &rng);	//执行k-means	double compactness = kmeans(points,  //样本								clusterCount, //类别数								labels,  //输出整数数组,用于存储每个样本的聚类类别索引								TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0),  //算法终止条件:即最大迭代次数或所需精度								3, //用于指定使用不同初始标记执行算法的次数								KMEANS_PP_CENTERS, //初始化均值点的方法								centers); //聚类中心的输出矩阵,每个聚类中心占一行				//绘制或输出聚类结果	for (int i = 0; i < sampleCount; i++) {		int clusterIdx = labels.at<int>(i);		Point ipt = points.at<Point2f>(i);		circle(img, ipt, 2, colorTab[clusterIdx], FILLED, LINE_AA);	}	//以聚类中心为圆心绘制圆形	for (int i = 0; i < (int)centers.size(); ++i) {		Point2f c = centers[i];		circle(img, c, 40, colorTab[i], 1, LINE_AA);	}	cout << "Compactness: " << compactness << endl;	imshow("clusters", img);	waitKey(0);	return 0;}

聚类结果如下图所示:


本专栏所有完整的代码将在我的GitHub仓库上更新,欢迎大家前往学习:

进入GitHub仓库,点击 star (红色箭头所示),第一时间获取干货:

最好的关系是互相成就,各位的「三连」就是【AI 菌】创作的最大动力,我们下期见!

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

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

相关文章

  • OpenCV4机器学习(七):KNN 原理实现

    摘要:前言本专栏主要结合,来实现一些基本的图像处理操作经典的机器学习算法比如决策树贝叶斯分类器等,以及常用的深度学习算法。现在设定,并计算到待测样本最近的个样本有个苹果和个梨子,距离分别为。 ...

    Mr_zhang 评论0 收藏0
  • OpenCV4机器学习(五):标注文字和矩形框

    摘要:系列文章,持续更新机器学习一环境搭建与配置机器学习二图像的读取显示与存储机器学习三颜色空间之间的转换机器学习四图像的几何变换仿射变换一基本介绍在处理图像任务中,比如目标检测,通常想会将检测到的结果通过框和文字的形式显示出来。 ...

    wyk1184 评论0 收藏0
  • 机器学习-积累与发现继续

    摘要:一机器学习基础概率论数据挖掘中所需的概率论与数理统计知识理解与之间的权衡是不同训练模型之间的差别,好比之中,如果不同模型之间差别很大大,也就是说他们都和自己的训练集与其他训练集不接近,所以,不同模型之间很大他们就都不是而如果很大,不用 一、机器学习 基础 概率论-wiki 数据挖掘中所需的概率论与数理统计知识 理解 Bias 与 Variance 之间的权衡//var是不同训练模型之间...

    vvpvvp 评论0 收藏0
  • 机器学习入门

    摘要:机器学习是需要更多的计算资源及数据量支撑,计算前无需预设过多条件,运算过程会不断迭代,直至收敛。 showImg(https://segmentfault.com/img/remote/1460000019236033); 随着人工智能的火热,数据科学领域逐渐被人们所熟知,相信你肯定也听说过诸如一些机器学习,深度学习之类让人听不懂的术语,而随着概念的火热,想进入人工智能这个领域的人越来...

    xietao3 评论0 收藏0
  • 机器学习和深度学习

    摘要:机器学习进阶笔记之十那些上好玩的黑科技是基于进行研发的第二代人工智能学习系统,被广泛用于语音识别或图像识别等多项机器深度学习领域。目前的深度学习的研究领域主要有以下类人群。 特征选择 当数据预处理完成后,我们需要选择有意义的特征,输入机器学习的算法模型进行训练。 TensorFlow实现seq2seq 前言 前面在《深度学习的seq2seq模型》文章中已经介绍了seq2seq结构及其原...

    joyvw 评论0 收藏0

发表评论

0条评论

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