k-近邻算法

算法介绍

  1. 定义: 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一类别,则该样本也属于这个类别。

  2. 计算距离公式:欧式距离 (两点之间距离)

  3. 需要做标准化处理,防止某一类特征值权重过大

  4. Sklearn API

    • sklearn.neighbors.KNeighborsClassifier
    • n 的取值会影响最终结果

算法实例 (Facebook Check in)

kaggle 案例网址

解决思路

  1. 分类:

    • 特征值: x,y 坐标, 定位准确性, 年,日,时,周
    • 目标值: 入住位置的id
  2. 处理: 0<x<10 0<y<10

    • 由于数据量大,节省时间,x,y 缩小
    • 时间戳进行(年,月,日,周,时分秒), 当做新特征
    • 少于指定签到人数的位置删除
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import pandas as pd def knncls():
"""
K-近邻预测用户签到位置
:return: None
"""
# 读取数据
data = pd.read_csv('./train.csv')
# print(data.head(10)) # 处理数据
# 1.缩小数据
data = data.query('x >1.0 & x < 1.25 & y > 2.5 & y < 2.75') # 2. 处理时间数据
time_value = pd.to_datetime(data['time'], unit='s')
# print(time_value) # 3. 构造一些特征, 把日期格式转换为字典格式
time_value = pd.DatetimeIndex(time_value)
data['day'] = time_value.day
data['weekday'] = time_value.weekday
data['hour'] = time_value.hour # 4.把时间戳特征删除
data = data.drop(['time'],axis=1)
# print(data) # 5.把签到数量少于n个的目标位置删除
place_count = data.groupby('place_id').count() # 统计place_id次数,变成行索引
tf = place_count[place_count.row_id > 3].reset_index() # row_id 具体次数,reset_index 把place_id生成新的一列
data = data[data['place_id'].isin(tf.place_id)] # 筛选place_id
# print(data) # 6.取出数据中的特征值和目标值
y = data['place_id']
x = data.drop(['place_id', 'row_id'], axis=1) # 去掉row_id 可以增加精度 # 7.分割训练集和测试集
x_train, x_test, y_train, y_text = train_test_split(x, y, test_size=0.25) # 8.特征工程(标准化)
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test) # 进行算法流程 fit, predict, score #超参数
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_text))
return None if __name__ == '__main__':
knncls()

总结

问题

  1. k值取多大,有什么影响?

    • k值取很小:容易受异常点影响
    • k值取很大:容易受K值数量(类别)波动
  2. 性能问题

优缺点

  1. 优点: 简单,易于理解实现,无需估计参数,无需训练

  2. 缺点:

    • 懒惰算法,对测试样本分类时的计算量打,内存开销大
    • 必须指定K值,k值选择不当则分类精度不能保证
  3. 使用场景:小数据(几千~几万),基本不常用

06_K-近邻算法的更多相关文章

  1. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  2. 机器学习实战笔记(Python实现)-01-K近邻算法(KNN)

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  3. KNN近邻算法

    K近邻(KNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.kNN算法的核 ...

  4. k近邻算法的Java实现

    k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...

  5. 基本分类方法——KNN(K近邻)算法

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

  6. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  7. 机器学习之K近邻算法(KNN)

    机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...

  8. k近邻算法

    k 近邻算法是一种基本分类与回归方法.我现在只是想讨论分类问题中的k近邻法.k近邻算法的输入为实例的特征向量,对应于特征空间的点,输出的为实例的类别.k邻近法假设给定一个训练数据集,其中实例类别已定. ...

  9. KNN K~近邻算法笔记

    K~近邻算法是最简单的机器学习算法.工作原理就是:将新数据的每一个特征与样本集中数据相应的特征进行比較.然后算法提取样本集中特征最相似的数据的分类标签.一般来说.仅仅提取样本数据集中前K个最相似的数据 ...

  10. 机器学习03:K近邻算法

    本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...

随机推荐

  1. Yroot of High-Precisions (luogu P2293 [HNOI2004]高精度开根)

    Background\text{Background}Background I've accepted\text{I've accepted}I've accepteda very good prob ...

  2. [BZOJ1965][AHOI2005] 洗牌 - 扩展欧几里得

    题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...

  3. java集合之HashSet哈希SET基础

    hashSet实现set接口.serializable.cloneable接口.不允许有重复值,但可以null,不保证与插入顺序一致. HashSet迭代的时间与HashSet实例的大小(元素的数量) ...

  4. 微信小程序单选/多选框样式重新

    /* 重写 checkbox 样式 */ /* 未选中的 背景样式 */ checkbox .wx-checkbox-input{ border-radius: 50%;/* 圆角 */ width: ...

  5. 第三方应用 flashfxp,filezilla提权

    filezilla 提权 filezilla 开源的ftp服务器 默认监听14147端口 默认安装目录下有个敏感文件 filezillaserver.xml(包含用户信息) filezillaserv ...

  6. 使用animate.css

    今天有个一前辈来看了一下我的小程序啊,说写的还行就是可以不用只按照ui给的图写界面,自己可以添加一些动态的炫酷效果,不用不知道一用吓一跳啊,用之前觉得好好一个界面为什么要搞那些花里胡哨的东西,单纯一点 ...

  7. 【朝花夕拾】跨进程通信,你只知道AIDL,就OUT了

    一.前言 提起跨进程通信,大多数人首先会想到AIDL.我们知道,用AIDL来实现跨进程通信,需要在客户端和服务端都添加上aidl文件,并在服务端的Service中实现aidl对应的接口.如果还需要服务 ...

  8. 关于javascript闭包的最通俗易懂的理解

    这两天在研究闭包,网上一通找,有牛人写的帖子,有普通人写的帖子,但是大多没戳中本小白所纠结的点,而且大多插入了立即执行函数,其实根本不需要的,反而让人产生了误解.这里我用我的方式讲解一下闭包. 1.目 ...

  9. Mysql数据库(九)备份与恢复

    一.数据备份 1.使用mysqldmp命令备份 (1)备份一个数据库 mysqldump -u root -p dbname table1 table2 ... > D:\BackName.sq ...

  10. 设计模式(二十)Flyweight模式

    当使用new关键字生成类的实例时,需要给其分配足够的内存空间.当程序中需要大量对象时,如果都是用new关键字来分配内存,将会消耗大量内存空间.Flyweight模式就是尽量避免new出实例,而是通过尽 ...