第一周 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算法的时间复杂度是多少,在面对高维数据时如何处理呢?