机器学习小记——KNN(K近邻) ^_^ (一)
为了让绝大多数人都可以看懂,所以我就用简单的话语来讲解机器学习每一个算法
第一次写ML的博文,所以可能会有些地方出错,欢迎各位大佬提出意见或错误
祝大家开心进步每一天~
博文代码全部为python
简单的说一下什么是机器学习,机器学习英文名称是Machine Learning, ML
机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
机器学习学习形式可分为监督学习,监督学习,半监督学习和强化学习
KNN(k-Nearest Neighbor)中文名为K近邻,是分类算法的一种,KNN的思路为在在数据和标签已知的情况下将测试数据的特征和训练集中的特征进行比较,找到与之最相似的k的数据,那么这个数据对应的类别就是k个数据中出现次数最多的那个类别
寻找相似度有多重方法,最常用的为欧几里得度量,皮尔逊相关系数,余弦相似度
算法流程大致分为
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
本文使用iris数据集,可从UCI处下载 传送门
使用py的三种库pandas,numpy,sklearn
查看数据集

前4列为特征,最后一列为标签
#获取数据
X=np.loadtxt("/Users/galan/py/ML-D/iris.data.txt",delimiter=",",dtype=float,usecols=(0,1,2,3))
y=np.loadtxt("/Users/galan/py/ML-D/iris.data.txt",delimiter=",",dtype=str,usecols=(4,))
#创建训练数据和测试数据
X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=.7)
第2,3行为获取特征和标签
第五行中使用sklearn库的train_test_split函数,用来方便分隔测试集和训练集
本文使用欧几里得度量算法,在下方也会列出皮尔逊相似性和余弦相似度的py代码
欧几里得度量多为计算空间中两点间的距离
表达式为 |x| = √( x[1]2 + x[2]2 + … + x[n]2 )
代码表现形式为 [(p1-q1)**2+(p2-q2)**2+...+(pn-qn)**2]**0.5
def eculidean(p,q):
sumSq=0.0
#讲差值德平方累加起来
for i in range(len(p)):
sumSq+=sum(p[i]-q[i])**2
#求平方根
return (sumSq**0.5)
皮尔逊相关系数是度量两个变量之间相关程度,介于-1和1之间,1代表变量完全正相关,0代表无关,-1代表完全负关系
def pearson(x,y):
n=len(x)
vals=range(n)
#简单求和
sumx=sum([float(x[i]) for i in vals])
sumy=sum([float(y[i]) for i in vals])
#求平方和
sumxSq=sum([x[i]**2.0 for i in vals])
sumySq=sum([y[i]**2.0 for i in vals])
#求乘积之和
pSum=sum([x[i]*y[i] for i in vals])
#计算皮尔逊评价值
num=pSum-(sumx*sumy/n)
den=((sumxSq-pow(sumx,2)/n)*(sumySq-pow(sumy,2)/n))**.5
if den==0:return 1 r=num/den
return r
余弦相似度将向量根据坐标值,绘制到向量空间中求得他们的夹角,并得出夹角对应的余弦值,夹角越小,余弦值越接近于1,它们的方向更加吻合,则越相似。
#vect1,vect2位两个一维向量如(1,1)
def getCost(vect1,vect2):
sum_x=0.0
sum_y=0.0
sum_xy=0.0
for a,b in zip(vect1,vect2):
sum_xy+=a*b
sum_x+=a**2
sum_y+=b**2
if sum_x==0.0 or sum_y==0.0:
return None
else:
return sum_xy/((sum_x*sum_y)**0.5)
knn的求证过程
#K值
k=5
#计算所有的欧氏距离组合成字典
Dists={}
for i in range(len(X_train)):
Dists[eculidean(X_test[0],X_train[i])]=y_train[i]
#排序字典
sortedDist=sorted(Dists.iteritems(),reverse=True,key=lambda x:x[0])[:k]
classCount={}
#寻找最多的类别标签
for i in sortedDist:
if i[1] in classCount:
classCount[i[1]]+=1
else:
classCount[i[1]]=1
print classCount
下面贴出所有的代码
#coding:utf-8
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split #获取数据
X=np.loadtxt("./ML-D/iris.data.txt",delimiter=",",dtype=float,usecols=(0,1,2,3))
y=np.loadtxt("./ML-D/iris.data.txt",delimiter=",",dtype=str,usecols=(4,))
#创建训练数据和测试数据
X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=.7) def eculidean(p,q):
sumSq=0.0
#讲差值德平方累加起来
for i in range(len(p)):
sumSq+=sum(p-q[i])**2
#求平方根
return (sumSq**0.5) def classify(X_train,X_test,k):
#计算所有的欧氏距离
Dists={}
for i in range(len(X_train)):
Dists[eculidean(X_test,X_train[i])]=y_train[i]
#排序字典
sortedDist=sorted(Dists.iteritems(),reverse=True,key=lambda x:x[0])[:k]
classCount={}
#寻找最多的类别标签
for i in sortedDist:
if i[1] in classCount:
classCount[i[1]]+=1
else:
classCount[i[1]]=1
return sorted(classCount.iteritems(),key=lambda x:x[1],reverse=True) if __name__ == '__main__':
print "%s的类别为%s"%(X_test[15],classify(X_train,X_test[0],5)[0][0])
我会每周更新一篇ML博文,方便大家学习,^_^ 共同学习共同提高,欢迎大家前来对我的文章提出宝贵意见
祝大家周末愉快~
机器学习小记——KNN(K近邻) ^_^ (一)的更多相关文章
- web安全之机器学习入门——3.1 KNN/k近邻
目录 sklearn.neighbors.NearestNeighbors 参数/方法 基础用法 用于监督学习 检测异常操作(一) 检测异常操作(二) 检测rootkit 检测webshell skl ...
- 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)
No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...
- 机器学习实战python3 K近邻(KNN)算法实现
台大机器技法跟基石都看完了,但是没有编程一直,现在打算结合周志华的<机器学习>,撸一遍机器学习实战, 原书是python2 的,但是本人感觉python3更好用一些,所以打算用python ...
- 基本分类方法——KNN(K近邻)算法
在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...
- 机器学习03:K近邻算法
本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...
- 机器学习 Python实践-K近邻算法
机器学习K近邻算法的实现主要是参考<机器学习实战>这本书. 一.K近邻(KNN)算法 K最近邻(k-Nearest Neighbour,KNN)分类算法,理解的思路是:如果一个样本在特征空 ...
- 02机器学习实战之K近邻算法
第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...
- 机器学习算法之K近邻算法
0x00 概述 K近邻算法是机器学习中非常重要的分类算法.可利用K近邻基于不同的特征提取方式来检测异常操作,比如使用K近邻检测Rootkit,使用K近邻检测webshell等. 0x01 原理 ...
- KNN K~近邻算法笔记
K~近邻算法是最简单的机器学习算法.工作原理就是:将新数据的每一个特征与样本集中数据相应的特征进行比較.然后算法提取样本集中特征最相似的数据的分类标签.一般来说.仅仅提取样本数据集中前K个最相似的数据 ...
随机推荐
- Express4.x API (二):Request (译)
写在前面 最近学习express想要系统的过一遍API,www.expressjs.com是express英文官网(进入www.epxressjs.com.cn发现也是只有前几句话是中文呀~~),所以 ...
- redmine工作流程总结
1.需求调研员和測试员新建问题,问题跟踪为支持,指派给产品经理 2.产品经理对收到的问题进行分类处理,功能类型的,改动跟踪状态为功能,指派给自己.是bug类型的,将跟踪类型改动错误类型,指派给技术经理 ...
- Linux 高速操作IOport
在嵌入式设备中对GPIO的操作是最主要的操作. 一般的做法是写一个单独驱动程序,网上大多数的样例都是这种.事实上linux以下有一个通用的GPIO操作接口.那就是我要介绍的 "/sys/cl ...
- shell脚本小案例
1.获取远程ftp数据到本地目录 #!/bin/bash ftp -n<<! open 135.0.24.19 user exchange exchange binary cd /idep ...
- vue从入门到女装:从零开始搭建后台管理系统(一)安装框架
安装及运行都是基于node的,不会node的可以自行百度,网上教程很多,也不难 项目效果预览: demo1 demo2 源码下载 开始安装框架: vue ==>vue-cli安装 eleme ...
- jdk动态代理举例
JDK动态代理是基于接口的代理,下面举例说明 代理类:proxy,代理动作必须要基于一个proxy实例来执行 代理执行类:实现InvocationHandler,案例中是TestInvocationH ...
- shell编写mysql抽取数据脚本
#!/bin/bash DT=`date +%Y%m%d` #当前日期YESTERDAY=`date -d "yesterday" +%Y-%m-%d` #昨天,用于处理数据的日期 ...
- 《Spark大数据处理:技术、应用与性能优化》【PDF】
内容简介 <Spark大数据处理:技术.应用与性能优化>根据最新技术版本,系统.全面.详细讲解Spark的各项功能使用.原理机制.技术细节.应用方法.性能优化,以及BDAS生态系统的相关技 ...
- Android快速实现上传项目到Github
本文为skylinelin原创,转载请注明出处! 一.简介 现在在网上浏览关于Git的文章,基本上都是使用命令行(Git Bash),命令行效率是很高的,但是有一定的复杂性,现在我们看如何用AS来讲项 ...
- C C语言中关键词,以及知识点复习
C语言学习 C语言练习知识点 auto 局部变量(自动储存) break 无条件退出程序最内层循环 case switch语句中选择项 char ...