機器學習初識之KNN演算法

2021-09-02 12:41:16 字數 2139 閱讀 6625

knn演算法,k nearest neighbor 最近的k個鄰居,了解乙個演算法,先從了解乙個問題開始,現在問題如下,有很多的數字,每個上面有乙個數字,每個是28*28畫素的的,灰度值從0~255,我們把每個看作是乙個1x784的一行矩陣,因為784=28*28,矩陣上的數字大小表示該畫素點的灰度值,有一些已知的影象和未知的影象,當然這裡的影象都是使用矩陣表示的,現在需要通過已知影象的數字來**未知影象的數字

knn演算法其實是比較需要**的和已知的結果的用例之間的相似度,尋找相似度最接近的k個已知用例作為**和分類結果

我們這裡使用的相似度比較方法是余弦比較,計算公式如所示,所謂余弦比較,就是將帶**的畫素矩陣與已知的矩陣的每行求余弦乘積,在所有的乘積中選取最大的數值的那一組作為**值,因為越大越接近一的表示兩者相似度越高

# -*- coding: utf-8 -*-

import pandas as pd

import numpy as np

import time

def normalize(x):

"""linalg.norm(x), return sum(abs(xi)**2)**0.5

"""return x / np.expand_dims(norms, -1)

def normalize2(x):

"""linalg.norm(x), return sum(abs(xi)**2)**0.5

"""return x - np.expand_dims(norms, -1)

def nearest_neighbor(norm_func,train_x, train_y, test_x):

train_x = norm_func(train_x)

test_x = norm_func(test_x)

# cosine

corr = np.dot(test_x, np.transpose(train_x))

argmax = np.argmax(corr, axis=1)

preds = train_y[argmax]

return preds

def validate(preds, test_y):

count = len(preds)

correct = (preds == test_y).sum()

return float(correct) / count

if __name__=='__main__':

train_num = 220

test_num = 420

# read data 42000

data = pd.read_csv('train.csv')

## print data

train_data = data.values[0:train_num,1:]

train_label = data.values[0:train_num,0]

test_data = data.values[train_num:test_num,1:]

test_label = data.values[train_num:test_num,0]

norm_funcs = [normalize,normalize2]

for norm_f in norm_funcs:

t = time.time()

preds = nearest_neighbor(norm_f,train_data, train_label, test_data)

acc = validate(preds, test_label)

print("%s validation accuracy: %f, %.2fs" % (norm_f.__name__,acc, time.time() - t))

這段**裡面包含兩種比較函式,其中第一種就是使用余弦回歸計算得到的,我們看一下**結果:

normalize validation accuracy: 0.815000, 0.12s

normalize2 validation accuracy: 0.770000, 0.03s

可見,使用余弦比較相似度的演算法最終的識別率能達到八成以上,當然資料量越大越準確,當資料到達2200個的時候,準確率能到90%

另外還附加乙個資料檔案(見附錄)

機器學習演算法初識 k近鄰演算法knn

knn 演算法思想 k近鄰演算法用於分類,首先收集大量資料作為模型 不用訓練,包括特徵變數和所屬分類兩部分 待測試資料 需要分類的資料 輸入後計算輸入資料和已有模型中各個資料的 特徵變數 距離,距離的計算可以根據實際情況採用不同的計算方法,一般採用歐式距離。選取距離中最近的k個模型,在選取的k個模型...

機器學習之KNN演算法

在幾位志同道合的小夥伴的帶領下,開始了機器學習的路程,然而一切並不是想象的那麼簡單,因此本文記錄了自己的學習路程,希望還能堅持做好這件事。knn演算法是機器學習中屬於比較簡單的演算法,容易理解和閱讀。1.knn的應用 客戶流失 欺詐偵測等 更適合於稀有事件的分類問題 2.優缺點 優點 這是乙個簡單有...

機器學習演算法之KNN

物以類聚 人以群分,乙個例項與它周圍的例項屬於同一類的概率較大。給定乙個訓練資料集,對新輸入的例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類。這裡,選用了歐氏距離,k的預設值為3,使用了sklearn提供的digits資料集來進行測試。inpu...