KMeans方法概述
. 无监督学习方法
. 分类问题,输入分类数目,初始化中心位置
. 硬分类方法,以距离度量
. 迭代分类为聚类

  

//----------
//迭代算法的终止准则
//----------
TermCriteria(
  int type,
     //type=TermCriteria::MAX_ITER/TermCriteria::COUNT 迭代到最大迭代次数终止
  //type= TermCriteria::EPS 迭代到阈值终止
  //type= TermCriteria::MAX_ITER+ TermCriteria::EPS 上述两者都作为迭代终止条件
  int maxCount, //迭代的最大次数
  double epsilon // 阈值(中心位移值)
);
//----------
//按照给定的类别数目对样本集合进行聚类
//----------
void cvKMeans2(
  const CvArr* samples,   //输入样本的浮点矩阵,每个样本一行。
  int cluster_count,     //所给定的聚类数目
  CvArr* labels,       //输出整数向量:每个样本对应的类别标识
  CvTermCriteria termcrit  //指定聚类的最大迭代次数和/或精度(两次迭代引起的聚类中心的移动距离)
)

#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std; int main(int argc, char** argv) {
Mat img(, , CV_8UC3);
RNG rng(); //scalar是将图像设置成单一灰度和颜色
Scalar colorTab[] = {
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , ),
Scalar(, , )
}; //分类个数
int numCluster = rng.uniform(, );
printf("number of clusters : %d\n", numCluster); //取10-100个随机样本
int sampleCount = rng.uniform(, );
//每一列至少两个数
Mat points(sampleCount, , CV_32FC2);
Mat labels;
Mat centers; // 生成随机数
for (int k = ; k < numCluster; k++) {
Point center;
center.x = rng.uniform(, img.cols);
center.y = rng.uniform(, img.rows);
//行,给随机点
Mat pointChunk = points.rowRange(k*sampleCount/numCluster, k == numCluster - ? sampleCount : (k + )*sampleCount / numCluster); //用随机数填充矩阵
rng.fill(pointChunk, RNG::NORMAL, Scalar(center.x, center.y), Scalar(img.cols*0.05, img.rows*0.05));
}
//算法打乱元素排列顺序
randShuffle(points, , &rng); // 使用KMeans
kmeans(points, numCluster, labels, TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, , 0.1/*最小值*/), /*次数*/, KMEANS_PP_CENTERS, centers); // 用不同颜色显示分类
//初始化图片颜色。
img = Scalar::all();
for (int i = ; i < sampleCount; i++) {
int index = labels.at<int>(i);
//获取ponint点
Point p = points.at<Point2f>(i);
//填充
circle(img, p, , colorTab[index], -, );
} // 每个聚类的中心来绘制圆
for (int i = ; i < centers.rows; i++) {
int x = centers.at<float>(i, );
int y = centers.at<float>(i, );
printf("c.x= %d, c.y=%d", x, y);
circle(img, Point(x, y), , colorTab[i], , LINE_AA);
} imshow("KMeans-Data-Demo", img);
waitKey();
return ;
}

最新文章

  1. Apache Lucene(全文检索引擎)—搜索
  2. JavaScript中一些常用的方法整理
  3. github代码收集推荐
  4. ZOJ 3494 BCD Code(AC自动机+数位DP)
  5. Android的四大组件
  6. devexpress13学习系列(一)PDFViewer(2)
  7. 【练习】trace文本重建控制文件
  8. 学习资料 经典SQL语句大全
  9. VS2010之MFC串口通信的编写教程
  10. ab做压力测试
  11. Nagios : Verifying Your Configuration
  12. easyui源码翻译1.32--Tree(树)
  13. uva 725 Division(除法)暴力法!
  14. jquery无法为动态生成的元素添加点击事件的解决方法
  15. Linux - atexit()(注册终止)函数
  16. Codeforces Round #418 (Div. 2).C two points
  17. DBA 小记 — 分库分表、主从、读写分离
  18. vue路由动态加载
  19. element ui表格相同内容自动合并
  20. 【2016.3.16】作业 VS2015安装&amp;单元测试(1)

热门文章

  1. 使用AVFoundation完成照片拍摄存储相册, 开启关闭闪光灯, 切换摄像头
  2. rust 高级话题
  3. pycharm 字符编码错误处理
  4. tmux:终端复用神器
  5. matplotlib画3D图修改X,Y,Z,colorbar的刻度值
  6. 20.Java基础_对象的构造函数
  7. python-使用skimage显示图片
  8. 训练自己数据-xml文件转voc格式
  9. python中实现单例模式
  10. iOS应用卡顿分析