import numpy as np
def euclidean_metric(x,y):
return np.sqrt(((x-y)**2).dot(np.ones_like(x)))
def KNN(train_x,train_y,test_x,k=3,Lambda=euclidean_metric):
train = np.array(sorted({
Lambda(train_x[i],test_x):train_y[i] for i in range(train_y.shape[0])}.items(),key = lambda kv:(kv[0], kv[1]))[:k])
class_y , counter = np.unique(train[:,-1],return_counts=True)
index_ = counter==counter.max()
return (class_y[index_],counter[index_])
KNN(train_x,train_y,test_x,k=3)
一种变种对高维空间可能性求解
import numpy as np
def norm(vector,p=2):
'''
向量的范数
'''
return (vector**p).dot(np.ones_like(vec1))**(1/p)
def difference_in_norms(vector1, vector2, p=3):
"""
闵氏距离
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比雪夫距离
:param vec1:
:param vec2:
:param p:
:return
"""
#print(np.linalg.norm(vec1 - vec2, ord=p))
return norm(vector1-vector2,p)
def KNN(train_x,train_y,test_x,k=3,p=False):
train = np.array(sorted({
difference_in_norms(train_x[i],test_x,p):train_y[i] for i in range(train_y.shape[0])}.items(),key = lambda kv:(kv[0], kv[1]))[:k])
class_y , counter = np.unique(train[:,-1],return_counts=True)
index_ = counter==counter.max()
return (class_y[index_],counter[index_])
for j in range(1,len(train_x)+1):
for i in range(100):
print(j,i,KNN(train_x,train_y,test_x,j,i))