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的Tornado框架对子域名和泛域名的支持
May 02 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python 中 list 的各项操作技巧
Apr 13 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
Python实现定时精度可调节的定时器
Apr 15 Python
Python查看微信撤回消息代码
Jun 07 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
解决Django Static内容不能加载显示的问题
Jul 28 Python
Python 实现向word(docx)中输出
Feb 13 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
Python读写csv文件流程及异常解决
Oct 20 Python
python eventlet绿化和patch原理
Nov 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
操作Oracle的php类
2006/10/09 PHP
PHP4实际应用经验篇(6)
2006/10/09 PHP
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
附件名前加网站名
2008/03/23 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
从组件封装看Vue的作用域插槽的实现
2019/02/12 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
c++生成dll使用python调用dll的方法
2014/01/20 Python
python清除字符串中间空格的实例讲解
2018/05/11 Python
基于Python List的赋值方法
2018/06/23 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
keras的三种模型实现与区别说明
2020/07/03 Python
详解Python 循环嵌套
2020/07/09 Python
美国农场鲜花速递:The Bouqs
2018/07/13 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
竞聘演讲稿范文
2014/01/12 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
文明好少年事迹材料
2014/08/19 职场文书
写景作文评语集锦
2014/12/25 职场文书
郭明义观后感
2015/06/08 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android