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 11 Python
详解如何使用Python编写vim插件
Nov 28 Python
在IPython中进行Python程序执行时间的测量方法
Nov 01 Python
Python线程池模块ThreadPoolExecutor用法分析
Dec 28 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
Jun 19 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
python如何将多个PDF进行合并
Aug 13 Python
基于python读取.mat文件并取出信息
Dec 16 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
python使用信号量动态更新配置文件的操作
Apr 01 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 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中输出转义JavaScript代码的实现代码
2011/04/22 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
2017/06/07 PHP
php提交表单时保留多个空格及换行的文本样式的方法
2017/06/20 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
js window.onload 加载多个函数的方法
2009/11/02 Javascript
javascript中的new使用
2010/03/20 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
js实现文本框宽度自适应文本宽度的方法
2015/08/13 Javascript
bootstrap table合并行数据并居中对齐效果
2018/10/17 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
2019/04/04 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
JS实现横向轮播图(初级版)
2020/06/24 Javascript
node crawler如何添加promise支持
2020/02/01 Javascript
[58:21]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第二场
2018/04/04 DOTA
python中的reduce内建函数使用方法指南
2014/08/31 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
python opencv将表格图片按照表格框线分割和识别
2019/10/30 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
电子商务个人自荐信
2013/12/12 职场文书
求职信需要的五点内容
2014/02/01 职场文书
护士试用期自我鉴定
2014/02/08 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
社团个人总结范文
2015/03/05 职场文书
公司保密管理制度
2015/08/04 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书