1. 程式人生 > >人工智慧原理(一)——KNN最近鄰網路實現

人工智慧原理(一)——KNN最近鄰網路實現

一 目標:在不呼叫除了numpy之外的高階庫的情況下使用KNN最近鄰演算法實現對句子的分類和迴歸

二 演算法原理

       最簡單最初級的分類器是將全部訓練資料的類別都記錄下來,如果測試物件的屬性和某個訓練物件的屬性完全匹配,就可以進行分類。顯然,絕大部分測試物件都不會有完全匹配的訓練物件,所以就產生了KNN

       KNN是通過不同樣本在特徵空間中的距離進行分類。其思路是:如果一個樣本在特徵空間中存在k個距離最近的訓練物件,則在這k個物件的分類結果中取眾數作為分類器的結果;如果要實現的是迴歸預測,那麼就用各個樣本的結果除以距離(或者其他某種與距離反相關的方法)再求和

三 實驗資料

1、 訓練集:作為樣本用於與測試物件進行匹配

2、 驗證集:用於尋找合適的度量空間 ,比如歐氏距離、曼哈頓距離、餘弦距離等

3、 測試集:用於測試結果

五 部分關鍵程式碼(以迴歸為例)

def findNearest(k, expon, train_mat, vec):
    tmp = []
    for index in range(train_mat.shape[0]):
        dis = getDis(expon, vec, train_mat[index])
        tmp.append((dis, index))
    tmp.sort()
    return tmp[0:k]

def calculator(k, l, train_emo, emo, i):
    for index in range(k):
        for Index in range(6):
            emo[i][Index] += train_emo[l[index][1]][Index] / l[index][0]
    # 歸一化
    s = emo[i].sum()
    for index in range(6):
        emo[i][index] = emo[i][index] / s

def getPredict(k, expon, train_mat, train_emo, valid_mat, valid_emo):
    l = []
    for i in range(valid_mat.shape[0]):
        l = findNearest(k, expon, train_mat, valid_mat[i])
        if l[0][0] == 0:
            valid_emo[i] = train_emo[l[0][1]]
        else:
             calculator(k, l, train_emo, valid_emo, i)