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 django集成cas验证系统
Jul 14 Python
简洁的十分钟Python入门教程
Apr 03 Python
Python使用matplotlib绘制动画的方法
May 20 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
Jul 09 Python
Python数组定义方法
Apr 13 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
基于python的Paxos算法实现
Jul 03 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
django创建css文件夹的具体方法
Jul 31 Python
python playwright之元素定位示例详解
Jul 23 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
zf框架db类的分页示例分享
2014/03/14 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
使用jQuery fancybox插件打造一个实用的数据传输模态弹出窗体
2013/01/15 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
详解实现vue的数据响应式原理
2021/01/20 Vue.js
Python实现简单的四则运算计算器
2016/11/02 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
python2.7安装图文教程
2018/03/13 Python
python 8种必备的gui库
2020/08/27 Python
CSS教程:CSS3圆角属性
2009/04/02 HTML / CSS
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
域名注册、建站工具、网页主机、SSL证书:Dynadot
2017/01/06 全球购物
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
JVM是一个编译程序还是解释程序
2012/09/11 面试题
最新计算机专业自荐信
2013/10/16 职场文书
护士毕业生自荐信
2014/02/07 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
认真学习保证书
2015/02/26 职场文书
房贷收入证明范本
2015/06/12 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
导游词之四川武侯祠
2019/10/21 职场文书