knn算法(k近邻算法)实现与剖析(代码片段)

ss-py ss-py     2023-04-08     668

关键词:

KNN(K-Nearest Neighbors)算法,又称K近邻算法,单从字面意思我们就能知道,这个算法肯定是和距离有关的。

KNN算法的核心思想:

在一个特征空间中,如果某个样本身边和他最相邻的K个样本大多都属于一个类别,那么这个样本在很大程度上也属于这个类别,且该样本同样具有这个类别的特性。

其实说白了就是“近朱者赤、近墨者黑”,你身边离你最近的K个人中大多数人都属于某一个类别,那么你很有可能也属于这一个类别(当然,用人来举例子不是很恰当)

该方法在“分类决策”上只依据最近邻的k个样本的类别来判断待分样本的类别,K通常是不大于20的一个整数,具体怎么选取,这个也很有学问,后边会详细讲解。

 

上边说了,一个待分样本的所属的类别,很大程度上取决于和他最近的K个样本的类别,那么这个“最近”是如何计算出来的呢,比如一堆人站在一块儿,我们可以可以轻易的计算出

一个人距他身边的每个人的距离,那么数据呢?其实道理是一样的,我们可以使用欧拉距离来计算,其实我们在中学几何中学习二维平面内两点间距离、三维空间内两点间距离时已经学过了,

我们可以将二维数据看作是这两个点都只有两个特征,三维数据可以看成是有三个特征,那么当一组数据中每个数据都有多个特征时,我们也可以将其看作是多维空间中的一个点,

也同样可以使用欧拉距离来计算。

   技术图片

 

        技术图片

 

 

 当拓展到多个特征之后,就会简写成上边红框中的公式,这在机器学习算法中较为常见。

KNN算法的计算步骤:

(1)计算待分类数据与各个样本数据之间的距离

(2)对距离进行排序

(3)选取距离最小的前K个点

(4)统计前k个点所属的类别

(5)返回前K个点出现频率最高的类别做为待分类数据的预测分类

 

手动封装一个KNN算法:

import math
import numpy as np
from collections import Counter

class NKKClass(object):

    def __init__(self, K):
        # 初始化KNN类属性
        assert K > 0, "常数K需为正整数"
        self.K = K
        self._X_train = None  # 私有的训练特征数组
        self._y_train = None  # 私有的训练标签向量


    def fit(self, X_train, y_train):
        # 根据训练特征数组X_train和标签向量y_train来训练模型(当然,KNN算法中是不需要训练模型的)
        self._X_train = X_train
        self._y_train = y_train

    def predict(self, X_predict):
        # 传入待预测的特征数据集X_predict,返回这个特征数据集所对应的标签向量
        y_predict = [self._predict(i) for i in X_predict]
        return y_predict

    def _predict(self, i):
        # 给定单个特征数据,根据计算欧拉距离,返回预测标签
        # 利用欧拉距离计算两点间距离
        distances = [ math.sqrt(np.sum((x_train - i)**2))  for x_train in  self._X_train]
        nearset = np.argsort(distances)  #将数组升序排序,然后提取其所对应的索引index进行返回
        # 根据索引取出标签向量中的值
        topK_y = [ self._y_train[index] for index in nearset[:self.K]]
        # 统计array中每个元素出现频率,n=1表示取出出现频率最高的那个元素
        votes = Counter.most_common(n=1)[0][0]
        return votes
  
def accuracy_score(self, y_test, y_predict):     # 根据train_test_split得到的y_test和预测得到的y_predict计算分类准确度     return sum(y_true == y_predict) / len(y_true)
  
def score(self, X_test, y_test):     # 根据 train_test_split拆分出来的X_test,y_test直接计算分类准确度     y_predict = self.predict(X_test)     return self.accuracy_score(y_test, y_predict)

 

上边这个类其实就是模仿着 scikit-learn机器学习库中封装的的kNN算法来写的。

 

下边我们来加载  sklearn 库中自带的鸢尾花数据集来测试一下吧

技术图片

 

 

我们获取到数据集后,并不能直接将所有数据集都作为训练数据集,还是需要留下一小部分作为测试数据集的,所以又牵扯到train_test_split的问题,而且鸢尾花数据集已经默认排过序了,

所以我们在进行train_test_split之前还需要先将特征数据集和标签向量进行乱序才行的。

 

技术图片

 

 

技术图片

 

 

其实这个train_test_split过程,在sklearn中已经封装好了,可以直接调用。

from sklearn.model_selection import train_test_split

train_test_split函数有4个参数,并且返回四个返回值:

4个参数:

train_data:需要被拆分的特征数组

train_target:需要被拆分的标签向量

test_size:如果是浮点数,在0-1之间,表示测试数据集占总数据集的百分比,如果是整数,代表测试数据集的行数。

random_state:随机种子,默认为None

4个返回值:

X_train 训练特征数组

X_test 测试特征数组

y_train 训练标签向量

y_test 测试标签向量

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)

 接下来调用sklearn库,直接使用KNN算法对鸢尾花数据集进行预测,计算分类准确度:

# 加载sklearn库中KNN算法的类
from sklearn.neighbors import KNeighborsClassifier
# 加载sklearn自带的数据包
from sklearn import datasets
# 加载sklearn自带的train_test_split函数
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score


# 加载数据包中自带的小数据集(鸢尾花数据集)
iris = datasets.load_iris()
X = iris.data  # 数据集的特征矩阵
y = iris.target  # 数据集的标签向量

# 将数据集拆分,二八分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=5)

# 实例化,n_neighbors就是KNN算法中的那个K
KNN_classifier = KNeighborsClassifier(n_neighbors=6)
KNN_classifier.fit(X_train, y_train)  # 对训练数据集进行拟合

predict_y_test = KNN_classifier.predict(X_test)  # 对测试的特征数组进行预测
# 针对train_test_split得到的y_test和预测出来的标签向量进行计算分类准确度
Classification_accuracy = accuracy_score(y_test, predict_y_test)
print(Classification_accuracy)
# 针对train_test_split得到的测试用的特征数组和标签向量,直接计算其分类准确度(不用先计算出测试标签向量)
Classification_accuracy = KNN_classifier.score(X_test, y_test)
print(Classification_accuracy)

 

 

 技术图片

 

 

 

机器学习分类算法--k近邻算法knn(代码片段)

一、K近邻算法基础KNN-------K近邻算法--------K-NearestNeighbors思想极度简单应用数学知识少(近乎为零)效果好(缺点?)可以解释机器学习算法使用过程中很多细节问题更完整的刻画机器学习应用的流程 importnumpyasnpimportmatplotlib... 查看详情

机器学习-k-近邻算法(代码片段)

TableofContents前言算法介绍距离计算算法实现数据转换K值选取结语前言K-近邻算法(k-nearestneighborsalgorithm),又称为KNN算法,是这学期机器学习课教的第一个算法,也是我接触的第一个机器学习算法。学习之后的感触便是:机器学习... 查看详情

k-近邻算法(knn)(代码片段)

K-近邻算法(KNN)1KNN介绍2KNN的初步使用3距离度量3.1基本性质3.2常见距离公式3.3距离属性4k值选择5KNN优化—kd树5.1kd树简介5.2构造方法5.3案例分析6数据集6.1获取数据集6.2划分数据集7特征工程—特征预处理7.1归一化7.2标准化... 查看详情

机器学习之k-近邻(knn)算法(代码片段)

 一.K-近邻算法(KNN)概述   最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到... 查看详情

k近邻算法——knn(代码片段)

KNN(K-NearestNeighbor)算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个... 查看详情

k-nearestneighbors(knn)k近邻算法(代码片段)

KNN算法是机器学习最简单的算法,可以认为是没有模型的算法,也可以认为数据集就是它的模型。它的原理非常简单:首先计算预测的点与所有的点的距离,然后从小到大排序取前K个最小的距离对应的点,统计前K个点对应的labe... 查看详情

机器学习之knn(k近邻)算法(代码片段)

1、算法介绍k近邻算法是学习机器学习的入门算法,可实现分类与回归,属于监督学习的一种。算法的工作原理是:输入一个训练数据集,训练数据集包括特征空间的点和点的类别,可以是二分类或是多分类。预测时,输入没有... 查看详情

机器学习机器学习分类算法--k近邻算法knn(下)(代码片段)

六、网格搜索与K邻近算法中更多的超参数七、数据归一化FeatureScaling解决方案:将所有的数据映射到同一尺度      八、scikit-learn中的Scalerpreprocessing.pyimportnumpyasnpclassStandardScaler:def__init__(self):self.mean_=None 查看详情

k-近邻算法(代码片段)

一、概述k-近邻算法(k-NearestNeighbouralgorithm),又称为KNN算法,是数据挖掘技术中原理最简单的算法。KNN的工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据后,在训练数据集中找到与新数据最邻近的k个实... 查看详情

分类算法之k-近邻算法(knn)(代码片段)

一、k-近邻算法概述 1、什么是k-近邻算法如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。2、欧式距离两个样本的距离可以通过如下公式计算,又叫... 查看详情

史诗级干货长文k-近邻算法(代码片段)

K-近邻算法前言1.K-近邻算法简介1.1什么是K-近邻算法1.2K-近邻算法(KNN)概念1.3电影类型分析1.4KNN算法流程总结2.KNN算法API初步使用2.1Scikit-learn工具介绍2.1.1安装Scikit-learn2.1.2Scikit-learn包含的内容2.2K-近邻算法API2.3案例2.3.1步骤分析2.3.2... 查看详情

机器学习k-近邻算法(代码片段)

目录1K-近邻算法简介2K-近邻算法(KNN)2.1定义2.2距离公式3电影类型分析3.1问题3.2K-近邻算法数据的特征工程处理4K-近邻算法API5案例:预测签到位置5.1分析5.2代码5.3结果分析6K-近邻总结1K-近邻算法简介目标说明K-近邻算法的距离... 查看详情

机器学习-5.k-近邻算法(knn)(代码片段)

1.定义定义:所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例(也就是上面所说的K个邻居),这K个实例的多数属于某个类,就把该输入... 查看详情

机器学习(算法篇)——k-近邻算法(代码片段)

目录K-近邻算法简介K-近邻算法(KNN)概念实现流程k近邻算法api初步使用机器学习流程:Scikit-learn工具介绍Scikit-learn包含的内容K-近邻算法API距离度量欧式距离(EuclideanDistance)曼哈顿距离(ManhattanDistance)切比雪夫距离(ChebyshevDistance)... 查看详情

2.knn和kdtree算法实现(代码片段)

1.K近邻算法(KNN)2.KNN和KdTree算法实现1.前言KNN一直是一个机器学习入门需要接触的第一个算法,它有着简单,易懂,可操作性强的一些特点。今天我久带领大家先看看sklearn中KNN的使用,在带领大家实现出自己的KNN算法。2.KNN在sk... 查看详情

机器学习之knn(k-近邻算法)(代码片段)

Contents  KNN算法简介算法实现总结 KNN算法简介 k近邻算法(k-nearestneighbor)是一种基本的分类、回归算法。算法的基本思想是“物以类聚”。也就是说,物体周边事物的类别可以在某种程度上反应该物体的类别。例... 查看详情

机器学习与数据挖掘系列算法之--knn的python实现(代码片段)

K近邻算法原理较为简单,不多介绍,直接上python实现,有什么疑问或错误的地方敬请指出探讨,谢谢。Knn.pyfromalgorithm.classification.common.PredictBaseimportPredictBasefromalgorithm.classification.commonimportUtils#author:chenhq#createdate:20... 查看详情

机器学习实战task1(knn)k近邻算法的应用(代码片段)

1背景1.1k近邻算法的概述(1)k近邻算法的简介k-近邻算法是属于一个非常有效且易于掌握的机器学习算法,简单的说就是采用测量不同特征值之间距离的方法对数据进行分类的一个算法。(2)k近邻算法的工作... 查看详情