学习笔记——Kaggle_Digit Recognizer (KNN算法 Python实现)
本文是个人学习笔记,该篇主要学习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/pdist(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/pdist(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实现)相关推荐
- 学习笔记——Kaggle_Digit Recognizer (SVM算法 Python实现)
本文是个人学习笔记,该篇主要学习SVM算法概念,并应用sklearn.svm算法包解决Kaggle入门级Digit Recognizer. SVM 简述 经典SVM思想 SVM 线性不可分 SVM 多 ...
- 学习笔记——Kaggle_Digit Recognizer (Random Forest算法 Python实现)
本文是个人学习笔记,该篇主要学习随机森林算法概念,并应用sklearn.ensemble.RandomForestClassifier算法包解决Kaggle入门级Digit Recognizer. 随 ...
- 学习笔记——Kaggle_Digit Recognizer (朴素贝叶斯 Python实现)
本文是个人学习笔记,该篇主要学习朴素贝叶斯算法概念,并应用sklearn.naive_bayes算法包解决Kaggle入门级Digit Recognizer. 贝叶斯定理 朴素贝叶斯 Python 代 ...
- 独家总结 | KNN算法Python实现(附代码详解及注释)
↑ 点击上方[计算机视觉联盟]关注我们 上一篇已经介绍KNN算法的基本原理,这篇就不再赘述(公式太多,读不懂? 一文带你领略KNN近邻算法~简单易懂) 纸上得来终觉浅,仅仅懂了原理还不够,要用代码实践 ...
- 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. 基本 ...
- Apollo星火计划学习笔记——Apollo开放空间规划算法原理与实践
文章目录 前言 1. 开放空间规划算法总体介绍 1.1 Task: OPEN_SPACE_ROI_DECIDER 1.2 Task: OPEN_SPACE_TRAJECTORY_PROVIDER 1. ...
- 【学习笔记】多项式相关算法
[学习笔记]多项式相关算法 手动博客搬家: 本文发表于20181125 13:19:28, 原地址https://blog.csdn.net/suncongbo/article/details/844 ...
- python爬取b站评论_学习笔记(1):写了个python爬取B站视频评论的程序
学习笔记(1):写了个python爬取B站视频评论的程序 import requests import json import os table='fZodR9XQDSUm21yCkr6zBqiveY ...
- Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)
全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...
最新文章
- 什么是Python线程?Python线程如何创建?
- 【转】Extending Lync Server routing with MSPL
- list集合去重的三种方式
- 安装hadoop伪分布式集群心得
- python顺序结构实验设计_Python程序设计实验报告二:顺序结构程序设计
- linux的vi命令详解,Linux上Vi命令详解
- 正则表达式之反向引用
- select与pselect的信号屏蔽
- mysql general clomun_关于MySQL索引index杂谈
- bzoj1385 [Baltic2000]Division expression
- 中国最卷的公务员考试,挤满清北毕业生
- 【复杂网络】当机器学习遇上复杂网络:解析微信朋友圈 Lookalike 算法
- 职场004: 开放心态的意义
- 在KVM虚拟化云主机上使用WXPE的研究
- Consul 注册中心介绍以及搭建
- 搭建之星中文编程教学教程视频
- 【会议笔记】第五届中国健康信息处理大会(CHIP2019)Day02
- 遥感图像的空间分辨率,光谱分辨率等
- WPS word 如何取消定义网格线?无法修改行间距如何解决?
- 千寻位置 开发demo_从智能驾驶到智慧交通,看千寻位置如何助力未来“智”变...