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高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
python3实现公众号每日定时发送日报和图片
Feb 24 Python
对Tensorflow中的变量初始化函数详解
Jul 27 Python
Python hashlib模块加密过程解析
Nov 05 Python
python 实现多维数组转向量
Nov 30 Python
python中使用input()函数获取用户输入值方式
May 03 Python
Python 中由 yield 实现异步操作
May 04 Python
python中not、and和or的优先级与详细用法介绍
Nov 03 Python
python 使用OpenCV进行简单的人像分割与合成
Feb 02 Python
Matplotlib绘制混淆矩阵的实现
May 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中的静态变量的基本用法
2014/03/20 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
ThinkPHP模型详解
2015/07/27 PHP
PHP代码实现表单数据验证类
2015/07/28 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
ExtJS GridPanel 根据条件改变字体颜色
2010/03/08 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
python多重继承实例
2014/10/11 Python
python计算auc指标实例
2017/07/13 Python
python读取文件名称生成list的方法
2018/04/27 Python
python matlibplot绘制3D图形
2018/07/02 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
HTML5 CSS3实现一个精美VCD包装盒个性幻灯片案例
2014/06/16 HTML / CSS
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
Sephora丝芙兰印尼官方网站:购买化妆品和护肤品
2018/07/02 全球购物
Linux如何修改文件和文件夹的权限
2012/06/27 面试题
幼儿园中班教师寄语
2014/04/03 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
厉行节约工作总结
2015/08/12 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript
Redis基本数据类型List常用操作命令
2022/06/01 Redis