Python 純手寫 實現KNN

2021-08-22 10:27:42 字數 1867 閱讀 4060

實現《統計學習方法》p39 例3.1

輸入:資料集,例項x,k值,以及計算距離的方法

輸出:距離最近的k個資料,以及最近距離

首先定義三種計算距離的方法:歐氏距離,曼哈頓距離,以及各個座標值的最大值

對傳入的例項x,計算再不同的距離計算方法下的最近距離,及對應的最近的座標值

import numpy as np

import math

x = np.array([[5,1],[4,4],[2,1],[3,3],[4,5],[7,2]])

xx = [1,1]

def euclidean_distance(xi,yi):

"""歐式距離計算

:param xi:

:param yi:

:return:

"""sum_distance = 0

for i in range(len(xi)):

sum_distance += pow(abs(xi[i] - yi[i]) , 2)

return math.sqrt(sum_distance)

def manhattan_distance(xi,yi):

"""曼哈頓距離

:param xi:

:param yi:

:return:

"""sum_distance = 0

for i in range(len(xi)):

sum_distance += abs(xi[i] - yi[i])

return sum_distance

def max_distance(xi,yi):

"""各個座標距離的最大值

:param xi:

:param yi:

:return:

"""sum_distance = 0

for i in range(len(xi)):

sum_distance = max(sum_distance , abs(xi[i] - yi[i]))

return sum_distance

def nearest_neighbr(xx , x , k , functin):

nearest_dict = {}

max_list =

nearest_list =

for i in range(len(x)):

distance = functin(xx,x[i])

if distance not in nearest_dict:

nearest_dict[distance] = [x[i].tolist()]

else:

max_list.sort()

for i in max_list[:k]:

nearest_list += [z for z in nearest_dict[i]]

return max_list[:k] , nearest_list[:k]

e , e_list = nearest_neighbr(xx , x , 2 , euclidean_distance)

m , m_list = nearest_neighbr(xx , x , 2 , manhattan_distance)

ma , ma_list = nearest_neighbr(xx , x , 2 , max_distance)

print(e)

print(e_list)

print(m)

print(m_list)

print(ma)

print(ma_list)

當後期需要實現knn分類時

可將最近k個樣本點的label值,取多數原則,對x例項進行類別劃分即可

手寫實現bind

bind 方法會建立乙個新函式。當這個新函式被呼叫時,bind 的第乙個引數將作為它執行時的 this,之後的一串行引數將會在傳遞的實參前傳入作為它的引數。來自於 mdn 由此我們可以首先得出 bind 函式的兩個特點 返回乙個函式 可以傳入引數 返回函式的模擬實現 從第乙個特點開始,我們舉個例子 ...

python手寫實現進度條

哈哈哈,我們平時都經常見到python的進度條,安裝pip包的時候,更新的時候,呼叫第三方庫的時候,但是很少有人試過自己實現,今天來了興趣就自己寫一套哈哈哈 使用print for i in range 0,101,2 print r i,end flush true time.sleep 0.1 ...

手寫實現RPC 框架

乙個簡易的rpc框架,別的先不多說上github github gitee 註冊中心 zookeeper 使用curator 操作 通訊框架 netty 4.1.25版本 序列化 kryo 以下只寫了大體專案流程,以及展示部分 具體上方github 裡基本都寫了注釋 本rpc框架,有乙個統一的 框架...