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程序来判断文本的语种
Apr 07 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
python机器学习理论与实战(二)决策树
Jan 19 Python
python+webdriver自动化环境搭建步骤详解
Jun 03 Python
PyQt5实现简易电子词典
Jun 25 Python
详解Pandas之容易让人混淆的行选择和列选择
Jul 10 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
Aug 21 Python
django 框架实现的用户注册、登录、退出功能示例
Nov 28 Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
详解python中groupby函数通俗易懂
May 14 Python
Python如何定义有默认参数的函数
Aug 10 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网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
php三元运算符知识汇总
2015/07/02 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
treepanel动态加载数据实现代码
2012/12/15 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
浅谈js的setInterval事件
2014/12/05 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
node实现简单的反向代理服务器
2017/07/26 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
Python入门篇之数字
2014/10/20 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
2019/06/18 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
深入了解Python在HDA中的应用
2019/09/05 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
员工薪酬福利制度
2014/01/17 职场文书
个人承诺书
2014/03/26 职场文书
初中班主任寄语
2014/04/04 职场文书
森林防火宣传标语
2014/06/27 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
基石观后感
2015/06/12 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书