机器学习实战(笔记)------------KNN算法

1.KNN算法

KNN算法即K-临近算法,采用测量不同特征值之间的距离的方法进行分类。

以二维情况举例:

        假设一条样本含有两个特征。将这两种特征进行数值化,我们就可以假设这两种特种分别为二维坐标系中的横轴和纵轴,将一个样本以点的形式表示在坐标系中。这样,两个样本直接变产生了空间距离,假设两点之间越接近越可能属于同一类的样本。如果我们有一个待分类数据,我们计算该点与样本库中的所有点的距离,取前K个距离最近的点,以这K个中出现次数最多的分类作为待分类样本的分类。这样就是KNN算法。

优点:精度高,对异常值不敏感,无数据输入假定
缺点:时间、空间复杂度太大(比如每一次分类都需要计算所有样本点与测试点的距离)

2.KNN算法的Python实现

import operator
from os import listdirimport matplotlib
import matplotlib.pyplot as plt
from numpy import array, shape, tile, zeros#分类方法
#inx 待分类向量
#dataSet 测试数据
#labels 测试数据标签
#k 取前k个作为样本
def classify(inX,dataSet,labels,k):dataSetSize=dataSet.shape[0]diffMat=tile(inX,(dataSetSize,1))-dataSet #tile方法利用输入数组进行扩充sqDiffMat=diffMat**2sqDistance=sqDiffMat.sum(axis=1)distance=sqDistance**0.5index=distance.argsort() #返回按从小到大的顺序排序后的元素下标classCount={}for i in range(k):lable=labels[index[i]]classCount[lable]=classCount.get(lable,0)+1#在python3中dict.iteritems()被废弃sortedClasssCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)return sortedClasssCount[0][0]

    代码传入的三个参数分别为待分类向量,测试数据,测试数据标签。代码使用欧式距离公式计算向量点之间的距离。
\[ d=\sqrt{(xA_0-xB_0)^2-(xA_1-xB_1)^2} \]

  • numpy.tile(A,reps)

    A指待输入数组,reps则决定A的重复次数

  • sorted(iterable,cmp,key,reverse)

    这里利用了key参数使得使用字典中的value值进行排序

实例1:KNN算法改进约会网站配对效果

背景

假设A在利用约会网站进行约会,她将自己交往过的人分为三类:

  • 不喜欢的人
  • 魅力一般的人
  • 极具魅力的人

A收集这些人的生活记录,从中提取中三类特征,存储在文本datingTestSet2中:

  • 每年获得的飞行常客里程数
  • 玩游戏视频所耗时间百分比
  • 每周消耗的冰淇淋公升数

利用这三类特征和标签组成的样本库,我们可以在获得一个人的这三种特征的特征值的情况下,利用KNN算法判断该人是否会是A喜欢人

读取数据

我们将数据从文本中读出,并且以矩阵的形式进行存储

def file2matrix(filename):fr=open(filename)datalines=fr.readlines()numberoflines=len(datalines)returnMat=zeros((numberoflines,3))classlabelVector=[]index=0for line in datalines:line=line.strip()listfromline=line.split('\t')returnMat[index,:]=listfromline[0:3]classlabelVector.append(int(listfromline[-1]))index=index+1return returnMat,classlabelVector

分析数据

我们可以利用Matplotlib制作原始数据的散点图,观察特征

def analydata():a,b=file2matrix('datingTestSet2.txt')#创建一个图形实例fig=plt.figure()ax=fig.add_subplot(111)#scatter方法创建散点图#分析图像可以发现使用第一列和第二列数据特征更加明显ax.scatter(a[:,0],a[:,1],15.0*array(b),15.0*array(b))plt.show()

画图结果:

1203819-20190213213102072-177172113.png

这里以“冰淇淋公斤数”和“玩视频游戏所耗时间百分比”作为横纵坐标特征最为明显

归一化数据

在数据分析和机器学习中,经常要进行数据归一化。因为不同的特征值使用不同的量度,上下限不同,使得有的特征产生的差值很大,而有的很小,会影响算法准确性。所以要先对数据预处理,进行数据归一化处理。
\[ newValue=(oldValue-min)/(max-min) \]

分类器与测试

我们利用KNN算法,以前10%的数据作为待分类数据,后90%的数据作为样本库测试数据,进行分类与测试

def datingClassTest():hoRatio=0.10datingDataMat,datingLables=file2matrix('datingTestSet2.txt')normMat=data2normal(datingDataMat)m=normMat.shape[0]numTestVecs=int(hoRatio*m)errorCount=0for i in range(numTestVecs):result=classify(normMat[i,:],normMat[numTestVecs:m,:],datingLables[numTestVecs:m],3)print("the classify come back with: %d,the real answer is: %d"%(result,datingLables[i]))if(result!=datingLables[i]):errorCount+=1.0print("error rate is:%f"%(errorCount/float(numTestVecs)))

测试结果,错误率大概在5%左右。
我们可以改变hoRatio和k的值,检查错误率是否发生变化

实例2:手写识别系统

背景

假设我们有一些手写数字,以如下形式保存:

00000000000001100000000000000000
00000000000011111100000000000000
00000000000111111111000000000000
00000000011111111111000000000000
00000001111111111111100000000000
00000000111111100011110000000000
00000001111110000001110000000000
00000001111110000001110000000000
00000011111100000001110000000000
00000011111100000001111000000000
00000011111100000000011100000000
00000011111100000000011100000000
00000011111000000000001110000000
00000011111000000000001110000000
00000001111100000000000111000000
00000001111100000000000111000000
00000001111100000000000111000000
00000011111000000000000111000000
00000011111000000000000111000000
00000000111100000000000011100000
00000000111100000000000111100000
00000000111100000000000111100000
00000000111100000000001111100000
00000000011110000000000111110000
00000000011111000000001111100000
00000000011111000000011111100000
00000000011111000000111111000000
00000000011111100011111111000000
00000000000111111111111110000000
00000000000111111111111100000000
00000000000011111111110000000000
00000000000000111110000000000000

这是一个32*32的矩阵,利用0代表背景,1来代表手写数字
对于这些数据,我们也可以利用KNN算法来识别写的是0~9中的哪里数字
注:存储数据的文件,例如:0_0.txt代码数字0的第一个手写样本数据

数据预处理:转换成测试向量

  数据使用32X32的矩阵形式存储,为了能够使用我们实现的KNN分类器,我们必须将其转化成1X1024的向量形式进行表示,也可以叫做降维,将二维数据转换成了一维数据

def img2vector(filename):fr=open(filename)returnVect=zeros((1,1024))for i in range(32):linestr=fr.readline()for j in range(32):returnVect[0,i*32+j]=int(linestr[j])return returnVect

使用KNN算法进行分类

  转换成向量以后,我们就可以使用我们实现的KNN分类器进行分类了

import operator
from os import listdirimport matplotlib
import matplotlib.pyplot as plt
from numpy import array, shape, tile, zerosdef handwritingClassTest():hwlabels=[]traingfilelist=listdir('digits/trainingDigits')m=len(traingfilelist)trainingDataMat=zeros((m,1024))for i in range(m):filenameStr=traingfilelist[i]fileStr=filenameStr.split('.')[0]label=int(fileStr.split('_')[0])hwlabels.append(label)trainingDataMat[i,:]=img2vector('digits/trainingDigits/%s' % filenameStr)errorCount=0.0testfilelist=listdir('digits/testDigits')mTest=len(testfilelist)for i in range(mTest):filenameStr=testfilelist[i]fileStr=filenameStr.split('.')[0]label=int(fileStr.split('_')[0])testVector=img2vector('digits/testDigits/%s' %filenameStr)result=classify(testVector,trainingDataMat,hwlabels,3)print('come back with: %d,the real answer is: %d' % (int(result),label))if(int(result)!=label):errorCount=errorCount+1.0print('total number errors is :%f' % errorCount)print('error rate is :%f'% (errorCount/float(mTest)))
  • os.listdir()

    利用该方法,可以得到指定目录里面的所有文件名

转载于:https://www.cnblogs.com/DLKKILL/p/10371928.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java注解Annotation 完成验证

Java注解Annotation用起来很方便,也越来越流行,由于其简单、简练且易于使用等特点,很多开发工具都提供了注解功能,不好的地方就是代码入侵比较严重,所以使用的时候要有一定的选择性。 这篇文章将利用注解,来…

隐藏马尔科夫模型HMM

概率图模型 HMM 先从一个具体的例子入手,看看我们要解决的实际问题.例子引自wiki.https://en.wikipedia.org/wiki/Hidden_Markov_model Consider two friends, Alice and Bob, who live far apart from each other and who talk together daily over the telephone about what …

阿里云天池 金融风控训练营Task1 广东工业站

Task1 赛题理解 一、学习知识点概要 本次学习先是介绍了赛题的背景和概况,题目以金融风控中的个人信贷为背景,给所给的47列特征中,根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过贷款。随后介绍了比赛中的评…

如何将.crt的ssl证书文件转换成.pem格式

如何将.crt的ssl证书文件转换成.pem格式摘自:https://www.landui.com/help/show-8127 2018-07-04 14:55:41 2158次 准备:有一台安装了php的linux操作系统执行下面的openssl命令即可:openssl x509 -in www.xx.com.crt -out www.xx.com.pem转载于:https://…

SpringMVC学习记录--Validator验证分析

一.基于Validator接口的验证. 首先创建User实例,并加入几个属性 ?12345678910111213141516171819202122232425262728293031323334<code class"hljs cs">public class User {private String username;private String password;private String nickname;public …

C# 获取句柄程序

这个小程序需要用到系统API&#xff0c;也就是需要用到user32中的三个函数。 第一个&#xff1a;WindowFromPoint 返回一个窗口句柄 第二个&#xff1a;GetWindowText 获取窗口标题 第三个&#xff1a;GetClassName 获取类名 当然&#xff0c;最重要的一点就是要引用命名空间…

centos7安装oracle12c 一

本文 基本参考了下面这篇文章http://blog.csdn.net/gq5251/article/details/42004035 和http://www.linuxidc.com/Linux/2017-08/146528.htm 但是改正了一些错误操作系统:CentOS Linux release 7.2.1511 (Core) oracle: oarcle (12.1.0.2.0) - Standard Edition (SE2)几点要注…

阿里云天池 Python训练营Task4: Python数据分析:从0完成一个数据分析实战 学习笔记

本学习笔记为阿里云天池龙珠计划Python训练营的学习内容&#xff0c;学习链接为&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 一、学习知识点概要 本次主要通过阿里云天池的赛题【Python入门系…

JMETER从JSON响应中提取数据

如果你在这里&#xff0c;可能是因为你需要使用JMeter从Json响应中提取变量。 好消息&#xff01;您正在掌握掌握JMeter Json Extractor的权威指南。作为Rest API测试指南的补充&#xff0c;您将学习掌握Json Path Expressions 所需的一切。 我们走吧&#xff01;并且不要惊慌&…

centos7安装oracle12c 二

环境&#xff1a;CentOS7VMware12&#xff0c;分配资源&#xff1a;CPU&#xff1a;2颗&#xff0c;内存&#xff1a;4GB&#xff0c;硬盘空间&#xff1a;30GB Oracle 12C企业版64位 下载地址&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/down…

阿里云天池 Python训练营Task5:Python训练营测试 学习笔记

一、学习知识点概要 本次是Python训练营的测试&#xff0c;在45分钟内完成25题&#xff0c;满分100分及格80分。题目主要考察Task1到Task3里面的Python基础知识。在我随到的25道题里&#xff0c;知识点有&#xff1a; 变量&#xff08;包括数据类型和容器类型&#xff09;运算…

centos7安装oracle12c 三

场景描述&#xff1a;我在自己电脑的虚拟机上linux环境下安装oracle11g数据库。 Linux版本为&#xff1a;CentOS release 6.8 (Final)&#xff0c;Oracle版本为&#xff1a;linux.x64_11gR2 问题描述&#xff1a;在oracle安装到Prerequisite Checks这一步的时候&#xff0c;出现…

《属性数据分析引论》 部分课后习题R语言实践(第三章、第四章)

目录 前言 第三章 广义线性模型 习题3.18 a小题 b小题 c小题 d小题 习题3.19 a小题 b小题 c小题 第四章 Logistic回归 习题4.1 a小题 b小题 c小题 d小题 e小题 习题4.2 a小题 b小题 c小题 d小题 小结 前言 习题选自高等教育出版社译制&#xff0c;Alan A…

Linux下SVN搭建

在Linux系统中搭建svn服务所需要用到的软件叫做subversion&#xff0c;可以通过yum来进行安装&#xff0c;如图 安装好软件后第一件事就是创建一个仓库目录 [rootserver1 ~]# mkdir /svn 使用svn自带命令建立仓库 [rootserver1 ~]# svnadmin create /svn 进入该仓库&#xff0c…

可用于 线性判别、聚类分析 的R语言函数总结

一、判别分析 判别分析是一种分类技术&#xff0c;其通过一个已知类别的“训练样本”来建立判别准则&#xff0c;并通过预测变量来为未知类别的数据进行分类。根据判别的模型分为线性判别和非线性判别&#xff0c;线性判别中根据判别准则又分为Fisher判别&#xff0c;Bayes判别…

Android APK 打包过程 MD

Markdown版本笔记我的GitHub首页我的博客我的微信我的邮箱MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantaosina.comAndroid APK 打包流程 MD 目录 目录APK 的打包流程整体流程资源的编译和打包资源ID资源索引概况具体打包过程aapt阶段aidl阶段Java Compiler阶段dex阶段a…

可用于 主成分分析、R型因子分析、简单相应分析 的R语言函数总结

一、主成分分析 主成分分析是多元统计分析的一种常用的降维方法&#xff0c;它以尽量少的信息损失&#xff0c;最大程度将变量个数减少&#xff0c;且彼此间互不相关。提取出来的新变量成为主成分&#xff0c;主成分是原始变量的线性组合。 1.1 KMO检验和Bartlett球形检验 在…

持续集成之Jenkins安装部署

安装JDKJenkins是Java编写的&#xff0c;所以需要先安装JDK&#xff0c;这里采用yum安装&#xff0c;如果对版本有需求&#xff0c;可以直接在Oracle官网下载JDK。 [rootlinux-node1 ~]# yum install -y java-1.8.0 安装Jekins [rootlinux-node1 ~]# cd /etc/yum.repos.d/ […

jenkins svn tomcat ant自动部署

Jenkins Jenkins是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;功能包括&#xff1a; 1、持续的软件版本发布/测试项目。 2、监控外部调用执行的工作。 跟其他持续集成相比&#xff0c;它的主要优点有&#xff1a; 开源&#xff0c;即免…

553 mail from must equal authorized user解决方法

在配置发送邮件通知&#xff0c;验证其正确性时&#xff0c;出现"553 mail from must equal authorized user"提示的错误&#xff1b; 原因在于没有在"系统管理&#xff08;Manage Jenkins&#xff09;"的"系统设置&#xff08;Configure system&…