李航老师《统计学习方法》第二版学习笔记
知识点
- KNN是一种基本分类与回归方法
- 三个基本要素:K值的选择、距离度量、分类决策规则
- 直观解释:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分为这个类
- KNN没有显式的学习过程
- KNN模型对应与基于训练数据集对特征空间的一个划分
- 距离度量:由不同的距离度量所确定的最近邻点是不同的,常用欧氏距离
- K值的选择:K值的减小就意味着整体模型变得复杂,容易发生过拟合,K值一般取一个比较小的数值,通常采用交叉验证法来选取最优的K值
- 分类决策规则:往往采取的是多数表决
- KNN最简单的实现是线性扫描,但是训练集很大时,计算量会很大,所以会不可取
- KNN的实现:kd树
- 构造kd树:依次选择坐标轴对空间进行切分,选择训练实例点在选定坐标轴上的中位数为切分点
- kd树更适用于训练实例数远大于空间维数时的KNN搜索
算法实现
按照KNN三要素进行代码编写
'''
数据集:安德森鸢尾花卉数据集,其包含150个样本,对应数据集的每行数据。每行数据包含每个样本的四个特征和样本的类别信息。
特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度
类别:山鸢尾、变色鸢尾和维吉尼亚鸢尾
目标:输入花萼长度、花萼宽度、花瓣长度和花瓣宽度,来判断这个样本属于哪一类鸢尾花
将鸢尾花数据集中第一个数据作为等下的验证数据,其特征为[5.1, 3.5, 1.4, 0.2],类别为0
'''
'''导入包'''
import numpy as np
from sklearn.datasets import load_iris
from collections import Counter
'''数据准备'''
iris.data[0]
x_train = iris.data[1:150]
y_train = iris.target[1:150]
'''距离度量'''
# 计算该点与其他数据的距离
def distance_func(x):
distance_list = []
for x_i in x_train:
# 欧氏距离公式
distance = np.sqrt(np.sum(x_i-x)**2)
distance_list.append(distance)
return distance_list
'''分类决策规则-多数表决'''
def rule_func(distance_list, k):
# argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引)
distance_list_index = np.argsort(distance_list)[:k]
# 提取最近的k点的y标签
top_k_y = [y_train[index] for index in distance_list_index]
# 多数表决
result = sorted(Counter(top_k_y).items(),key=lambda x:x[1],reverse=True)[0][0]
return result
'''K值的选择'''
K = 3
'''数据预测'''
x = np.array([5.1, 3.5, 1.4, 0.2])
distance_list = distance_func(x)
predict_result = rule_func(distance_list,K)
print("该数据的类型为:第{}类花".format(predict_result))
结果输出如下:
该数据的类型为:第0类花