机器学习初探:OpenCV K均值代码笔记
来源:互联网 发布:网络女歌手名单大全 编辑:程序博客网 时间:2024/06/05 14:42
我们可以从图中了解K均值算法的聚类过程:
(a) 随机放置聚类中心(圆),将数据样本(小方块)聚到离它最近的中心(即连线)
(b) 数据中心移到它所在类别的中心
(c) 数据点根据最近邻规则重新聚到类别中心(如b中最右圆的一个样本,在c中被聚到了下方圆中)
(d) 聚类中心再次移动到它所在的类别中心
持续运行直到收敛,我们便将样本点(小方块)聚为三类(圆)。
OpenCV Sample中的kmeans代码,随机产生不超过5种的类别,以及1000个点。
#include "cv.h"#include "highgui.h"#include <stdio.h>int main( int argc, char** argv ){ #define MAX_CLUSTERS 5 CvScalar color_tab[MAX_CLUSTERS]; IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 ); CvRNG rng = cvRNG(-1); CvPoint ipt; color_tab[0] = CV_RGB(255,0,0); color_tab[1] = CV_RGB(0,255,0); color_tab[2] = CV_RGB(100,100,255); color_tab[3] = CV_RGB(255,0,255); color_tab[4] = CV_RGB(255,255,0); cvNamedWindow( "clusters", 1 ); for(;;) { char key; int k, cluster_count = cvRandInt(&rng)%MAX_CLUSTERS + 1; int i, sample_count = cvRandInt(&rng)%1000 + 1; CvMat* points = cvCreateMat( sample_count, 1, CV_32FC2 ); CvMat* clusters = cvCreateMat( sample_count, 1, CV_32SC1 ); cluster_count = MIN(cluster_count, sample_count); /* generate random sample from multigaussian distribution */ for( k = 0; k < cluster_count; k++ ) { CvPoint center; CvMat point_chunk; center.x = cvRandInt(&rng)%img->width; center.y = cvRandInt(&rng)%img->height; cvGetRows( points, &point_chunk, k*sample_count/cluster_count, k == cluster_count - 1 ? sample_count : (k+1)*sample_count/cluster_count, 1 ); cvRandArr( &rng, &point_chunk, CV_RAND_NORMAL, cvScalar(center.x,center.y,0,0), cvScalar(img->width*0.1,img->height*0.1,0,0)); } /* shuffle samples */ for( i = 0; i < sample_count/2; i++ ) { CvPoint2D32f* pt1 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count; CvPoint2D32f* pt2 = (CvPoint2D32f*)points->data.fl + cvRandInt(&rng)%sample_count; CvPoint2D32f temp; CV_SWAP( *pt1, *pt2, temp ); } printf( "iterations=%d\n", cvKMeans2( points, cluster_count, clusters, cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0 ), 5, 0, 0, 0, 0 )); cvZero( img ); for( i = 0; i < sample_count; i++ ) { int cluster_idx = clusters->data.i[i]; ipt.x = (int)points->data.fl[i*2]; ipt.y = (int)points->data.fl[i*2+1]; cvCircle( img, ipt, 2, color_tab[cluster_idx], CV_FILLED, CV_AA, 0 ); } cvReleaseMat( &points ); cvReleaseMat( &clusters ); cvShowImage( "clusters", img ); key = (char) cvWaitKey(0); if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC' break; } cvDestroyWindow( "clusters" ); return 0;}
在最外层for循环之前,我们定义了5种颜色color_tab,类别的上届MAX_CLUSTERS。
在循环中,随机产生了cluster_count个类别,以及sample_count个样本点。
同时,建立了points来存放样本点,clusters来存放每个样本点的类别。
其中cvCreateMat的第一个参数为矩阵的行数,第二个为列数。CV_32FC2表示矩阵的元素为32位浮点二元组,即我们的Point。
在数据生成的for循环中,point存放所有样本的信息,我们需要将将样本分类并随机赋值。
cvGetRows根据该次迭代的当前类别k,得到points中的对应子矩阵point_chunk。每个类别行数为sample_count/cluster_count。
接着,使用cvRandArr为该子矩阵使用正态分布随机赋值。
下一个for循环中,打乱了数据样本的顺序。
我们可以看到,pt1,pt2是points中随机选取的样本点,并进行了交换。
然后,使用了cvKmeans2()进行聚类,知道聚类中心的最大移动小于1停止。最后用for循环画出结果。
让我们执行程序,看一下聚类结果吧!
----------------------------------
作者:小斤(陈忻)
本文属于原创文章,如需转载引用请注明原文作者和链接,谢谢。
- 机器学习初探:OpenCV K均值代码笔记
- 机器学习初探:OpenCV K均值代码笔记
- OpenCV K均值代码笔记
- OpenCV学习笔记(11)-K均值
- OpenCV学习笔记(11)-K均值
- 机器学习---K均值
- 【学习笔记】机器学习-K均值(k-means)
- 机器学习笔记(10)-K-均值(K-means)
- 机器学习10k均值
- 机器学习笔记十六 K-均值聚类算法
- 《机器学习实战》代码片段学习6 k均值聚类与二分k均值聚类
- opencv K均值法代码 kmeans()
- Opencv Python版学习笔记(七)k均值-k-means
- 机器学习练习之k均值
- 机器学习K均值聚类 python
- 机器学习算法总结--K均值算法
- 机器学习:k均值聚类
- 机器学习15-k-均值算法表述
- 光脚丫学LINQ(024):如何通过修改DBML文件生成自定义代码
- dbm
- 通过vb.net程序隐藏wince系统的任务栏
- 我从来都不想"默默无为",要有所作为就要搞点新东西”
- const用法
- 机器学习初探:OpenCV K均值代码笔记
- VC带GBK编码的字符串拷贝函数,防止截取半个中文字符的情况发生
- 办公室潜规则
- NetBeans 时事通讯(刊号 # 116 - Sep 11, 2010)
- 配置文件(Web.Config)加密解密详细说明
- 中文乱码和过滤器
- VC正则表达式的使用
- 修改网页查看源代码的编辑器
- ACPI 高级配置与电源接口