python使用knn实现特征向量分类


Posted in Python onDecember 26, 2018

这是一个使用knn把特征向量进行分类的demo。

Knn算法的思想简单说就是:看输入的sample点周围的k个点都属于哪个类,哪个类的点最多,就把sample归为哪个类。也就是说,训练集是一些已经被手动打好标签的数据,knn会根据你打好的标签来挖掘同类对象的相似点,从而推算sample的标签。

Knn算法的准确度受k影响较大,可能需要写个循环试一下选出针对不同数据集的最优的k。

至于如何拿到特征向量,可以参考之前的博文。

代码:

#-*- coding: utf-8 -*-
__author__ = 'Rossie'
from numpy import *
import operator

'''构造数据'''
def createDataSet():
  characters=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
  labels=['A','A','B','B']
  return characters,labels

'''从文件中读取数据,将文本记录转换为矩阵,提取其中特征和类标'''
def file2matrix(filename):
  fr=open(filename)
  arrayOLines=fr.readlines()
  numberOfLines=len(arrayOLines)    #得到文件行数
  returnMat=zeros((numberOfLines,3))   #创建以零填充的numberOfLines*3的NumPy矩阵
  classLabelVector=[]
  index=0
  for line in arrayOLines:       #解析文件数据到列表
    line=line.strip()
    listFromLine=line.split('\t')
    returnMat[index, :]=listFromLine[0:3]
    classLabelVector.append(listFromLine[-1])
    index+=1
  return returnMat,classLabelVector   #返回特征矩阵和类标集合

'''归一化数字特征值到0-1范围'''
'''输入为特征值矩阵'''
def autoNorm(dataSet):
  minVals=dataSet.min(0)
  maxVals=dataSet.max(0)
  ranges=maxVals-minVals
  normDataSet=zeros(shape(dataSet))
  m=dataSet.shape[0]
  normDataSet=dataSet-tile(minVals,(m,1))
  normDataSet=normDataSet/tile(ranges,(m,1))
  return normDataSet,ranges, minVals
  
def classify(sample,dataSet,labels,k):
  dataSetSize=dataSet.shape[0]   #数据集行数即数据集记录数
  '''距离计算'''
  diffMat=tile(sample,(dataSetSize,1))-dataSet     #样本与原先所有样本的差值矩阵
  sqDiffMat=diffMat**2   #差值矩阵平方
  sqDistances=sqDiffMat.sum(axis=1)    #计算每一行上元素的和
  distances=sqDistances**0.5  #开方
  sortedDistIndicies=distances.argsort()   #按distances中元素进行升序排序后得到的对应下标的列表
  '''选择距离最小的k个点'''
  classCount={}
  for i in range(k):
    voteIlabel=labels[sortedDistIndicies[i]]
    classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
  '''从大到小排序'''
  sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
  return sortedClassCount[0][0]

'''针对约会网站数据的测试代码'''
def datingClassTest():
  hoRatio=0.20     #测试样例数据比例
  datingDataMat,datingLabels=file2matrix('datingTestSet1.txt')
  normMat, ranges, minVals=autoNorm(datingDataMat)
  m =normMat.shape[0]
  numTestVecs=int(m*hoRatio)
  errorCount=0.0
  k=4
  for i in range(numTestVecs):
    classifierResult=classify(normMat[i, : ],normMat[numTestVecs:m, : ],datingLabels[numTestVecs:m],k)
    print("The classifier came back with: %s, thereal answer is: %s" %(classifierResult, datingLabels[i]))
    if(classifierResult!= datingLabels [i] ) :
      errorCount += 1.0
  print("the total error rate is: %f" % (errorCount/float(numTestVecs)))

def main():
  sample=[0,0]#简单样本测试
  sampleText = [39948,6.830795,1.213342]#文本中向量样本测试
  k=3
  group,labels=createDataSet()
  label1=classify(sample,group,labels,k)#简单样本的分类结果
  fileN = "datingTestSet.txt"
  matrix,label = file2matrix(fileN)
  label2 =classify(sampleText,matrix,label,k)#文本样本的分类结果
  print("ClassifiedLabel of the simple sample:"+label1)
  print("Classified Label of the textsample:"+label2)



if __name__=='__main__':
  main()
  #datingClassTest()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
优化Python代码使其加快作用域内的查找
Mar 30 Python
python爬取酷狗音乐排行榜
Feb 20 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
Feb 26 Python
详解Python self 参数
Aug 30 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
TensorFlow学习之分布式的TensorFlow运行环境
Feb 05 Python
python实现简单颜色识别程序
Feb 19 Python
Python ORM框架Peewee用法详解
Apr 29 Python
Python新手如何进行闭包时绑定变量操作
May 29 Python
关于python中remove的一些坑小结
Jan 04 Python
selenium学习教程之定位以及切换frame(iframe)
Jan 04 Python
Python实现我的世界小游戏源代码
Mar 02 Python
python调用staf自动化框架的方法
Dec 26 #Python
Django unittest 设置跳过某些case的方法
Dec 26 #Python
python 2.7 检测一个网页是否能正常访问的方法
Dec 26 #Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 #Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 #Python
Python使用requests提交HTTP表单的方法
Dec 26 #Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 #Python
You might like
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
php多用户读写文件冲突的解决办法
2013/11/06 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
2015/12/24 Javascript
JavaScript中setTimeout和setInterval函数的传参及调用
2016/03/11 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
2018/08/12 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
2018/12/07 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
基于vue.js实现购物车
2020/01/15 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
python线程、进程和协程详解
2016/07/19 Python
python自动发送邮件脚本
2018/06/20 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
Python中拆分字符串的操作方法
2019/07/23 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
详解Python文件修改的两种方式
2019/08/22 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
Python 操作 MySQL数据库
2020/09/18 Python
Sephora丝芙兰马来西亚官方网站:国际化妆品购物
2018/03/15 全球购物
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
行政专员岗位职责说明书
2014/07/30 职场文书
法人委托书的范本格式
2014/09/11 职场文书
小学生交通安全寄语
2015/02/27 职场文书
个人简历求职信范文
2015/03/20 职场文书
不同意离婚上诉状
2015/05/23 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
Java线程的6种状态与生命周期
2022/05/11 Java/Android