#KNN

news/2024/9/15 22:25:38/

本文github 代码:https://github.com/crystal30/KNN

一.  # KNN algorithm 原理

KNN:k-nearest neighbors algorithm,

(1)用途:分类,且天然的可以解决多分类问题(sklearn.neighbors.KNeighborsClassifier)

          回归(sklearn.neighbors.KNeighborsRegressor)

(2)优点:实现简单,易于理解

(3)缺点:

效率低下:训练集共有m个样本,每个样本有n个特征,则预测每一个新的数据需要O(m*n)

                优化:使用树的结构:KD-Tree,Ball-Tree

高度数据相关:

预测的结果不具有可解释性,其只是根据距离来判断

维数灾难:

解决方法:降维(后续后涉及)。

1分类的原理:

1.1

如上图所示:

场景描述:数据有红、蓝两类,此时进来一个新的数据(绿色表示),用KNN算法来预测绿色属于哪一类,其中K=3

假设:上图的点的坐标都是已知的,

算法步骤:(1)计算绿点到各个点(所有黄点和蓝点,我们也称为训练数据)的距离(一般使用欧式距离)

                (2)K=3,根据距离得到离绿点最近的3个点

                (3)统计这三个点中,哪一类的数据最多,则绿点就属于哪一类(如上图,离绿点最近的三个点中,有两个是红点,一个点是蓝点,则可以判定绿点属于红色的那一类)

1.2 利用 sklearn datasets中鸢尾花的数据集  KNN的简单的实现

import numpy as np

 

import matplotlib.pyplot as plt
from sklearn import datasets
import math

 

from collections import Counter

iris = datasets.load_iris()   #加载鸢尾花的数据到 iris中
iris.keys()
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])

 

Row_ind = np.arange(0,100,10)  #array([ 0, 10, 20, 30, 40, 50, 60, 70, 80,90])
#为简单起见,我们从第一类和第二类鸢尾花中各取出5个数据
X_train = iris.data[Row_ind,2:]
y_train = iris.target[Row_ind]
#绘图
plt.scatter(X_train[y_train==0,0],X_train[y_train==0,1],color = 'r')
plt.scatter(X_train[y_train==1,0],X_train[y_train==1,1],color = 'b')
plt.show()

 

new = iris.data[56,2:] #新进入一个点,预测这个点属于哪一类
distances = np.array([math.sqrt(i) for i in np.sum((X_train -new)**2,axis=1)]) # 计算出new 到每个点的欧式距离

#distances 的输出:    array([3.58468967, 3.49284984,3.31058907, 3.40147027, 3.64005494,

                                                      0.2       , 1.34164079, 0.2236068 , 1.02956301,0.5       ])

nearest = distances.argsort() #将距离从小大大排序,取出arg

k=7 #取最临近的7个点
top_y = y_train[nearest[:k]]

 

votes = Counter(top_y) #统计top_y 中的数据

#votes输出:    Counter({0: 2, 1: 5})

 

 

 

predict_newy = votes.most_common(1)[0][0] #输出统计结果中最common的lable

 

 

二 KNN算法的封装

1.将上述的实现过程整理为一个函数  KNN(X_train,y_train,newx,k),并保存在KNN.py文件中,以便我们后续调用。

2.sklearn中KNeighborsClassifier 算法的使用

   一般,sklearn 中的机器学习算法,都是以面向对象的方式进行封装。以KNeighborsClassifier 为例子,均有以下几个步骤

  (1) 创建实例 knn_clf = KNeighborsClassifier(n_neighbors=7)

  (2) 拟合:knn_clf.fit(X_train,y_train)

  (3)预测:knn_clf.predict(new)

3.将我们编写的KNN算法也以面向对象的方式进行封装,即创建类:KNNClf, 并将其存放在KNNClf.py中

 具体的代码见github:https://github.com/crystal30/KNN

 

三. KNN根据算法的性能 设置超参数

 

 

1.性能一般用Accuracy来测量:

(1)首先编写myTrain_test_split函数,将数据集分成 从训练集和测试集。
     当然,也可以直接调用 sklearn 中的函数
     from sklearn.model_selection import train_test_split

 

(2)假设:我们的测试数据为:X_test, 测试数据的标签为 y_test, 用算法预测的标签为y_predict

accuracy = 预测的正确的数量/总的测试样本数

用程序来写就是 accuracy = sum(y_predict == y_test)/len(y_test)

代码:test accuracy1.ipynb 以及代码的封装:  accaracy 封装_load digits2.ipynb

Q:在模型进入真实环境前,怎样改进模型呢? 

        可以通过设置合理的超参数 来是模型的测试误差最小

2.超参数:

超参数:即指 在运行机器学习算法之前需要指定的参数,KNN中的K即为典型的超参数。

调参:这里的“参”,一般指的就是超参数

(更优)超参数的寻找:领域知识

                                经验数值(算法中默认的值一般可认为是经验数值)

                                实验搜索

1.1KNN模型中超参数的设置

(1)KNN算法没有模型参数,KNN算法中的K是典型的超参数

 

根据

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5weights=’uniform’algorithm=’auto’leaf_size=30p=2metric=’minkowski’metric_params=Nonen_jobs=1**kwargs)

我们初步的来设置n_neighbors(即KNN中的K),weights,p 这几个超参数

具体的每个参数的含义可查询document 

http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#sklearn.neighbors.KNeighborsClassifier

[source]

(2)weights:考虑距离权重,即把每个点到要预测数据的距离的倒数作为权重。某个点距离预测点越近,则权重越大。

 

 

(3)p:距离算法的选择,上面我们一直用的是欧式距离,用曼哈顿距离,性能会不会更好呢?

欧式距离:,变形

 

曼哈顿距离: ,        变形     

 

明可夫斯基距离:

这样我们对使用哪种距离的选择就变成了对超参数p的选择。

注意:欧式距离和曼哈顿距离都是明可夫斯基距离的一种,KNeighborsClassifier 中metric 默认的是’minkowski’。

KNeighborsClassifier(n_neighbors=5weights=’uniform’algorithm=’auto’leaf_size=30p=2metric=’minkowski’metric_params=Nonen_jobs=1**kwargs)

当然还有很多其他的距离,如

在这里,我们不予考虑。

代码:search Hyper-parameter 3.ipynb

 

1.2 利用sklearn中的模块对KNN模型中超参数的选择——网格搜索

from sklearn.model_selection import GridSearchCV

详见github代码:Grid_Search_HyperParameters4

四.训练数据和测试数据的归一化

Q:为什么我们要对数据归一化呢?下面我们来做一个简单的示例。

原始数据:

如上图所示:假设我们有两个样本,每个样本有两个特征:肿瘤大小和发现时间。

                    如果再来一个新的测试数据,计算其到样本1,样本2的距离,则特征肿瘤大小的贡献微乎其微,但特征肿瘤大小对                     判断是否是恶性肿瘤是一个很重要的因素,此时,就需要我们对数据归一化,即将肿瘤大小和发现时间归一化在同                     一个量级,而样本间同一个特征值的相对大小不变。

数据归一化后:

这样再算测试数据到样本间距离时,将不由某一个特征的主导。

1.数据标准化的理论知识

数据归一化,即将所有的数据映射到同一尺度。如上实例所示,我们是将肿瘤大小和发现时间映射到了同一尺度。

1.1 将特征数据缩放到一个范围 scale to a range

使用这一方法的情况一般有两种:

  • 特征的标准差较小
  • 可以使稀疏数据集中的0值继续为0,特别适用于缩放稀疏数据。

(1)最值归一化(MinMaxScaler):把所有的数据映射到0-1之间。适用于分布有明显边界的情况(如:考试成绩)

缺点:容易受边界极端值的影响。

(2) MaxAbsScaler,标准化后的数据的取值范围为[-1, 1]

 

1.2 均值方差归一化(standardization)

把所有的数据归一到均值为0,方差为1的分布中。数据分布没有明显的边界,有可能存在极端数据值。

均值方差归一化,通常也称z-score标准化,即将数据转化成均值为0方差为1的高斯分布,但是对于不服从标准正态分布的特征,这样做效果会很差。

1.3 RobustScaler

Scale features using statistics that are robust to outliers.

 

2. 标准化与归一化的区别

标准化是依照特征矩阵的列处理数据,比如通过求z-score的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。常用于文本分类和内容聚类的向量空间模型。

规则为l2的归一化公式如下:


 


可使用sklearn.preprocessing库的Normalizer类对数据进行归一化。

3.数据归一化的简单程序实现

见github代码:data_X_train_Normalize5

4. 对sklearn.datasets 中的数据进行归一化

一般我们比较常用的是均值方差归一化,所以,我们我们这里仅讨论均值方差归一化的情况。

from sklearn.preprocessing import StandardScaler 实现数据归一化

from KNNProject.preprocessing import StandardScaler 实现数据归一化(KNNProject 为本地自己编写的包)

(1)一般,我们有训练数据集,和测试数据集,对这两个数据集都需要归一化。而我们往往不知道下一个测试数据会是什么,即测试数据我们不能完整的获得。

所以:

归一化的过程:

 

github代码:skl_local_normalize6

标准化后与标准化之前的预测准确率相比,有明显的改进。

 

 

 

 

 

 

 

 

 


http://www.ppmy.cn/news/162028.html

相关文章

KNN

前言: … 目录 1 分类2 回归3 总结4 代码 k近邻算法(KNN)是监督学习算法,意味着训练数据集需要有label或者类别,KNN的目标是把没有标签的数据点(样本)自动打上标签或者预测所属类别。同时KNN也可用于回归。…

Kohonen网络

kohonen network 聚类 Kohonen网络是自组织竞争型神经网络的一种,该网络为无监督学习网络,能够识别环境特征并自动聚类。Kohonen 神经网络是芬兰赫尔辛基大学教授 Teuvo Kohonen提出的,该网络通过自组织特征映射调整网络权值,使神…

VisualAssist v10.9.2491 NEW-Crack

VisualAssist 为 C/C 和 C# 开发人员填补 Visual Studio 中的空白 快速导航 以全新的方式轻松移动您的代码 — 移动到您的项目和解决方案中的任何文件、方法、符号或引用。从任何地方到达任何地方。 与其他类型的功能一样,Visual Assist 的导航功能对于 IDE 来说是全…

电竞桌什么牌子好?哪个电竞桌好看

当代社会有了网络游戏之后,很多的朋友都是十分的热爱,对于这种游戏也是感觉到十分的刺激,不仅不需要出门就可以体验到各类的游戏,还能够从中体会到团队合作以及运筹帷幄的感觉。不过若是长久的玩游戏也会导致身体不适,…

洗拖吸地一体机哪个牌子好,口碑好的洗地机分享

这几年清洁类的小家电非常热门,无线吸尘器、扫地机器人、扫拖一体机、洗地机和擦窗机器人层出不穷,不同种类的清洁仪器,侧重的功能也大有不同,洗地机是一种更为符合日常清洁家庭垃圾当中的一种清洁仪器,一拖就能把地面…

智能洗地机哪个牌子好,好用智能洗地机分享

科技改变生活,洗地机的出现,可以让在清洁卫生时更加便捷,减少长时间弯腰打扫卫生的困扰。洗地机作为一种新颖清洁仪器,对于大家庭、小孩家庭、养宠物家庭是一种更省力、更高效的清洁方式。下面就分享一些好用的智能洗地机&#xf…

进口洗地机哪个牌子好,分享几款热门洗地机

洗地机的品牌以及种类越来越多,有线、无线洗地机以及不同品牌差异化很大等,其实最重要的是看你需要打扫什么样的环境,日常清洁家庭当中使用较多,建议大家入手无线手持式洗地机,这种类型的洗地机清洁力度更强&#xff0…

除甲醛净化器哪个牌子比较好 除甲醛品牌十大排名

甲醛是一种有毒有害污染物质,是影响室内环境健康的重要污染物质。室内甲醛大部分来自于装修材料、家具当中,另外,还有来自纺织品、文具、书籍、玩具等日用品中的甲醛。在现如今工业化生产中,甲醛作为一种高性价比的辅助剂&#xf…

洗地机哪个牌子售后好,分享几款质量好的洗地机推荐

在选择洗地机时,除了产品本身的质量外,售后服务也是非常重要的考虑因素。有好的售后服务保证了产品的使用效果和持续性能,能够带来更好的购物体验。在下面我将为大家推荐几款质量好的洗地机。 1、希亦T800洗地机 价格:&#xffe…

家用智能洗地机哪个牌子好、这几款旗舰机好用又实惠

随着智能科技的发展,各式各样的家用电器也相继出现。传统的扫帚、拖把已经不能满足消费者的需求。随着当代年轻人能不动手就不动手的理想,催生了洗地机。洗地机融合了吸尘机,可以一边吸尘,一边拖地,一边自行清理刷头&a…

家用什么牌子的投影仪好?投影仪买哪个好

最近家用投影仪的风是真的很大,几乎已经成为了一件时尚单品,毕竟谁不想花个几千块钱享受电影院级的体验呢。但是,市面上各种各样的家用投影仪让众多消费者们挑花了眼都没有选出自己心仪的产品,那么今天就让我来手把手教大家如何挑…

拖地洗地机哪个牌子好,洗地机到底好不好用

洗地机是一款能够多用的清洁产品,既能清洁地面上固态污渍,也能清洁液态污渍,灰尘、毛发、食物残渣,都能够一拖即净,多种使用功能,洗地机也受到了越来越多人的欢迎,市面上众多款洗地机当中&#…

2023洗地机哪个牌子的好用?洗地机排行榜推荐

洗地机是集扫,拖,吸的功能于一体的清洁工具,技术门槛相对不高,毕竟吸尘器已经出现很多年了,而洗地机则是在吸尘器上添加了拖地跟水箱模块;但是洗地机上比较重要的是智能化水平,对地面污渍的识别&#xff0c…

Linux LNMP(Linux NGINX MySQL PHP)

NGINX处理静态页面性能出色,但是动态页面几乎没有处理能力,比Apache还差 所以涉及动态页面的场合一般由PHP Python Java(后缀php,py,jsp)等处理 静态页面请求 客户端 -> nginx动态页面请求 …

我选择使用Lambda,就是因为其简洁、灵活、高效!

1. 什么是Java Lambda Java Lambda表达式是Java SE 8引入的一个新特性,它可以让开发者更加简洁、灵活、高效地进行函数式编程。Lambda表达式本质上是一种匿名函数,它可以被传递到其他方法中作为参数,或者存储在变量和数据结构中。 Lambda表…

QT生成PDF

使用第三方工具wkhtmltopdf //p:自定义html缓存和PDF保存文件夹;content:html;name:pdf文件名称bool BuildPDF(QString& p,QString content,QString name)//生成pdf{QString softpath QApplication::applicationDirPath() "/wkht…

C++ QT 读写TXT文件基操

读取txt文件&#xff1a; #include <QFile> #include <QTextStream> QFile file("filename.txt"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QTextStream in(&file); while (!in.atEnd()) { QS…

硬件学习网站

1.资源搜索 google x度就是辣鸡 2.Hackday https://hackaday.io/projects 一天刷几十遍的开源硬件项目网站 3.Github https://github.com/ 也不全是软件&#xff0c;FPGA的开源矿机了解下 4.CircuitMaker https://workspace.circuitmaker.com 硬件版githubaltium 5.电路城 htt…

【复杂网络建模】——python通过平均度和随机概率构建ER网络

目录 一、复杂网络建模 二、ER网络 三、构建ER网络方法 四、基于python构建ER网络 1、基于节点数量和链接概率 2、基于平均度来生成 五、ER网络在现实中的实际应用 一、复杂网络建模 复杂网络建模是指对复杂网络进行描述和分析的过程。复杂网络是由大量相互连接的节点…

电脑、数码资讯网站

界面应设计得尽量洗练一些。与网页设计员直接有关的网页代理或网页设计员网站需要从美 的角度和技术的层面来表现出较高的水准。所以洗练的感觉和富有创意的表现手法是非常重要的。 http://www.unleashedmedia.com... 数码资讯、网页设计&#xff1a;由于是直接与网页设计者有…