03-KNN算法
KNN算法原理
思考:如果是人反复练习,能否提升成功的概率?
测试数据:
投掷位置 |
落入篮筐编号 |
298 |
#4 |
299 |
#4 |
299 |
#4 |
301 |
#4 |
302 |
#4 |
302 |
#4 |
302 |
#4 |
303 |
#4 |
297 |
#4 |
问:如果在300出丢下球, 会落入那个框?
KNN算法步骤
简单起见,只考虑丢球位置
问题: 我想预测在某个位置扔球,预测落入篮筐的位置,我应该怎么办。
- 在任意随机位置反复的扔球,收集大量的实验数据。
- 假设要预测300位置落入的篮筐, 需要找到离300最近的若干条(k)记录
- 计算每个球丢落位置与300的距离
- 把距离从小到大进行排序
- 选取最顶部的k条记录
- 看这k条记录中,落入到几号框概率最大
实现knn算法
- 准备数据集,做实验收集投放位置和落入篮筐的数据。
| data = np.array([[0,1],
[150,2],
[200,3],
[275,4],
[325,4],
[375,4],
[450,5],
[500,5],
[550,5]])
|
- 计算这些位置与300的距离
| feature = data[:,0:1]
label = data[:,-1:]
predictPoint = np.array([300])
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]
|
- 选前3个 k=3
| np.argmax(np.bincount(label[index][0:3].reshape(1,-1)[0]))
|
代码汇总
| 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]))
|
测试真实数据
| data = np.loadtxt('data3.csv',delimiter=',')
data[0:10]
feature = data[:,0]
feature
label = data[:,-1]
label
knn(feature,label.astype(int),300,3)
|