机器学习小记——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个最相似的数据 ...
随机推荐
- LINUX6安装Oracle10g无法启动安装界面解决
***********************************************声明*************************************************** ...
- springboot定时任务——整合Quartz
http://blog.csdn.net/liuchuanhong1/article/details/60873295 http://blog.csdn.net/lyg_come_on/article ...
- 项目实战12.1—企业级监控工具应用实战-zabbix安装与基础操作
无监控,不运维.好了,废话不多说,下面都是干货. 警告:流量党勿入,图片太多!!! 项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html ...
- python __getattr__ 巧妙应用
在之前的文章有提到__getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数, ...
- .Net Ajax跨域请求实现
下一阵子要做一个网站Web储备一下知识,AJAX 实现跨域请求,估计会用到,以前在学 WebServer 时候老师整理的一个文档,现在便于查阅和使用现在放到我的博客中. 一般平时我写web页面的时 ...
- 【CSS3】定位
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- vue+express之前后台分离博客
说来惭愧,这么久没有更新过博客了,写个项目练练手吧,打算写一个vue+express的博客 可能这个时间说长不长说短不短 写到哪就是哪吧 我采用的是前后台分离 express采用的是mvc,但 ...
- 通过 JS 实现简单的拖拽功能并且可以在特定元素上禁止拖拽
前言 关于讲解 JS 的拖拽功能的文章数不胜数,我确实没有必要大费周章再写一篇重复的文章来吸引眼球.本文的重点是讲解如何在某些特定的元素上禁止拖拽.这是我在编写插件时遇到的问题,其实很多插件的拖拽功能 ...
- 【原码笔记】-- protobuf.js 与 Long.js
protobuf.js的结构和webpack的加载之后的结构很相似.这样的模块化组合是个不错的结构方式.1个是适应了不同的加载方式,2个模块直接很独立.webpack的功能更全一点.但如果自己封装js ...
- Java 本地开发环境搭建(框架采用 Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6)
项目搭建采用技术栈为:Spring+Spring MVC+Hibernate+Jsp+Gradle+tomcat+mysql5.6 搭建环境文档目录结构说明: 使用Intellj Idea 搭建项目过 ...