一、欧氏距离
二维的公式
ρ = sqrt( (x1-x2)^2+(y1-y2)^2 )
三维的公式
ρ = sqrt( (x1-x2)^2+(y1-y2)^2+(z1-z2)^2 )
n维空间的公式
n维欧氏空间是一个点集,它的每个点 X 可以表示为 (x[1],x[2],…,x[n]) ,其中 x[i](i = 1,2,…,n) 是实数,称为 X 的第i个坐标,两个点 A = (a[1],a[2],…,a[n]) 和 B = (b[1],b[2],…,b[n]) 之间的距离 ρ(A,B) 定义为下面的公式。
ρ(A,B) =sqrt [ ∑( a[i] - b[i] )^2 ] (i = 1,2,…,n)
二、K均值算法
k均值(k-means)是聚类算法的一种,聚类分析是根据在数据中发现的描述对象及其关系的信息,将数据对象分组。其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的。组内的相似性越大,组间差别越大,聚类就越好。
举个例子,在二维平面上有几百个点,在笛卡儿坐标系中有(x,y)坐标,把它们点到纸上,问题是如何把它们分成不同组,每个组里点彼此之前都比较相近,而离其它组的成员又比较远。下面介绍的k均值就能干这种事。
基本k均值
基本k均值思想很简单,首先,选择k个初始质心,其中k是用户指定的参数,即所期望的簇的个数。每个点被指派到最近的质心,而指派到一个质心的点集为一个簇。然后根据指派到簇的点,更新每个簇的质心。重复指派和更新步骤,直到簇不发生变化,或等价的,直到质心不发生变化。
三、部分核心代码
'计算相似度,欧氏距离 xsd_label.Text = "" sumpic3 = 0 For myjj As Integer = 0 To 2000 If IsNothing(pic3tz(myjj)) Then Exit For End If sumpic3 += Pow(pic3tz(myjj) - sumpic1(myjj), 2) Next xsd1 = Sqrt(sumpic3) sumpic3 = 0 For myjj As Integer = 0 To 2000 If IsNothing(pic3tz(myjj)) Then Exit For End If sumpic3 += Pow(pic3tz(myjj) - sumpic2(myjj), 2) Next xsd2 = Sqrt(sumpic3) Dim mydis As Integer = kdistance.Text If mydis < 0 Then kdistance.Text = 50 mydis = 50 End If xsd_label.Text &= "与A类的距离:" & vbCrLf & xsd1 & vbCrLf xsd_label.Text &= "与B类的距离:" & vbCrLf & xsd2 & vbCrLf If xsd1 > mydis And xsd2 > mydis Then xsd_label.Text &= "不属A和B类" ElseIf xsd1 > xsd2 Then xsd_label.Text &= "属于B类" Else xsd_label.Text &= "属于A类" End If
程序见附件
下面是这个小程序对山水和瀑布图片的分类
A类是山水,B类是图片