張慧的博客

          張慧的博客

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            45 Posts :: 0 Stories :: 24 Comments :: 0 Trackbacks

           一、歐氏距離

          二維的公式

            ρ = sqrt( (x1-x2)^2+(y1-y2)^2 )

          三維的公式

            ρ = sqrt( (x1-x2)^2+(y1-y2)^2+(z1-z2)^2 )

          n維空間的公式

            n維歐氏空間是一個(gè)點(diǎn)集,它的每個(gè)點(diǎn) X 可以表示為 (x[1],x[2],…,x[n]) ,其中 x[i](i = 1,2,…,n) 是實(shí)數(shù),稱為 X 的第i個(gè)坐標(biāo),兩個(gè)點(diǎn) 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)是聚類算法的一種,聚類分析是根據(jù)在數(shù)據(jù)中發(fā)現(xiàn)的描述對(duì)象及其關(guān)系的信息,將數(shù)據(jù)對(duì)象分組。其目標(biāo)是,組內(nèi)的對(duì)象相互之間是相似的,而不同組中的對(duì)象是不同的。組內(nèi)的相似性越大,組間差別越大,聚類就越好。

          舉個(gè)例子,在二維平面上有幾百個(gè)點(diǎn),在笛卡兒坐標(biāo)系中有(x,y)坐標(biāo),把它們點(diǎn)到紙上,問(wèn)題是如何把它們分成不同組,每個(gè)組里點(diǎn)彼此之前都比較相近,而離其它組的成員又比較遠(yuǎn)。下面介紹的k均值就能干這種事。

           

          基本k均值

          基本k均值思想很簡(jiǎn)單,首先,選擇k個(gè)初始質(zhì)心,其中k是用戶指定的參數(shù),即所期望的簇的個(gè)數(shù)。每個(gè)點(diǎn)被指派到最近的質(zhì)心,而指派到一個(gè)質(zhì)心的點(diǎn)集為一個(gè)簇。然后根據(jù)指派到簇的點(diǎn),更新每個(gè)簇的質(zhì)心。重復(fù)指派和更新步驟,直到簇不發(fā)生變化,或等價(jià)的,直到質(zhì)心不發(fā)生變化。

           

          三、特征提取

           

          1、第一步,參照網(wǎng)上曾經(jīng)有人的做法:

          為簡(jiǎn)單起見(jiàn),我們使用了最簡(jiǎn)單的圖像特征——黑色像素在圖像中的分布來(lái)進(jìn)行訓(xùn)練和測(cè)試。首先,我們把圖像規(guī)范化為 32*32 像素的圖片,然后按 2*2 分切成 16*16 共 256 個(gè)子區(qū)域,然后統(tǒng)計(jì)這 4 個(gè)像素中黑色像素的個(gè)數(shù),組成 256 維的特征矢量,如下是數(shù)字 2 的一個(gè)特征矢量:
          0 0 4 4 4 2 0 0 0 0 0 0 0 0 2 4 0 0 4 4 4 2 0 0 0 0 0 0 0 0 2 4 2 2 4 4 2 1 0 0 0 0 0 0 1 2 3 4 4 4 4 4 0 0 0 0 0 0 0 0 2 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 2 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 2 2 2 2 2 2 2 4 4 2 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 0 2 4 4 4 2 2 2 2 4 3 2 2 2 2 2 0 2 4 4 4 0 0 0 0 4 2 0 0 0 0 0 0 2 4 4 4 0 0 0 0 4 2 0 0 0 0 0 0 2 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 2 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 2 4 4 4
          相應(yīng)地,因?yàn)槲覀冎恍枰R(shí)別 0~9 共 10 個(gè)數(shù)字,所以創(chuàng)建一個(gè) 10 維的矢量作為結(jié)果,數(shù)字相應(yīng)的維置為 1 值,其它值為 0。數(shù)字 2 的結(jié)果如下:0 0 1 0 0 0 0 0 0 0

          核心代碼為:

          Vb.net代碼  收藏代碼
          1. For m_i As Integer = 1 To 16  
          2.      myinitwidth = myendwidth  
          3.      myendwidth += jiange  
          4.      For myi As Integer = myinitwidth To myendwidth  
          5.          For myj As Integer = myinitheight To myendheight  
          6.              mycolor = myybcominfo.mybitmap.GetPixel(myi, myj)  
          7.              If mycolor.B = 0 And mycolor.R = 255 And mycolor.G = 0 Then  
          8.                  While (Not Monitor.TryEnter(mymonitorobj))  
          9.                      Thread.Sleep(1)  
          10.                  End While  
          11.                  myjgtz(mycount) += 1  
          12.                  Monitor.Exit(mymonitorobj)  
          13.                  Thread.Sleep(1)  
          14.              End If  
          15.          Next  
          16.      Next  
          17.      mycount += 1  
          18.      myendwidth += 1  
          19.  Next  

           

          2、在第一步的特征基礎(chǔ)上進(jìn)一步加工,加上位置信息,以位置做為權(quán)重,調(diào)整第一步的特征矢量,核心代碼為:

           

           

          Vb.net代碼  收藏代碼
          1. For mi As Integer = 0 To 15  
          2.     If myjgtz(mi) > 0 Then  
          3.         pictz(myii, myjj, m_j) += mi * myjgtz(mi)  
          4.     End If  
          5.     myjgtz(mi) = 0  
          6. Next  

           

          3、第三步計(jì)算每個(gè)數(shù)字的K均值,核心代碼為:

             

          Vb.net代碼  收藏代碼
          1. '計(jì)算K均值  
          2.        Dim mmsum As Double = 0  
          3.        For myii As Integer = 0 To 9  
          4.            mystr &= vbCrLf & myii & "的樣本均值是:" & vbCrLf  
          5.            For myk As Integer = 0 To 15  
          6.                mmsum = 0  
          7.                For myjj As Integer = 0 To 9  
          8.                    mmsum += pictz(myii, myjj, myk)  
          9.                    ProgressBar1.Value = count  
          10.                    count += 1  
          11.                Next  
          12.                mmsum /= 10  
          13.                ktz(myii, myk) = mmsum  
          14.                mystr &= ktz(myii, myk) & ","  
          15.            Next  
          16.            mystr &= vbCrLf  
          17.        Next  

           

          最后,進(jìn)行待識(shí)別數(shù)字的特征值,然后進(jìn)行歐氏距離對(duì)比

          Vb.net代碼  收藏代碼
          1. Dim jqtz(16) As Integer  
          2.                 '歐氏距離   
          3.         Dim mys(10) As Integer  
          4.         Dim temp As Integer = 1000000000  
          5.         Dim jgnum As Integer = -1  
          6.         For m_iii As Integer = 0 To 9  
          7.             mys(m_iii) = 0  
          8.             For m_jjj As Integer = 0 To 15  
          9.                 mys(m_iii) += Pow(ktz(m_iii, m_jjj) - jqtz(m_jjj), 2)  
          10.             Next  
          11.             If mys(m_iii) < temp Then  
          12.                 temp = mys(m_iii)  
          13.                 jgnum = m_iii  
          14.             End If  
          15.         Next  
          16.         jg.Text = ""  
          17.         For m_iii = 0 To 9  
          18.             jg.Text &= m_iii & ":" & mys(m_iii) & vbCrLf  
          19.         Next  
          20.         jg.Text &= "結(jié)果是:" & jgnum  

          實(shí)驗(yàn)表明,算法有一定的識(shí)別率,進(jìn)一步提高需要改進(jìn)算法,對(duì)于仿宋的識(shí)別率最高,達(dá)90%,黑體、楷體等識(shí)別率也可以,手寫數(shù)字,只要書寫較規(guī)范,然后寫的位置適當(dāng),在方框較中間,識(shí)別率較高



           

           

           

           

           

           

          posted on 2012-07-21 22:13 張慧 閱讀(1259) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 金湖县| 沙湾县| 临海市| 镇江市| 逊克县| 错那县| 绥棱县| 页游| 柞水县| 垣曲县| 华安县| 荥阳市| 罗平县| 左贡县| 麻江县| 深水埗区| 车险| 屏山县| 谷城县| 阿城市| 临江市| 黄浦区| 大荔县| 资溪县| 临汾市| 兴宁市| 安达市| 六盘水市| 彭泽县| 广安市| 富蕴县| 友谊县| 梓潼县| 繁峙县| 东明县| 浏阳市| 昭苏县| 东乌珠穆沁旗| 红桥区| 葵青区| 芒康县|