郑捷《机器学习算法原理与编程实践》学习笔记(第二章 中文文本分类(三)—KNN算法)...

(上接第二章)

  2.4 分类算法:KNN

  2.4.1 KNN算法原理(略)

  KNN算法的步骤构成:

  第一阶段:确定k值(就是指最近邻居的个数)。一般是一个奇数。因为测试样本有限,故取k值为3.

  第二阶段:确定距离度量公式。文本分类一般使用夹角余弦,得出分类数据点和所有已知类别的样本点,从中选择距离最近的k个样本。

  第三个阶段:统计这k个样本点中各个类别的数量,根据k个样本中数量最多的样本是什么类型,我们就把这数据点定为什么类别。

  2.4.2 KNN算法的Python实现

  第一阶段:导入所需的库,进行数据的初始化

 

#coding:utf-8
import sys
import os
from numpy import *
import numpy as np
from Nbayes_lib import *
import operator

  

  第二阶段:实现夹角余弦的距离公式

  

#夹角余弦距离公式
def consdist(vector1,vector2):
    return dot(vector1,vector2)/(linalg.norm(vector1)*linalg.norm(vector2))

 

  第三阶段:KNN实现分类器

  

#KNN分类器
#测试集:testdata;测试集:trainSet;类别标签:listClasses;k:k个邻居
def classify(testdata,trainSet,listClasses,k):
    dataSetsize   = trainSet.shape[0]              #返回样本的行数
    distances     = array(zeros(dataSetsize))
    for indx in xrange(dataSetsize):              #计算测试集和训练集之间的距离:余弦夹角
        distances[indx]  = consdist(testdata,trainSet[indx])
    #根据生成的夹角余弦按从大到小排序,结果为索引号
    sortedDistIndics           = argsort(-distances)
    classCount                 = {}
    for i in range(k):                            #获得角度最小的前k项作为参考项
        #按排序顺序返回样本集对应的类别标签
        voteIlabel             = listClasses[sortedDistIndics[i]]
        #为字典classCount赋值,相同key,其中value加1
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1   #获得voteIlabel的value值,没有则默认为0
    #对分类字典classCount按value重新排序
    #sorted(data.iteritems(),key = operator.itemgetter(1),reverse = True)
    #该句是按字典值排序的固定用法
    #classCount.iteritems();字典迭代器函数
    #key:排序参数:operator.itemgetter(1):多级排序
    sortedClassCount           = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse = True)
    return sortedClassCount[0][0]                 #返回序最高的一项

  2.4.3  评估分类结果:

  

#使用KNN算法实现文本分类
dataSet,lisClasses = loadDataSet()
nb = NBayes()
nb.train_set(dataSet,lisClasses)
#使用之前的贝叶斯分类阶段的数据集及生成的TF向量进行分类
print classify(nb.tf[3],nb.tf,lisClasses,k)

  输出结果如下:

  1

  

  

资料来源及版权所有:郑捷《机器学习算法原理与编程实践》

转载于:https://www.cnblogs.com/wuchuanying/p/6234505.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值