(二)KNN与python代码实现

李航老师《统计学习方法》第二版学习笔记

知识点

  • 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类花

你可能感兴趣的:(机器学习笔记,python,数据挖掘,算法,机器学习)