K近邻(K-nearst neighbors, KNN)是一种基本的机器学习算法,所谓k近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。比如:判断一个人的人品,只需要观察与他来往最密切的几个人的人品好坏就可以得出,即“近朱者赤,近墨者黑”。

KNN算法既可以应用于分类应用中,也可以应用在回归应用中。KNN在做回归和分类的主要区别,在于最后做预测的时候的决策方式不同。 KNN在分类预测时,一般采用多数表决法;而在做回归预测时,一般采用平均值法。

一、KNN的算法步骤

1、从训练集合中获取K个,离待预测样本距离最近的样本数据;

2、根据获取得到的K个样本数据,来预测当前待预测样本的目标属性值。

二、三个重要因素

1、K值的选择:一般根据样本分布,选择一个较小的值,然后交叉验证,来选择一个合适的最终值。K值太小,容易过拟合,K值太大,容易欠拟合。

2、距离的度量:一般使用欧式距离。

3、决策规则:在分类模型中,主要使用多数表决法或者加权多数表决法;在回归模型中,主要使用平均值法或者加权平均值法。

三、代码示例

根据电影中接吻和打斗次数,判断电影类型。

1、定义数据集

kiss = [104, 100, 81, 10, 5, 2]  # 接吻次数
fight = [3, 2, 1, 101, 99, 98] # 打斗次数
labels = [1, 1, 1, 2, 2, 2] # 电影类别:1-动作电影 2-爱情电影

test = [90, 18]

2、定义KNN处理类

class Knn():
    def __init__(self, k):
        self.k = k

    def fit(self, X_train, y_train):
        self.X_train = X_train
        self.y_train = y_train

    def perdict(X):
        pass

3、模型实例化

import numpy as np

knn = Knn(3) # 一般用奇数
X_train = np.array([kiss, fight]).T
y_train = np.array(labels)
knn.fit(X_train, y_train)

4、按最小距离分类,并返回分类

from collections import Counter

def perdict(self, X):
    res = []
    for x in X:
        # 求欧式距离
        dists = [((x-x_t)**2).sum()**0.5 for x_t in self.X_train]
        idxs = np.argsort(dists)
        # 找到前k个id对应的y值
        ls = self.y_train[idxs[:self.k]]
        # 统计数量,取最多
        res.append(Counter(ls).most_common()[0][0])
    return np.array(res)

# 模型预测
X_test = np.array([test])
res = knn.perdict(X_test)
print(res)

本文为 陈华 原创,欢迎转载,但请注明出处:http://ichenhua.cn/index.php/read/233