机器学习:K-Means分割数据(添加了详细注释)

K-Means分割数据(添加了详细注释)

在opencv中kmenas算法对应的教程,代码

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
	Mat img(500, 500, CV_8UC3);
	img = Scalar::all(255);
	RNG rng(12345);//随机数发生器
	Scalar colorTab[] = {
	Scalar(0,0,255),
	Scalar(0,255,0),
	Scalar(255,0,0),
	Scalar(0,255,255),
	Scalar(255,0,255)
	};//用于数据点的颜色显示
	int numCluster = rng.uniform(2, 5);//聚类个数4
	printf("number of cluster is %d\n",numCluster);
	int samplecount = rng.uniform(2, 1000);//随机生成samplecount个数据点591
	Mat points(samplecount, 1, CV_32FC2);//samplecount个float类型的数据点,以矩阵的形势呈现
	Mat labels;//kmeans算法后的label标签,里面存储了0,1,2,3四个像素值(有591个)(1x591)
	Mat centors;//中心点
	//生成随机数
	for (int k = 0; k < numCluster; k++)
	{
		//初始化中心点
		Point center;
		center.x = rng.uniform(0,img.cols);
		center.y = rng.uniform(0,img.rows);
		//cout << center << endl;
		//打印初始化中心点
		//circle(img, center, 7, Scalar(0, 0, 255), -1, 8);
		//Mat区块访问,只是创建数据头,改变同时改变
		//这把数据点分成四份
		Mat pointchunk = points.rowRange(k * samplecount / numCluster, k == numCluster - 1 ? samplecount : (k + 1) * samplecount / numCluster);
		//rng.fill对每个数据点进行赋值,使得数据点具有不同的,CV_32FC2的像素值范围
		//NORMAL是高斯分布,
		rng.fill(pointchunk,RNG::NORMAL,Scalar(center.x,center.y),Scalar(img.cols*0.05,img.rows*0.05));
	}
	//以上产生了四个以中心点位均值的四个聚类数据
	//cout << points << endl;
	//作用:将原数组(矩阵)打乱
	randShuffle(points,1,&rng);
	//cout << points << endl;
	//kmeans分类后,每个一类数据产生一个标签(0,1,2,3……)
	kmeans(points,numCluster,labels,TermCriteria(TermCriteria::EPS+TermCriteria::COUNT,10,0.1),3,KMEANS_PP_CENTERS,centors);
	//用不同值显示
	for (int i = 0; i < samplecount; i++)
	{
		int index = labels.at<int>(i);
		Point p = points.at<Point2f>(i);
		circle(img, p, 2, colorTab[index], -1, 8);
	}
	//每个聚类数据中心点显示
	for (size_t i = 0; i < centors.rows; i++)
	{
		float x = centors.at<float>(i, 0);
		float y = centors.at<float>(i, 1);
		circle(img,Point2f(x,y),8,colorTab[i],-1,8);

	}
	imshow("img", img);
	waitKey(0);
	return 0;

}
运用K-means算法进行图像分割, K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。 k个初始类聚类中心的选取对聚类结果具有较大的 公式 公式 影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,J的值没有发生变化,说明算法已经收敛。 算法过程如下: 1)从N个文档随机选取K个文档作为质心 2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 3)重新计算已经得到的各个类的质心 4)迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束 具体如下: 输入:k, data[n]; (1) 选择k个初始中心,例如c[0]=data[0],…c[k-1]=data[k-1]; (2) 对于data[0]….data[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i; (3) 对于所有标记为i,重新计算c[i]={ 所有标记为i的data[j]之和}/标记为i的个数; (4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值。 折叠工作原理 K-MEANS算法的工作原理及流程 K-MEANS算法 输入:聚类个数k,以及包含 n个数据对象的数据库。 输出:满足方差最小标准的k个聚类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值