K-NN 近邻

k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

k近邻算法

输入:训练数据集

T={(x_1,y_1), (x_2, y_2),...,(x_n,y_n)}

其中,x_i\in\chi\subset R^n 为实例的特征向量,y_i\in\gamma= (c_1,c_2,...c_k)为实例的类别,1, 2,...,N;实例特征向量x;
输出:实例x所属的类y.

(1)根据给定的距离度量,在训练集T中找出与x最邻近的k个点,涵盖这k个点的x的邻域记作N_k(x);

(2)在N_k(x)中根据分类决策规则(如多数表决)决定x的类别y:

y=argmax_{c_j}\sum\limits_{x_i\in{N_k(x)}}I(y_i=c_j), i=1,2,...,N;j=1,2,...,K

在上式中,I为指示函数,即当y_i=c_j时,I为1,否则I为0.

k近邻模型由三个基本要素组成:距离度量,k值选择,分类决策规则

距离度量

距离选择有很多种,常用的距离函数有:

1、明考斯基距离
2、曼哈顿距离
3、Cityblock 距离
4、欧几里德距离(欧氏距离)
5、Canberra 距离
...

目前使用最多的距离计算公式为欧式距离,也是常用的向量距离计算方法。

欧式距离

计算两个物体直接的距离/相似度

K近邻模型的特征空间一般是n维实数向量空间 R^n。使用的距离是欧氏距离,但也可以是其它距离。设特征空间Xn维实数向量空间
R^n

x_i,x_j∈X, x_i=(x^{(1)}_i,x^{(2)}_i,...x^{(n)}_i), x_j=(x^{(1)}_j,x^{(2)}_j,...x^{(n)}_j) ,

x_i,x_jL_p 距离定义为
L_p(x_i,x_j)=(\sum\limits_{l=0}^{n}|x^{(l)}_i−x^{(l)}_j|^p)^{1/p}

这里p≥1。当p=2时称为欧氏距离,即
L_2(x_i,x_j)=(\sum\limits_{l=1}^{n}|x^{(l)}_i−x^{(l)}_j|^2)^{1/2}

p=1时,称为曼哈顿距离,即
L_1(x_i,x_j)= \sum\limits^{n}_{l=1}|x^{(l)}_i−x^{(l)}_j|

p=∞时,它是各个坐标距离的最大值.

关于k取值

k对算法影响:

k值得选择会对k近邻算法的结果产生重大影响。
如果选择的k值较小,就相当于用较小的的邻域中的训练实例进行预测。此时预测的结果会对近邻的实例点非常敏感。

如果选择较大的k值,就相当于在较大的邻域中训练实例进行预测。此时,与输入实例较远的训练实例也会对预测起作用,使预测发生错误。

在使用k-NN算法的时候,k值一般会选择偶数,如1,3,5,7,9...。选择奇数是为了防止平手。K取1容易出现过拟合。

通过交叉验证选择合适的k,通常我们把它归类为“调参”。

交叉验证

把训练数据进一步分为训练数据(Training Data)和验证集合(Validation Data)。选择在验证数据里最好的超参数组合。

例:

![截屏2019-06-2921.17.13.png](https://upload-images.jianshu.io/upload_images/3637572-0801a96567f60ed4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

K折交叉验证(K-fold Cross Validation),把训练数据分为K部分,一部分作为验证数据,另外(K-1)部分作为训练数据。

交叉验证中需要注意的点:

  • 千万不要用测试数据来调参;
  • 数据量越少,可以适当增加折数。

特征的缩放

  • 线性归一化(Min-max Normalization)
  • 标准差标准化(Z-score Normalization)

coding time

from sklearn import datasets
from collections import Counter
from sklearn.model_selection import train_test_split
import numpy as np 


def euc_dis(instance1, instance2):
    """
    计算两个样本直接的欧氏距离
    """
    dist = np.sqrt(sum((instance1 - instance2)**2))
    return dist

def knn_classify(X,y, testinstance, k):
    dists = [euc_dis(x, testinstance) for x in X]
    kneighbors = np.argsort(dists)[:k] # 排序,截取前K
    count = Counter(y[kneighbors]) # 计算数量
    return count.most_common()[0][0] # 返回出现最多的label


# 导入iris数据
iris = datasets.load_iris()
X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=2003)

# 结果预测
predict = [knn_classify(X_train, y_train, data, 3) for data in X_test]

correct = np.count_nonzero((predict==y_test)==True) # 预测正确数量
print('Accuracy is : %.3f' % (correct/len(X_test))) # 正确率

sklearn k近邻算法

官方文档

截屏2019-06-2921.17.13.png

k-NN最大的作用是可以随时间序列计算,即样本不能一次性获取只能随着时间一个一个得到的时候,k-NN能发挥它的价值。至于其他的特点,它能做的,很多方法都能做;其他能做的它却做不了。

......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容