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多线程学习资料
Dec 19 Python
python中的yield使用方法
Feb 11 Python
Python基于pygame实现的font游戏字体(附源码)
Nov 11 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
Python实现基于PIL和tesseract的验证码识别功能示例
Jul 11 Python
Python迭代器与生成器基本用法分析
Jul 26 Python
Python发送邮件功能示例【使用QQ邮箱】
Dec 04 Python
Python 过滤错误log并导出的实例
Dec 26 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
Python通过zookeeper实现分布式服务代码解析
Jul 22 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
python基础之停用词过滤详解
Apr 21 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
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
JavaScript 三种创建对象的方法
2009/10/16 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
javascript同步服务器时间和同步倒计时小技巧
2015/09/24 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
浅谈Vue的响应式原理
2019/05/30 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
python实现提取百度搜索结果的方法
2015/05/19 Python
Python处理中文标点符号大集合
2018/05/14 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
2019/07/04 Python
Python适配器模式代码实现解析
2019/08/02 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
中学生获奖感言
2014/02/04 职场文书
《掌声》教学反思
2014/02/23 职场文书
公司担保书范文
2014/05/21 职场文书
2014年征兵标语
2014/06/20 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
党的群众路线教育实践活动个人整改措施材料
2014/11/04 职场文书
公务员年度考核个人总结
2015/02/12 职场文书
交通安全教育主题班会
2015/08/12 职场文书
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python