03-KNN算法

KNN算法原理

思考:如果是人反复练习,能否提升成功的概率?

测试数据:

投掷位置 落入篮筐编号
298 #4
299 #4
299 #4
301 #4
302 #4
302 #4
302 #4
303 #4
297 #4

问:如果在300出丢下球, 会落入那个框?

KNN算法步骤

简单起见,只考虑丢球位置

问题: 我想预测在某个位置扔球,预测落入篮筐的位置,我应该怎么办。

  1. 在任意随机位置反复的扔球,收集大量的实验数据。
  2. 假设要预测300位置落入的篮筐, 需要找到离300最近的若干条(k)记录
  3. 计算每个球丢落位置与300的距离
  4. 把距离从小到大进行排序
  5. 选取最顶部的k条记录
  6. 看这k条记录中,落入到几号框概率最大

实现knn算法

  1. 准备数据集,做实验收集投放位置和落入篮筐的数据。
1
2
3
4
5
6
7
8
9
data = np.array([[0,1],
                [150,2],
                [200,3],
                [275,4],
                [325,4],
                [375,4],
                [450,5],
                [500,5],
                [550,5]])
  1. 计算这些位置与300的距离
1
2
3
4
5
feature = data[:,0:1]
label = data[:,-1:]
predictPoint = np.array([300])
distancedata = np.sqrt(np.square(feature - predictPoint))
#绝对值 np.abs(feature-predictPoint)
  1. 排序
1
2
3
4
5
6
#垂直方向对数据进行排序
np.argsort(distancedata,axis=0)  
##二维的要降低到1维度
index = np.argsort(distancedata,axis=0).reshape(1,-1)[0]

info = label[index]
  1. 选前3个 k=3
1
np.argmax(np.bincount(label[index][0:3].reshape(1,-1)[0]))

代码汇总

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def knn(feature,label,predictPoint,k):
    distancedata = np.sqrt(np.square(feature - predictPoint))
    #绝对值 np.abs(feature-predictPoint)
    #垂直方向对数据进行排序
    np.argsort(distancedata,axis=0)  
    ##二维的要降低到1维度
    index = np.argsort(distancedata,axis=0).reshape(1,-1)[0]

    info = label[index].astype(int)

    return np.argmax(np.bincount(info[0:k].reshape(1,-1)[0]))

测试真实数据

1
help(np.loadtxt)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
data = np.loadtxt('data3.csv',delimiter=',')
data[0:10]

feature = data[:,0]
feature

label = data[:,-1]
label

knn(feature,label.astype(int),300,3)