欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

KNN

程序员文章站 2023-02-02 15:34:24
KNN最近邻 (k-Nearest Neighbors, KNN) 算法是一种分类算法, 1968年由 Cover和 Hart 提出, 应用场景有字符识别、 文本分类、 图像识别等领域。算法思想一个样本与数据集中的k个样本最相似, 如果这k个样本中的大多数属于某一个类别, 则该样本也属于这个类别。算法流程首先计算样本中所有点到目标点的距离,然后找出距离最近的K(K可以由训练得到)个点。这K个中,找出大多数点属于的类别,那么判断这个点可能也是这个类别的。距离的判断常用的距离有欧式距离和曼哈顿距离...

KNN

最近邻 (k-Nearest Neighbors, KNN) 算法是一种分类算法, 1968年由 Cover和 Hart 提出, 应用场景有字符识别、 文本分类、 图像识别等领域。

算法思想

一个样本与数据集中的k个样本最相似, 如果这k个样本中的大多数属于某一个类别, 则该样本也属于这个类别。

算法流程

首先计算样本中所有点到目标点的距离,然后找出距离最近的K(K可以由训练得到)个点。这K个中,找出大多数点属于的类别,那么判断这个点可能也是这个类别的。

距离的判断

常用的距离有欧式距离和曼哈顿距离。欧式距离就是我们最常用的两点间距离。
KNN

曼哈顿距离则是坐标相减:

KNN

K值的选择

一、近似误差与估计误差:
近似误差:对现有训练集的训练误差,关注训练集,如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。模型本身不是最接近最佳模型。
估计误差:可以理解为对测试集的测试误差,关注测试集,估计误差小说明对未知数据的预测能力好,模型本身最接近最佳模型。
二、K值确定标准:
K值过小:k值小,特征空间被划分为更多子空间(模型的项越多),整体模型变复杂,容易发生过拟合,k值越小,选择的范围就比较小,训练的时候命中率较高,近似误差小,而用test的时候就容易出错,估计误差大,容易过拟合。
K值=N:无论输入实例是什么,都将简单的预测他属于训练实例中最多的类。

实例

鸢尾花的分类

import numpy as np
import csv
import pandas as pd
import operator
#本地数据集操作
file = (csv.reader(open(r'C:\Users\Li\Desktop\lris.csv','r')))
data  = []
for line in file:
    data.append(line)
data = np.array(data)
sl_tr = data[1:120][:,0]
sw_tr = data[1:120][:,1]
pl_tr = data[1:120][:,2]
pw_tr = data[1:120][:,3]
kind_tr = data[1:120][:,4] 
sl_te = data[120:][:,0]
sw_te = data[120:][:,1]
pl_te = data[120:][:,2]
pw_te = data[120:][:,3]
kind_te = data[120:][:,4]
k = 10

def cmp(x):
    return x[0]
def cal(x,y): #计算距离
    res = (float(sl_te[x])-float(sl_tr[y]))**2 +(float(sw_te[x])-float(sw_tr[y]))**2 + (float(pl_te[x])-float(pl_tr[y]))**2 + (float(pw_te[x])-float(pw_tr[y]))**2
    return res
def knn():
    sum = 0
    ls = []
    for i in range (sl_te.size):
        di = {"Iris-setosa":0,"Iris-versicolor":0,"Iris-virginica":0}
        for j in range(sl_tr.size):
            ls.append((cal(i,j),kind_tr[j]))    #将距离和类别信息加入列表
        ls = sorted(ls,key = cmp)
        
        for m in range(k):
            di[ls[m][1]]+=1 #属于该类别的数量加1
        res = max(di, key=di.get)
        if res == kind_te[i] :
            sum += 1
    return sum
            
sum = knn()

print("训练数据个数为",sl_tr.size,"个","测试数据个数为",sl_te.size,"个","K值为",k,"预测准确率为",sum/sl_te.size);

KNN

本文地址:https://blog.csdn.net/qq_43467171/article/details/107451954

相关标签: 机器学习