学习笔记,自liuyubobo老师,慕课网
**
K近邻算法
**
0 目录结构
1.1 基础
用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居), 这K个实例的多数属于某个类,就把该输入实例分类到这个类中。
k=3 ,找图中新的点(绿色)最近的3个点(k个点),所以蓝色和红色的比例为3:0,认为绿色的点更接近蓝色。
思路:求距离 -> 距离排序,取前 k 个 ->取前k个值出现的次数y -> 统计前k个值出现的次数->取top值,作为预测值。
import numpy as np
from math import sqrt
from collections import Counter
def kNN_classify(k, X_train, y_train, x):
assert 1 <= k <= X_train.shape[0], "k must be valid"
assert X_train.shape[0] == y_train.shape[0], \
"the size of X_train must equal to the size of y_train"
assert X_train.shape[1] == x.shape[0], \
"the feature number of x must be equal to X_train"
distances = [sqrt(np.sum((x_train - x)**2)) for x_train in X_train]
nearest = np.argsort(distances)
topK_y = [y_train[i] for i in nearest[:k]]
votes = Counter(topK_y)
return votes.most_common(1)[0][0]
1.2 超参数
1.2.1 距离
有一个问题是当前kNN考虑的是测试点和周围 k 个点的颜色比例,如果 k == 6,蓝色和红色比例为 5 :1,所以输出结果为蓝色,但是并没有考虑真实的距离因素,因此可以在这里优化,使用距离。
考虑距离时,下述绿色的点,可以推测为红色,并不是之前的蓝色,另一个好处是解决平票的情况:
1.2.2 明可夫斯基距离的p超参数
提升了准确度至 -> 0.9888888
1.3 数据归一化
normalization,适用于分布有明显边界的情况
问题背景:样本间的距离被发现时间所主导,不能使用天,所以将发现时间归一化为年。
1.3.1 最值归一化
1.3.2 均值方差归一化
把所有数据归一到均值为0方差为1的分布中