2 遍历所有数据,将每个数据划分到最近的中心点中
3 计算每个聚类的平均值,并圆租察作为新的中心点
4 重复2-3,直到这k个中线点不再变化(收敛了),橘茄或执行了足够多的迭代
时间复杂度:O(I*n*k*m)
空间复杂度:O(n*m)
其中m为每个元素字段个数,n为数据量,I为跌打个数。一般I,k,m均可认为是常量,所以时间和空间复杂度可以简化为O(n),即线性的。型歼
matlab的伏裂silhouette函数,版本r2014a
例子为clus=4,好行也就是分四类的数据情况,需要先学会用kmeans函数。
a1=randn(100,1)
clus=4
[typename,Ctrs]=kmeans(a1,clus)
silhouette(a1,typename) %计算边缘系数,也可以用缺袜闭s=silhouette(a1,typename) 这种形式获取每个数据的轮廓值
给你提供个思路吧。首先我假设你提取出的圆轮廓还算比较歼数规整,圆度不至于偏差太大。
你只需要求出最大内切圆和最小外接圆即可。算法比较容易设计,简单来看可以分为三部分:
1)确定圆心。首先,你先填充原来的轮廓图,获得一个实心的圆。然后,统计这个圆的质心。
程序写起来很容易,就是x放心和y放心各自按照坐标加权平均而已。
2)求最大内切圆。在上一步获得的圆心基础上,计算出最大的半径值,使得以此半径构成的圆被最大地包含差改轮在原始的轮廓圆内部。这种包含虚信关系直接使用俩图做差看剩余像素点是否在内切圆内即可。
3)最小外接圆。基本思路同2)。只不过这里要找一个最小的半径值,使得以此半径构成的圆最小地包含原始的轮廓圆。包含关系与2)类似,不再啰嗦。
2)、3)完成之后,问题就解决了。用matlab写成代码应该比较容易,你自己应该能做。
当然,以上的算法求出的圆心可能需要微调一下,即你在进行2)和3)时,需要在算出的圆心附近做一下简单的搜索,以获得一个最优的未知,这个是小trick,注意下即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)