第一周 kNN算法 学习心得

第一周 kNN算法 学习心得

学习目标:
1.了解kNN算法的思想及其原理
2.使用python手动实现kNN算法,并在sklearn中调用kNN算法
3.了解监督学习和非监督学习的概念

一、kNN算法概念
kNN(k-NearestNeighbor),k最近邻算法,就是一个分类算法(物以类聚,人以群分)。

核心思想就是,要确定测试样本属于哪一类,就寻找所有训练样本中与该测试样本“距离”最近的前K个样本,然后看这K个样本大部分属于哪一类,那么就认为这个测试样本也属于哪一类。简单的说就是让最相似的K个样本来投票决定“找邻居+投票”。

三个基本要素决定:
1.距离度量
2.k值
3.分类决策规则
其中两个实例点之间的距离反映了相似程度。一般来说使用欧氏距离(在这里插入图片描述 )来计算。

算法流程:
1.计算测试对象到训练集中每个对象的距离
2.按照距离的远近排序
3.选取与当前测试对象最近的k的训练对象,作为该测试对象的邻居
4.统计这k个邻居的类别频次
5.k个邻居里频次最高的类别,即为测试对象的类别

缺点:在图像识别上,是基本不会用到KNN的,因为KNN的最终结果很大程度上是以背景为导向的。

问题点:
1.对于样本不平均问题,KNN相比于其他监督学习算法容忍度更差。
2.KNN的计算量和数据存储量都很大。
3.但是KNN的思想简单,在某些方便可以带来很高的准确率,比如在经典的手写数字识别题上,KNN的准确率可以排在第二位。
4.KNN是一种在线的学习方式,效率低,而且样本量越大效率就越低。

二、kNN算法实践

模仿练习,调试运行出来也是不易,动手操作后更深刻,需要练习才能掌握。
copy别人优秀的代码(我需要多多练习,现在不能完整写出自己的):

import numpy as np
import math as sqrt
from collections import Counter
from .metrics import accuracy_score

class kNNClassifier:

    def __init__(self, k):
        """初始化分类器"""
        assert k >= 1, "k must be valid"
        self.k = k
        self._X_train = None
        self._y_train = None

    def fit(self, X_train, y_train):
        """根据训练数据集X_train和y_train训练kNN分类器"""
        assert X_train.shape[0] == y_train.shape[0], \
            "the size of X_train must be equal to the size of y_train"
        assert self.k <= X_train.shape[0], \
            "the size of X_train must be at least k"
        self._X_train = X_train
        self._y_train = y_train
        return self

    def predict(self,X_predict):
        """给定待预测数据集X_predict,返回表示X_predict结果的向量"""
        assert self._X_train is not None and self._y_train is not None, \
            "must fit before predict!"
        assert X_predict.shape[1] == self._X_train.shape[1], \
            "the feature number of X_predict must be equal to X_train"
        y_predict = [self._predict(x) for x in X_predict]
        return np.array(y_predict)

    def _predict(self, x):
        distances = [sqrt(np.sum((x_train - x) ** 2)) for x_train in self._X_train]
        nearest = np.argsort(distances)
        topK_y = [self._y_train[i] for i in nearest]
        votes = Counter(topK_y)
        return votes.most_common(1)[0][0]

    def score(self, X_test, y_test):
        """根据X_test进行预测, 给出预测的真值y_test,计算预测模型的准确度"""
        y_predict = self.predict(X_test)
        return accuracy_score(y_test, y_predict)

    def __repr__(self):
        return "kNN(k=%d)" % self.k

三、非监督学习
外界诱惑因素太多,计划没赶上变化,需要掌握好自己的时间。
加油!

四、kNN面试题
1.请简单描述一下kNN算法原理,以及其优缺点
2.在kNN算法中如何计算距离?为什么用欧式不用曼哈顿?
3.如何选取超参数k值?
4.kNN算法的时间复杂度是多少,在面对高维数据时如何处理呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值