机器学习之K近邻算法 —— 部分实现
只对 Python 机器学习库里 sklearn.neighbors.NearestNeighbors 做一个非常简单的 手写实现。
代码如下:
from sklearn.neighbors import NearestNeighbors
import numpy as np
#随机创建 训练数据X和测试样本Y 数量和维度可以做任意修改
X=np.random.rand(20,5)
Y=np.random.rand(5,5)
#Step1 完成库中knn
Apiknn = NearestNeighbors(n_neighbors=10)
Apiknn.fit(X)
dist , indices = Apiknn.kneighbors(Y, return_distance=True)
print('自带库中函数结果\n',indices,'\n',dist)
#Step 2 完成手写部分
def knn(trainD,testD,K):
N1 , D = X.shape
N2 = Y.shape[0]
indices= -np.ones((N2 , K))
dist = -np.ones((N2, K))
for i in range (N2):
alldist=np.sqrt(np.sum((X-Y[i])**2,1))
for j in range (K):
indices[i][j]=np.argmin(alldist)
dist[i][j]=alldist[int(indices[i][j])]
alldist[int(indices[i][j])]=1e30
return indices , dist
#调用手写knn函数
indicesx, distx = knn(X,Y,10)
print('手动实现结果\n',indicesx , '\n',distx)
结果验证:
我们可以看到结果是完全吻合的!
实现过程中遇到的问题也有很多:
这两个问题是算法本身逻辑有错误。
这个问题是print 后括号打成中文了。
这个手动实现还存在一些问题如用了两次循环,语法还有点粗糙等,由于我是初学者,没有更好的思路,希望有同学或者前辈指正。
我打算之后更新一下完整的 knnclassfier 的实现!