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和pyqt实现360的CLable控件
Feb 21 Python
在Python的while循环中使用else以及循环嵌套的用法
Oct 14 Python
Python中操作符重载用法分析
Apr 29 Python
Python排序搜索基本算法之堆排序实例详解
Dec 08 Python
新手常见6种的python报错及解决方法
Mar 09 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
python中break、continue 、exit() 、pass终止循环的区别详解
Jul 08 Python
python定位xpath 节点位置的方法
Aug 27 Python
python中sort sorted reverse reversed函数的区别说明
May 11 Python
django queryset 去重 .distinct()说明
May 19 Python
python绘图pyecharts+pandas的使用详解
Dec 13 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
PHP实现变色验证码实例
2014/01/06 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
19个Android常用工具类汇总
2014/12/30 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
2018/05/11 PHP
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
JavaScript闭包详解
2015/02/02 Javascript
JavaScript中String.prototype用法实例
2015/05/20 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
nodejs实现邮件发送服务实例分享
2017/03/29 NodeJs
原生JS实现自定义滚动条效果
2020/10/27 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
js实现移动端轮播图效果
2020/12/09 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
js验证身份证号码记录的方法
2019/04/26 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
Python ftp上传文件
2016/02/13 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
python 字典中取值的两种方法小结
2018/08/02 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
竞赛口号大全
2014/06/16 职场文书
公司活动总结怎么写
2014/06/25 职场文书
天鹅湖观后感
2015/06/09 职场文书
创业计划书之书店
2019/09/10 职场文书
python tkinter模块的简单使用
2021/04/07 Python
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python