6.1 KNN学习
'''
KNN点到所有样本的
# 1.计算样本点a到所有样本的距离dis
# 2.对dis排序,取出前 k 个样本
# 3.计算k 个样本所属类别,找出类别数出现次数最多的类作为a的类别
import numpy as np
import pandas as pd
class KNN():
def knn(self,X,y,x,k):
# 1.计算样本点a到所有样本的距离dis
dis = np.sqrt(np.sum((X - x)**2,axis =1))
# 2.对dis排序,取出前 k 个样本
ind = dis.argsort()
dis_k = ind[:k]
# 3.计算k 个样本所属类别,找出类别数出现次数最多的类作为a的类别
pd.value_counts(dis_k).keys()[0]
'''
import numpy as np
import pandas as pd
def knn(x, y, k, samples):
m,n = samples.shape
result = []
for i in range(m):
if samples.ndim > 1:
dist = np.sqrt(np.sum((x-samples[i])**2, axis=-1))
else:
dist = np.sqrt((x-samples[i])**2)
ind = np.argsort(dist,axis=-1)[:k]
if ind.ndim > 1:
res = [pd.value_counts(i).idxmax() for i in y[ind]]
else:
res = pd.value_counts(y[ind]).idxmax()
result.append(res)
return result
if __name__=="__main__":
'''
# 1 samples.shape=[m,n]
x = [np.array([np.random.randn(60)*0.019+i*10]).reshape([-1, 2]) for i in range(3)]
x = np.concatenate([x[0], x[1], x[2]], axis=0)
y = np.concatenate([np.ones(30)*0,
np.ones(30)*1,
np.ones(30)*2])
samples = np.array([[0, 0],[10,10],[30,30]])
k = 5
knn = knn(x, y, k, samples)
print('{}'.format(knn))'''
x1 = [np.array([(np.random.randn(30)+i*10)]).reshape(-1,1) for i in range(3)]
x1 = np.concatenate([x1[0], x1[1], x1[2]], axis=0)
y1 = np.concatenate([np.ones(30)*0,
np.ones(30)*1,
np.ones(30)*2])
samples1 = np.array([0,10,20]).reshape(-1,1)
k = 5
knn1 = knn(x=x1, y=y1, k=k, samples=samples1)
print('{}'.format(knn1))