• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 51, 文章 - 1, 評(píng)論 - 41, 引用 - 0
            數(shù)據(jù)加載中……

            K近鄰算法

            概述

            k近鄰(k nearest neighbor)算法是一種監(jiān)督算法,用于分類。它基本思想是計(jì)算新實(shí)例和訓(xùn)練集元素的**距離**,找出k個(gè)最接近的實(shí)例(neighbor),統(tǒng)計(jì)它們所屬分類,次數(shù)最多的類別作為新實(shí)例的類別。

            原理與步驟

            監(jiān)督算法可大致分成兩個(gè)步驟:訓(xùn)練(train)和分類(classify)。從實(shí)現(xiàn)考慮還需要算法初始化過程。

            本節(jié)的代碼為python風(fēng)格的示意代碼,不能直接運(yùn)行,可運(yùn)行代碼參考zxml。

            示意代碼

            ?

            class KNearestNeighbor:
            

                def __init__(...):  pass
            

                def train(...):     pass
            

                def classify(...):  pass
            

            訓(xùn)練(train)

            理論上k近鄰算法不需要訓(xùn)練,可直接使用原始數(shù)據(jù)進(jìn)行分類。

            歸一化

            數(shù)據(jù)的分類的量綱差別較大時(shí),小量綱分類在計(jì)算的權(quán)重將被削弱。使用歸一化消除這種影響。方法如下:

            x??=?(x???xmin)/(xmax???xmin)

            預(yù)處理

            將數(shù)據(jù)進(jìn)行某種形式的處理可加快尋找k近鄰的速度,常用的處理方式有KD-Tree和Ball-Tree,前者對(duì)低維歐氏距離有效,后者對(duì)所有距離有效。

            示意代碼

            ?

            def train(self, X, C):
            

                '''X,C分別代表實(shí)例和類別'''
            

            ?

                # 實(shí)例數(shù)據(jù)歸一化,并保留數(shù)據(jù)備份
            

                (self.X, self.C) = (normalize(X), C.copy())
            

            ?

                # 可選,如果需要,則構(gòu)建KD-Tree()
            

                self.tree = KDTree()
            

                self.tree.create(self.X)
            

            分類(classify)

            分類的大致步驟:找出k個(gè)近鄰 和*統(tǒng)計(jì)類別的次數(shù)* 。 分類的部分處理與訓(xùn)練的處理向?qū)?yīng),如:

            • 訓(xùn)練對(duì)數(shù)據(jù)進(jìn)行歸一化,則分類是也需要?dú)w一化。
            • 訓(xùn)練使用如KD-Tree等方式進(jìn)行處理,則分類使用對(duì)應(yīng)的方法尋找k個(gè)近鄰。

            示意代碼

            ?

            def classify(self, x):
            

            ?

                _x = normalize(x)                   # 將x歸一化
            

                nearest = self.find_neighbors(_x)   # 找出k個(gè)近鄰
            

                freq = frequency(nearests)          # 統(tǒng)計(jì)每個(gè)類型的次數(shù)
            

                return freq.sorted()[-1]            # 排序后,返回次數(shù)最多的類別
            

            ?

            def find_neighbors(self, x):
            

                '''尋找與x最接近的k個(gè)點(diǎn)'''
            

            ?

                if self.tree == None:               # 判斷是否使用了kd-tree
            

                    ds = self.distance(x, self.X)   # 計(jì)算所有點(diǎn)的距離
            

                    indices = ds.argsort()[0:k]     # 排序后,取前面k個(gè)
            

            ?

                else:
            

                    indices = self.tree.find_neighbors(x, self.k)
            

            ?

                # indices是k個(gè)近鄰的索引位置
            

                return self.C[indices]
            

            初始化(init)

            初始化需要設(shè)置算法參數(shù),如k的值,距離公式。

            距離

            實(shí)例之間的距離一般采用歐氏距離,但不排除使用其它的距離計(jì)算方法。歐氏距離:

            d?=?x???y?=?((xi???yi)2)?≥?xi???yi

            ?

            def __init__(self, k, distance=euclidean ):
            

                (self.k, self.distance) = (k, distance)
            

            scikit-learn

            下面使用scikit-learn中的k近鄰算法分類的例子。

            ?

            import numpy as np
            

            from sklearn import neighbors
            

            ?

            # 準(zhǔn)備數(shù)據(jù),分成A B兩類。A類在[0,0]附近,B類在[1,1]附近。
            

            X = np.array([[0, 0.1],   [-0.1, 0],
            

                          [0.1, 0.1], [0, 0],
            

                          [1, 1],     [1.1, 1],
            

                          [1, 1.1],   [1.1, 1.1]])
            

            ?

            C = ['A','A','A','A','B','B','B','B']
            

            ?

            # 初始化
            

            clf = neighbors.KNeighborsClassifier(n_neighbors=3, weights="uniform")
            

            ?

            # 訓(xùn)練
            

            clf.fit(X, C)
            

            ?

            # 分類
            

            c = clf.predict(np.array([[0.9,0.8]]))
            

            print(c)
            

            上面的例子可以將k近鄰算法分成三步,初始化、訓(xùn)練和分類。初始化可設(shè)置參數(shù),本文涉及到的參數(shù)有:

            • n_neighbors: 指參數(shù)k
            • weights: 指定數(shù)據(jù)分類的權(quán)重,歸一化 是其中的一個(gè)方式。
            • algorithm: 該參數(shù)可設(shè)定使用kd-tree等方法。
            • metric: 距離計(jì)算公式

            參考資料

            posted on 2016-10-28 16:18 lemene 閱讀(444) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久久久亚洲爆乳少妇无| 久久人人超碰精品CAOPOREN| 国内精品久久久久影院优 | 久久国产精品无码网站| 久久乐国产精品亚洲综合| 亚洲&#228;v永久无码精品天堂久久| 亚洲日本久久久午夜精品| 久久亚洲欧美国产精品| 青青青青久久精品国产 | 日韩av无码久久精品免费| AV色综合久久天堂AV色综合在| 女人高潮久久久叫人喷水| 色欲久久久天天天综合网精品| 久久精品国产亚洲AV久| 色综合久久久久| 久久国产精品77777| 久久久午夜精品福利内容| 色综合久久中文综合网| 久久久久久久女国产乱让韩| 国产精品伦理久久久久久| 色欲久久久天天天综合网| 久久九九免费高清视频| 日本精品久久久久中文字幕| 久久精品国产亚洲AV影院| 欧美日韩成人精品久久久免费看| 99热成人精品热久久669| 精品国产乱码久久久久软件| 香蕉久久永久视频| 欧美粉嫩小泬久久久久久久 | 一级a性色生活片久久无| 精品午夜久久福利大片| 亚洲av日韩精品久久久久久a| 成人a毛片久久免费播放| yy6080久久| 中文字幕久久精品| 久久精品国产亚洲AV久| 久久伊人五月丁香狠狠色| 久久久久免费精品国产| 狠狠色噜噜色狠狠狠综合久久 | 久久婷婷色综合一区二区| 久久99精品久久久久久9蜜桃 |