k邻近算法(KNN)实例
一 k近邻算法原理
k近邻算法是一种基本分类和回归方法.
原理:K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的
多数属于某个类,就把该输入实例分类到这个类中。

如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。这也就是我们的目的,来了一个新的数据点,我要得到它的类别是什么?好的,下面我们根据k近邻的思想来给绿色圆点进行分类。
- 如果K=3,绿色圆点的最邻近的3个点是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
- 如果K=5,绿色圆点的最邻近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。
参考一文搞懂k近邻(k-NN)算法(一) https://zhuanlan.zhihu.com/p/25994179
二 特点
优点:精度高(计算距离)、对异常值不敏感(单纯根据距离进行分类,会忽略特殊情况)、无数据输入假定
(不会对数据预先进行判定)。
缺点:时间复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。
三 欧氏距离(Euclidean Distance)
欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:

四 sklearn库中使用k邻近算法
- 分类问题:from sklearn.neighbors import KNeighborsClassifier
- 回归问题:from sklearn.neighbors import KNeighborsRegressor
五 使用sklearn的K邻近简单实例
1 数据蓝蝴蝶
#导包
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
from sklearn.neighbors import KNeighborsClassifier #k邻近算法模型 #使用datasets创建数据
import sklearn.datasets as datasets
iris = datasets.load_iris() feature = iris['data']
target = iris['target'] #将样本打乱,符合真实情况 np.random.seed(1)
np.random.shuffle(feature)
np.random.seed(1)
np.random.shuffle(target) #训练数据
x_train = feature[:140]
y_train = target[:140]
#测试数据
x_test = feature[-10:]
y_test =target[-10:] #实例化模型对象&训练模型
knn = KNeighborsClassifier(n_neighbors=10)
knn.fit(x_train,y_train)
knn.score(x_train,y_train) print('预测分类:',knn.predict(x_test))
print('真实分类:',y_test)
2 根据身高、体重、鞋子尺码,预测性别
#导包
import numpy as np
import pandas as pd
from pandas import DataFrame,Series #手动创建训练数据集
feature = np.array([[170,65,41],[166,55,38],[177,80,39],[179,80,43],[170,60,40],[170,60,38]])
target = np.array(['男','女','女','男','女','女']) from sklearn.neighbors import KNeighborsClassifier #k邻近算法模型 #实例k邻近模型,指定k值=3
knn = KNeighborsClassifier(n_neighbors=3) #训练数据
knn.fit(feature,target) #模型评分
knn.score(feature,target) #预测
knn.predict(np.array([[176,71,38]]))
3 手写数字识别
- 导包
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsClassifier
- 查看单一图片特征
img=plt.imread('data/0/0_2.bmp')
plt.imshow(img)

- 提炼样本数据
feature=[]
target=[]
for i in range(10):
for j in range(500):
img_arr=plt.imread(f'data/{i}/{i}_{j+1}.bmp')
feature.append(img_arr)
target.append(i) #构建特征数据格式
feature=np.array(feature)
target=np.array(target) feature.shape #(5000, 28, 28) #输入数据必须是二维数组,必须对feature降维
#(1)降维方式一:mean() (2)降维方式二:reshape()
feature=feature.reshape(5000,28*28) #将样本打乱 (必须使用多个seed)
np.random.seed(5)
np.random.shuffle(feature)
np.random.seed(5)
np.random.shuffle(target) #数据分割为训练数据和测试数据
x_train=feature[:4950]
y_train=target[:4950]
x_test=feature[-50:]
y_test=target[-50:]
- KNN模型建立和评分
#训练模型
knn.fit(x_train,y_train) #评分
knn.score(x_train,y_train) #预测
# knn.predict(x_test)
- 真实预测手写数字图片的一般流程
# 读取图片数据
num_img_arr=plt.imread('../../数字.jpg')
plt.imshow(num_img_arr)

#图片截取数字5
five_arr=num_img_arr[90:158,80:132]
plt.imshow(five_arr)

#降维操作(five数组是三维的,需要进行降维,舍弃第三个表示颜色的维度)
print(five_arr.shape) #(65, 56, 3)
five=five_arr.mean(axis=2)
print(five.shape) #(65, 56)
plt.imshow(five)

# 图片压缩为像素28*28
import scipy.ndimage as ndimage
five = ndimage.zoom(five,zoom = (28/68,28/52))
five.shape #(28, 28) # 压缩后的5的显示
plt.imshow(five)

# 把数据降维为feature 数据格式
five.reshape(1,28*28)
#预测
knn.predict(five.reshape(1,28*28))

下载源数据和代码:https://github.com/angleboygo/data_ansys
k邻近算法(KNN)实例的更多相关文章
- <机器学习实战>读书笔记--k邻近算法KNN
k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...
- Python实现kNN(k邻近算法)
Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...
- 机器学习算法及代码实现–K邻近算法
机器学习算法及代码实现–K邻近算法 1.K邻近算法 将标注好类别的训练样本映射到X(选取的特征数)维的坐标系之中,同样将测试样本映射到X维的坐标系之中,选取距离该测试样本欧氏距离(两点间距离公式)最近 ...
- 《机器学习实战》学习笔记一K邻近算法
一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...
- 监督学习——K邻近算法及数字识别实践
1. KNN 算法 K-近邻(k-Nearest Neighbor,KNN)是分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似( ...
- k近邻算法(KNN)
k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. from sklearn.model_selection ...
- kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)
一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...
- [机器学习实战] k邻近算法
1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...
- 机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)
六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocess ...
随机推荐
- (6)STM32使用HAL库实现modbus的简单通讯
1.判断地址.校验 2.读取本机数据并校验打包 3.发送数据包 4.本机数据长度比要读取的长度短怎么办 4.校验错误怎么办
- ansible命令应用基础
ansible命令应用基础: Usage: ansible <host-pattern> [-f forks] [-m module_name][-a args] -f ...
- 浅谈tcp粘包问题
第一部分:简介tcp socket通信的底层原理 原理解析图: socket通信过程如图所示:首先客户端将发送内容通过send()方法将内容发送到客户端计算机的内核区,然后由操作系统将内容通过底层路径 ...
- 使用Rotativa在ASP.NET Core MVC中创建PDF
在本文中,我们将学习如何使用Rotativa.AspNetCore工具从ASP.NET Core中的视图创建PDF.如果您使用ASP.NET MVC,那么Rotativa工具已经可用,我们可以使用 ...
- 【原】javascript笔记之this用法
javascript中的this学习起来相对复杂,最近花了点时间研究,总结起来大概这只有5种情况,相信只要熟悉这5种用法,基本是可以解决所有的this问题,文本不介绍this设计原理,只介绍用法,阅读 ...
- for in 和 for of 的区别
1.for...in 循环:只能获得对象的键名,不能获得键值 for...of 循环:允许遍历获得键值 var arr = ['red', 'green', 'blue'] for(let item ...
- 我敢说你不一定完全理解try 块,catch块,finally 块中return的执行顺序
大家好,今天我们来讲一个笔试和面试偶尔都会问到的问题,并且在工作中不知道原理,也会造成滥用. 大家可能都知道,try 块用来捕获异常,catch块是处理try块捕获的异常,finally 块是用来关闭 ...
- Docker最全教程之使用 Visual Studio Code玩转Docker(二十)
前言 VS Code是一个年轻的编辑器,但是确实是非常犀利.通过本篇,老司机带你使用VS Code玩转Docker——相信阅读本篇之后,无论是初学者还是老手,都可以非常方便的玩转Docker了!所谓是 ...
- 设计模式 | 模板方法模式(template method)
定义: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构:(书中图,侵删) 一个定义整体框架的父类 若干不同具体实现 ...
- a标签伪类选择器以及伪元素:hover的案例
1.通过我们的观察发现a标签存在一定的状态1.1默认状态, 从未被访问过1.2被访问过的状态1.3鼠标长按状态1.4鼠标悬停在a标签上状态 2.什么是a标签的伪类选择器?a标签的伪类选择器是专门用来修 ...