机器学习小记——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个最相似的数据 ...
随机推荐
- Spark之搜狗日志查询实战
1.下载搜狗日志文件: 地址:http://www.sogou.com/labs/resource/chkreg.php 2.利用WinSCP等工具将文件上传至集群. 3.创建文件夹,存放数据: mk ...
- python爬虫(四)_urllib2库的基本使用
本篇我们将开始学习如何进行网页抓取,更多内容请参考:python学习指南 urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地.在Python中有很 ...
- Docker 运行Tensorboard 和 jupyter的正确方法
Docker 运行Tensorboard 和 jupyter的正确方法 网上找了很多方法都是jupyter 运行正常但不知道如何打开Tensorboard.折腾了很久,实验很多中方法最终找到了一个正确 ...
- [Phonegap+Sencha Touch] 移动开发26 Android下的sencha touch程序,转屏时,Ext.Viewport不能触发orientationchange事件的解决的方法
Sencha touch 2.4.2 已经解决问题了. 比方你为Ext.Viewport的orientationchange事件加入了一个监听方法: Ext.Viewport.on('orientat ...
- Github-karpathy/char-rnn代码详解
Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2016-1-10 ...
- Intellij Idea配置MapReduce编程环境
原文参考地址:http://www点w2bc点com/article/229178 增加内容:question1: Hadoop2以上版本时,在Hadoop2的bin目录下没有winutils.exe ...
- 【java】打印流的基本实现及java.io.PrintStream、java.io.PrintWriter示例
package 打印流; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; impor ...
- JS判断终端
//判断手机终端 if(navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i)) { window.location.href = 'mobil ...
- iOS OC应用异常捕获,崩溃退出前返回信息给后台
第三方的了,有友盟,腾讯的bugly 查了一下网上类似的代码很多,在借鉴前辈的代码后,组合了一下: 1.捕获异常信息 2.获得当前日期,版本,系统 3.获得出bug的视图控制器转为字符串 4.将前3条 ...
- iOS tableview和 Collection复用机制
TableView的重用机制,为了做到显示和数据分离, tableView的实现并且不是为每个数据项创建一个tableCell.而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对ce ...