欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

如何使用Halcon脚本轻松实现一维K-Means聚类算法示例

最编程 2024-02-06 15:20:30
...
kmeans(:: Props, K, Num : Classification)
N := |Props|-1

Seeds :=[]
for i := 0 to K-1 by 1
    tuple_rand(1,Rand)
    tuple_floor(Rand*N,seed)
    tuple_int(seed,seed)
    tuple_find(Seeds,seed, Indices)
    while(|Indices|>0 and Indices # -1)
        tuple_rand(1,Rand)
        tuple_floor(Rand*N,seed)
        tuple_find(Seeds,seed, Indices)
    endwhile
    Seeds :=[Seeds, seed]
    stop()
endfor

PSeeds :=Props[Seeds]

iterNum := 0
tuple_gen_const(N+1, -1, Classification)
tuple_max(Props,Max)
tuple_min(Props,Min)
delta := Max-Min
while(iterNum<Num)
    
    tuple_gen_const(N+1, -1, ClassificationNew)
    for j := 0 to N by 1
        Mini := delta
        for i := 0 to K-1 by 1            
           tuple_fabs(PSeeds[i] - Props[j],d)
           if(d<=Mini)
               ClassificationNew[j] := i
               Mini := d
           endif
*            stop()
        endfor
    endfor
    Classification := ClassificationNew
    for i := 0 to K-1 by 1
        tuple_find(Classification,i,Indices1)
        tuple_mean(Props[Indices1],Mean) 
        if(PSeeds[i] = Mean)
            break
        else
            PSeeds[i] := Mean
        endif
    endfor
    iterNum := iterNum + 1 
endwhile
return ()

 以上代码简单实现了kmeans聚类算法,算法原理如下:

输入:样本数据集DD,聚类簇数k 
(1) 从样本中随机选取k个样本点作为初始的均值向量{μ1,μ2,⋯,μk}{μ1,μ2,⋯,μk} 
(2)循环以下几步直到达到停止条件: 
(2.1)令Ci=∅(1≤i≤k)Ci=∅(1≤i≤k) 
(2.2)对所有样本点计算他们到k个均值向量之间的距离,取其中距离最短的距离对应的均值向量的标记作为该点的簇标记,然后将该点加入相应的簇CiCi 
(2.3)对每一个簇计算他们新的均值向量μi=1|Ci|∑x∈Cixμi=1|Ci|∑x∈Cix,如果相比之前的向量有变化,就更新,将其作为新的均值向量,如果没有变化就不变