本文是个人学习笔记,该篇主要学习KNN算法理论和应用范围,并应用KNN算法解决Kaggle入门级Digit Recognizer,也是个人入坑ML和Kaggle的开端,希望能够有始有终。

  • KNN算法
  • 距离计算算法
  • Python 代码

KNN算法

K最近邻分类算法(K-NearestNeighbor),由Cover和Hart在1968年提出,是最简单的机器学习算法之一,主要被应用于文本分类、相似推荐

基本原理:
从训练样本集中选择k个与测试样本“距离”最近的样本,该k个样本中出现频率最高的类别即作为测试样本的类别,其中参数k的取值通常不大于20。

实现流程:
算法目标:未知类别样本集分类;
输入信息:待分类目标样本集和已分类学习样本集;
输出结果:已分类目标样本集;

算法步骤:
(a) 确定k值,即每个待分类样本要到它k个已分类样本邻居;
(b) 根据距离度量公式(如:欧氏距离),确定待分类样本集和已分类样本集中,距离该样本点最近的k个样本;
(c) 统计该k个邻居样本中,各类别的数量。最终将待分类样本点定义为数量最多的类别;

优缺点:
算法简单,易于实现,不需要参数估计,不需要事先训练;但由于不进行事先训练,而在输入待分类样本集时才开始,导致KNN计算量特别大;同时训练样本必须存储在本地,消耗大量内存。


距离计算算法

在数据分析和数据挖掘中,个体间的“距离”实际是对个体间差异大小的空间衡量,距离越远说明个体间的差异越大,然后根据实际差异情况进行相关性分析

假设:X个体和Y个体都包含了N个维的特征,即X=(x1,x2,x3,…xn),Y=(y1,y2,y3,…yn)x_1, x_2, x_3, … x_n),Y=(y_1, y_2, y_3, … y_n)

欧几里得距离(欧式距离):
欧式距离是最常用的距离度量,计算多维空间中各点之间的绝对距离。因为距离计算是基于各维度特征的绝对数值,所以需要保证各维度指标在相同的刻度级别。

公式:

dist(X,Y)=∑i=1n(xi−yi)2−−−−−−−−−−√

dist(X,Y)=\sqrt{\sum_{i=1}^n (x_i-y_i)^2}

马哈拉诺比斯距离(马氏距离):
马氏距离是欧式距离的改进版本,即基于各指标维度进行标准化后再使用欧氏距离,规避了指标度量的差异;


曼哈顿距离:
曼哈顿距离来源于城市区块距离,是将多个维度上的距离进行求和后的结果;

公式:

dist(X,Y)=∑i=1n|xi−yi|

dist(X,Y)=\sum_{i=1}^n{|x_i-y_i|}


切比雪夫距离:
切比雪夫距离起源于国际象棋中国王的走法,国际象棋国王每次只能往周围的8格中走一步,那么如果要从棋盘中A格(x1,y1)(x_1, y_1)走到B格(x2,y2)(x_2, y_2)最少需要走几步。

公式:

dist(X,Y)=limp→∞(∑i=1n|xi−yi|p)1/p

dist(X,Y)=\lim_{p\to \infty}(\sum_{i=1}^n{|x_i-y_i|^p})^{1/p}


明可夫斯基距离(明氏距离):
明氏距离是欧式距离的推广版本,是多个距离度量公式的概括性表述。

公式:

dist(X,Y)=(∑i=1n|xi−yi|p)1/p

dist(X,Y)=(\sum_{i=1}^n{|x_i-y_i|^p})^{1/p}
当p值为1时,即为曼哈顿距离,p值为2时,即为欧式距离,而当p趋向于无穷时,即为切比雪夫距离;


Python 代码

Python 代码1:

import pandas as pd
import numpy as np
import time
import operatordef data_load():# 利用pandas读取csv文件内容train_ttl=pd.read_csv('/Users/Sweet-home/PycharmProjects/Kaggle/reco data/train.csv')train_label=pd.DataFrame(train_ttl['label'])train_data=pd.DataFrame(train_ttl.ix[:,1:])test_data=pd.read_csv('/Users/Sweet-home/PycharmProjects/Kaggle/reco data/test.csv')# dataframe归整化train_data[train_data!=0]=1test_data[test_data!=0]=1return train_data,train_label,test_data#inX:1*n  dataSet:m*n labels:m*1
def classify(inX, dataSet, labels, k): #确定类别diffmats = (dataSet-inX)**2#计算KNN 欧式距离sumdiffs=diffmats.sum(axis=1)distances=sumdiffs**0.5sortedDistIndicies = distances.argsort()#根据距离排序classcount={}for i in range(k):#统计各标签值countvotelabel = labels.ix[sortedDistIndicies[i],0]classcount[votelabel] = classcount.get(votelabel,0) + 1# 根据字典值降序排序sortedClassCount = sorted(classcount.items(), key=operator.itemgetter(1), reverse=True)# 返回最相似label值return sortedClassCount[0][0]if __name__=='__main__':start = time.clock()traindata,trainlabel,testdata=data_load()#加载raw datam,n=testdata.shaperesult_labels=[]result={}for i in range(m):#对test样本一次确定其类别result_label=classify(testdata.ix[i],traindata,trainlabel,8)result_labels.append(result_label)#将结果转化成Dataframe结构ImageId=np.arange(m)+1result['Label']=result_labelsresult_frame=pd.DataFrame(result,index=ImageId)#导出结果result_frame.to_csv('/Users/Sweet-home/PycharmProjects/Kaggle/reco data/result.csv')end = time.clock()print('总耗时:', end - start)

Python 代码2:

import pandas as pd
import numpy as np
import time
from sklearn.neighbors import KNeighborsClassifierdef data_load():# 利用pandas读取csv文件内容train_ttl=pd.read_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\train.csv')train_label=pd.DataFrame(train_ttl['label'])train_data=pd.DataFrame(train_ttl.ix[:,1:])test_data=pd.read_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\test.csv')# dataframe归整化test_data[test_data!=0]=1# train_data[train_data!=0]=1m,n=train_data.shape#这里似乎因为dataframe太大,用bool判断更改时总会异常跳出,所以选择循环更改for i in range(m):for j in range(n):if train_data.ix[i,j]!=0:train_data.ix[i,j]=1return train_data,train_label,test_data#利用Python Sklearn包,进行test样本集分类判别
def knn_classify(traindata,trainlabel,testdata):knn_clf = KNeighborsClassifier(n_neighbors=5, algorithm='kd_tree', weights='distance', p=3)#设置参数knn_clf.fit(traindata,trainlabel.values.ravel())#训练Train样本knn_result=knn_clf.predict(testdata)#预测Test样本return knn_resultif __name__=='__main__':start = time.clock()traindata,trainlabel,testdata=data_load()#加载raw datam,n=testdata.shaperesult_labels=knn_classify(traindata,trainlabel,testdata)#将结果转化成Dataframe结构result={}ImageId=np.arange(m)+1result['Label']=result_labelsresult_frame=pd.DataFrame(result,index=ImageId)#导出结果result_frame.to_csv('D:\Program files\JetBrains\digit recognizer\Raw data\\result.csv')end = time.clock()print('总耗时:', end - start)#接近5小时

学习笔记——Kaggle_Digit Recognizer (KNN算法 Python实现)相关推荐

  1. 学习笔记——Kaggle_Digit Recognizer (SVM算法 Python实现)

    本文是个人学习笔记,该篇主要学习SVM算法概念,并应用sklearn.svm算法包解决Kaggle入门级Digit Recognizer. SVM 简述 经典SVM思想 SVM 线性不可分 SVM 多 ...

  2. 学习笔记——Kaggle_Digit Recognizer (Random Forest算法 Python实现)

    本文是个人学习笔记,该篇主要学习随机森林算法概念,并应用sklearn.ensemble.RandomForestClassifier算法包解决Kaggle入门级Digit Recognizer. 随 ...

  3. 学习笔记——Kaggle_Digit Recognizer (朴素贝叶斯 Python实现)

    本文是个人学习笔记,该篇主要学习朴素贝叶斯算法概念,并应用sklearn.naive_bayes算法包解决Kaggle入门级Digit Recognizer. 贝叶斯定理 朴素贝叶斯 Python 代 ...

  4. 独家总结 | KNN算法Python实现(附代码详解及注释)

    ↑ 点击上方[计算机视觉联盟]关注我们 上一篇已经介绍KNN算法的基本原理,这篇就不再赘述(公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂) 纸上得来终觉浅,仅仅懂了原理还不够,要用代码实践 ...

  5. Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language

    Scipy Lecture Notes学习笔记(一)Getting started with Python for science 1.2. The Python language 1.2.2. 基本 ...

  6. Apollo星火计划学习笔记——Apollo开放空间规划算法原理与实践

    文章目录 前言 1. 开放空间规划算法总体介绍 1.1 Task: OPEN_SPACE_ROI_DECIDER 1.2 Task: OPEN_SPACE_TRAJECTORY_PROVIDER 1. ...

  7. 【学习笔记】多项式相关算法

    [学习笔记]多项式相关算法 手动博客搬家: 本文发表于20181125 13:19:28, 原地址https://blog.csdn.net/suncongbo/article/details/844 ...

  8. python爬取b站评论_学习笔记(1):写了个python爬取B站视频评论的程序

    学习笔记(1):写了个python爬取B站视频评论的程序 import requests import json import os table='fZodR9XQDSUm21yCkr6zBqiveY ...

  9. Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)

    全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...

最新文章

  1. 什么是Python线程?Python线程如何创建?
  2. 【转】Extending Lync Server routing with MSPL
  3. list集合去重的三种方式
  4. 安装hadoop伪分布式集群心得
  5. python顺序结构实验设计_Python程序设计实验报告二:顺序结构程序设计
  6. linux的vi命令详解,Linux上Vi命令详解
  7. 正则表达式之反向引用
  8. select与pselect的信号屏蔽
  9. mysql general clomun_关于MySQL索引index杂谈
  10. bzoj1385 [Baltic2000]Division expression
  11. 中国最卷的公务员考试,挤满清北毕业生
  12. 【复杂网络】当机器学习遇上复杂网络:解析微信朋友圈 Lookalike 算法
  13. 职场004: 开放心态的意义
  14. 在KVM虚拟化云主机上使用WXPE的研究
  15. Consul 注册中心介绍以及搭建
  16. 搭建之星中文编程教学教程视频
  17. 【会议笔记】第五届中国健康信息处理大会(CHIP2019)Day02
  18. 遥感图像的空间分辨率,光谱分辨率等
  19. WPS word 如何取消定义网格线?无法修改行间距如何解决?
  20. 千寻位置 开发demo_从智能驾驶到智慧交通,看千寻位置如何助力未来“智”变...

热门文章

  1. windows 程序员装机必备软件
  2. Ubuntu 添加root用户
  3. 哪些人工智能企业有内部人才培养项目?
  4. 目标跟踪论文(一):SiamFC孪生网络
  5. 【Ubuntu】服务器使用
  6. 老大让我优化数据库,我上来就分库分表,他过来就是一jio
  7. IT人员必学最基础知识(四)——补充总结
  8. android onkeydown()简介
  9. 数字图像处理第三章-----灰度变换
  10. 网易2017校园招聘笔试题 优雅的点