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...