欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-07 08:13:35
这是一个使用knn把特征向量进行分类的demo。 knn算法的思想简单说就是:看输入的sample点周围的k个点都属于哪个类,哪个类的点最多,就把sample归为哪个类。...

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

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