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定时器实例代码
Nov 01 Python
Python实现定时精度可调节的定时器
Apr 15 Python
Python使用matplotlib绘制三维图形示例
Aug 25 Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 Python
flask的orm框架SQLAlchemy查询实现解析
Dec 12 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 Python
python3.6使用SMTP协议发送邮件
May 20 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
Python实现数字的格式化输出
Aug 01 Python
Python列表推导式实现代码实例
Sep 09 Python
jupyter notebook指定启动目录的方法
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 无限级数据JSON格式及JS解析
2010/07/17 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
php更新cookie内容的详细方法
2019/09/30 PHP
jQuery 使用手册(四)
2009/09/23 Javascript
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
Vue单页面应用保证F5强刷不清空数据的解决方案
2018/01/31 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
Python反转序列的方法实例分析
2018/03/21 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
2018/04/18 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
2018/04/18 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
英文版餐饮运营管理求职信
2013/11/06 职场文书
后勤人员岗位职责
2013/12/17 职场文书
小学趣味运动会加油稿
2014/09/25 职场文书
汇报材料怎么写
2014/12/30 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
博物馆观后感
2015/06/05 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
导游词之湖北武当山
2019/09/23 职场文书
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android