1. 算法原理:

K-邻近算法的原理很简单,就是用你的“邻居”来推断出你的类别。用于离散型数据分析处理。

例子1:如下图有ABCD四个用于参考的样本点,都已知晓自己的坐标位置,这时E来了,不清楚自己的位置,就分别计算出于ABCD个点的距离,发现和A最近,就认为与A的位置相同(既“类别“”相同)。

例子2:看到好多教程用过的一个例子,如下图所示。根据样本出现的不同类别的镜头数量判断未知电影的属于什么类别,也是算出与各个样本的距离,然后做出判别。

专业定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
     来源:KNN算法最早是由Cover和Hart提出的一种分类算法

2. 距离计算,K值说明

根据原理和定义,有两个陌生的词。

(1)距离计算公式

两个样本的距离可以通过如下公式计算,又叫欧式距离。相似的样本,特征之间的值应该都是相近的。
比如说,a(a1,a2,a3),b(b1,b2,b3)

(2)K的取值

所谓K值就是设置一个比较上限,就比如上面的例子2中,总共6个样本,如果K=1,即只参考距离最小的那个样本,这个样本为爱情片就预测成爱情片,如果K=3,就参考距离最低的三个值,发现100%都是爱情片,如果K=5,则发现爱情片占比60%,如果K=6,各占比50%,没法给结果了。所以K值不一定如例子1一样只为1,也可设成其他数用于给最终结果投票。

注:

如果K值取很小则容易受异常点影响,如果K值取很大则容易受样本k值数量(类别)波动。所以就有调参的过程了,选取一个合适的k值。

3. K-邻近算法的数据要求

需要进行标准化,若不标准,数值大的特征将决定性的影响最终结果,标准化后,各个特征的权重比例均衡了。

4. K-邻近算法的优缺点

优点:简单,易于实现,无需估计参数,无需训练,结果固定,无迭代过程。

缺点:因为每次都要跟所有样本进行计算,计算量大,内存消耗大,且必须指定K值,K值选定不当则分类精度不能保证。

使用场景:小数据场景,因为缺点较多,大部分时候都不用。

5. 实例训练

# coding=utf-8
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import pandas as pd def knncls():
"""
K-邻近预测用户签到位置
:return: None
"""
# 读取数据 数据来源:https://www.kaggle.com/c/facebook-v-predicting-check-ins/data
data = pd.read_csv("./train.csv")
# print(data.head(10))
# 处理数据
# 1、缩小数据,查询数据筛选
data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y > 7.5")
# 2、处理时间
time_value = pd.to_datetime(data["time"], unit="s")
# print(time_value)
# 构造特征
time_value = pd.DatetimeIndex(time_value)
data["day"] = time_value.day
data["hour"] = time_value.hour
data["weekday"] = time_value.weekday
# 把时间戳特征删除
data = data.drop(['time'], axis=1)
# print(data)
# 把签到数量少于n个目标位置删除
place_count = data.groupby('place_id').count()
# print(place_count)
tf = place_count[place_count.row_id > 3].reset_index()
# print(tf)
data = data[data['place_id'].isin(tf.place_id)]
data = data.drop(['row_id'], axis=1)
# print(data)
# 取出数据当中的特征值和目标值
y = data['place_id']
x = data.drop(['place_id'], axis=1)
# 进行数据的分割训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
# 特征工程(标准化)
std = StandardScaler()
# 对测试集和训练集的特征值标准化
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
# 进行算法流程
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(x_train, y_train)
# 得出预测结果
y_predict = knn.predict(x_test)
print("预测的目标签到位置为:", y_predict)
print("预测的准确率:", knn.score(x_test, y_test)) if __name__ == '__main__':
knncls()

以上内容仅供相互学习,是作者根据学习教程做的笔记。

算法总结1:K-邻近算法的更多相关文章

  1. 机器学习算法及代码实现–K邻近算法

    机器学习算法及代码实现–K邻近算法 1.K邻近算法 将标注好类别的训练样本映射到X(选取的特征数)维的坐标系之中,同样将测试样本映射到X维的坐标系之中,选取距离该测试样本欧氏距离(两点间距离公式)最近 ...

  2. 《机器学习实战》学习笔记一K邻近算法

     一. K邻近算法思想:存在一个样本数据集合,称为训练样本集,并且每个数据都存在标签,即我们知道样本集中每一数据(这里的数据是一组数据,可以是n维向量)与所属分类的对应关系.输入没有标签的新数据后,将 ...

  3. Python实现kNN(k邻近算法)

    Python实现kNN(k邻近算法) 运行环境 Pyhton3 numpy科学计算模块 计算过程 st=>start: 开始 op1=>operation: 读入数据 op2=>op ...

  4. 监督学习——K邻近算法及数字识别实践

    1. KNN 算法 K-近邻(k-Nearest Neighbor,KNN)是分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似( ...

  5. k邻近算法(KNN)实例

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

  6. <机器学习实战>读书笔记--k邻近算法KNN

    k邻近算法的伪代码: 对未知类别属性的数据集中的每个点一次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离: (2)按照距离递增次序排列 (3)选取与当前点距离最小的k个点 (4)确定 ...

  7. [机器学习实战] k邻近算法

    1. k邻近算法原理: 存在一个样本数据集,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对 ...

  8. kaggle赛题Digit Recognizer:利用TensorFlow搭建神经网络(附上K邻近算法模型预测)

    一.前言 kaggle上有传统的手写数字识别mnist的赛题,通过分类算法,将图片数据进行识别.mnist数据集里面,包含了42000张手写数字0到9的图片,每张图片为28*28=784的像素,所以整 ...

  9. 2 kNN-K-Nearest Neighbors algorithm k邻近算法(二)

    2.3 示例:手写识别系统 2.3 .1 准备数据:将图像转换为测试向量 训练样本:trainingDigits 2000个例子,每个数字大约200个样本 测试数据:testDigits 大约900个 ...

  10. 机器学习:k-NN算法(也叫k近邻算法)

    一.kNN算法基础 # kNN:k-Nearest Neighboors # 多用于解决分裂问题 1)特点: 是机器学习中唯一一个不需要训练过程的算法,可以别认为是没有模型的算法,也可以认为训练数据集 ...

随机推荐

  1. python学习笔记(二十六)经典类和新式类的区别

    首先了解一下什么是经典类,什么是新式类 class Person: #经典类 pass class Person2(object): #新式类 pass #类名首字母都大写 #在python3里面经典 ...

  2. Excel文本型数据转为数值型的方法

    操作步骤非常简单,适用于所有版本的Excel. 在任意一个空白单元格中输入数值1,然后选中该单元格,执行复制操作: 选中需要转换的单元格(或区域),执行“编辑.选择性粘贴”命令,打开“选择性粘贴”对话 ...

  3. ActiveMQ简单入门

    一.创建一个简单的Hello World案例 首先需要导入activemq-all-5.14.5.jar包,写生产端: package com.ietree.mq.helloworld; import ...

  4. Webservice介绍

    一.   Socket和Http通信协议介绍   1. Socket协议简单介绍 Socket位于传输层,它是对Tcp/ip协议的实现,包含TCP/UDP,它是所有通信协议的基础,如下为Socket通 ...

  5. Mysql binlog 安全删除(转载)

    简介: 如果你的 Mysql 搭建了主从同步 , 或者数据库开启了 log-bin 日志 , 那么随着时间的推移 , 你的数据库 data 目录下会产生大量的日志文件 shell > ll /u ...

  6. 使用stringstream格式化字符串

    stringstream所在头文件为<sstream> 一般有如下常用功能: 1.安全格式化字符串 stringstream常用来安全的格式化若干个字符串,数值到一个缓冲区, 而不用担心溢 ...

  7. android 读取联系人

    设置读取权限 <uses-permission android:name="android.permission.READ_CONTACTS" />     <u ...

  8. PKU 3041 Asteroids 最小点覆盖(最大匹配模板题)

    题目大意:给你一个N*N的矩阵, 里面有K个星球, 我们可以让武器攻击矩阵的一行或者一列来使得这个星球被击碎, 现在问你最少需要几个这种武器才能把所有的星球击碎? 解题思路:关键是建模构图 把每一行当 ...

  9. http超文本传输协议,get与post区别

    一:什么是http? http:超文本传输协议(HTTP,HyperText Transfer Protocol),是一个客户端和服务器端传输的标准,是应用层通信协议.客户端是中端用户,服务器端是网站 ...

  10. windows上使用clang编译程序

    环境:windows7,64位 1.下载并安装llvm,安装包里除了llvm,也有clang: http://releases.llvm.org/5.0.0/LLVM-5.0.0-win64.exe ...