当前位置: 移动技术网 > IT编程>脚本编程>Python > python使用knn实现特征向量分类

python使用knn实现特征向量分类

2019年01月07日  | 移动技术网IT编程  | 我要评论

教育频道直播,血火明末,mm脱衣

这是一个使用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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网