KNN

KNN 思想非常简单, 当一个新的数据输入的时候, 把该数据和训练集中的所有的数据比较一下, 距离输入数据最近的一个训练样本所属类别就是该输入数据的预测值, 这是 NN (最近邻)算法. 如果, 把上述过程的最近的一个修改成最近的 k 个, 然后这 k 个进行投票来决定预测结果, 那么, 这就是 kNN. 原理非常简单, 实现起来也不难.

# -*- coding: utf8 -*-
import numpy as np
from collections import Counter
class kNN(object):
    #
    def __init__(self):
        pass
    # knn 不需要预先训练, 所以, 这里只需要把训练集保存下来
    def train(self, X, y):
        self.train_X = X
        self.train_y = y
    # 预测过程就是找距离最近的 k 个 sample 然后进行投票
    def predict(self, X, k=1):
    # 第一步, 计算输入数据和训练集中数据的距离
    n_test = X.shape[0]
    n_train = self.train_X.shape[0]
    # 用于保存距离信息
    dists = np.zeros((n_test, n_train))
    for i in range(n_test):
        dists[i, :] = np.linalg.norm(X[i, :]-self.train_X, axis=1)
    # 投票
    pred_y = np.zeros(n_test)
    for i in range(n_test):
        # 先按照距离从小到大进行排序, 获取对应样本的 label 数据
        labels = self.train_y[np.argsort(dists[i, :])]
        # 取前距离最近的 k 个训练样本的 label 信息
        closest_y = labels[:k]
        # 进行投票
        c = Counter(closest_y)
        pred_y[i] = c.most_common(1)[0][0]
    reurn pred_y
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值