[完]机器学习实战 第二章 k-近邻算法(k Nearest Neighbor)

本章深入探讨k-近邻算法,包括算法原理、数据处理、归一化以及使用Python进行实现。通过实例展示了如何使用Matplotlib创建散点图来可视化数据,并评估算法的正确率。
摘要由CSDN通过智能技术生成

第二章 k-近邻算法

【参考书籍】机器学习实战(Machine Learning in Action)

本章内容

  • k-近邻分类算法

    对未知类别属性数据集中的每个点依次执行以下操作:
    (1)计算已知类别数据集中的点与当前点之间距离;
    (2)按照距离递增次序排序;
    (3)选取与当前点距离最小的k个点;
    (4)确定前k个点所在类别的出现频率;
    (5)返回前k个点出现频率最高的类别作为当前点的预测分类。

  • 从文本文件中解析和导入数据
  • 使用Matplotlib创建散点图
  • 归一化数值

      归一化数值:处理不同取值范围的特征值时,通常采用的方法是将数值归一化,入将取值范围处理为0到1或者-1到1之间。将取值范围的特征值转化为0到1区间内的值:
      newValue = (oldValue - min) / (max - min)
      其中min和max分别是数据集中最小、最大特征值。

      评估算法的正确率:通常使用提供的已有数据的90%作为训练样本来训练分类器,而使用余下的10%的数据去测试分类器,检测分类器的正确率。

使用的函数

函数名/属性 功能
array() 创建一个数组
shape 数组或矩阵的各个维的大小
tile(A, reps) 将数组A,根据数组reps沿各个维度重复多次,构成一个新的数组。reps的数字从后往前分别对应A的第N个维度的重复次数。
sum(arr,axis=1) 根据行列(轴),求和
max(arr,axis=1) 根据行列(轴),求最大值
min(arr,axis=1) 根据行列(轴),求最小值
mean(arr,axis=1) 根据行列(轴),求平均值
argsort() 得到矩阵中每个元素的排序序号
dict.get(key,default) 获取字典中,一个给定的key对应的值。若key不存在,则返回默认值default。
sorted(iterable[, key][, reverse]) 第一个参数是一个iterable,返回值是一个对iterable中元素进行排序后的列表(list)。
open(filename) 返回一个文件对象
fr.readlines() 读取文件对象fr中的所有行,返回数组
fr.readline() 读取文件对象fr的当前行,返回字符串
len(arr) 返回数组的长度
zeros((n,m)) 创建一个n*m的矩阵,用0填充
line.strip() 删除文本行line后的回车符
str.spit(‘\t’) 使用’\t’分割字符串str,返回一个列表
list[-1] 获取列表的最后一个元素
vec.append(item) 在向量、列表vec后追加元素item
mat[index, :] 获取矩阵/数组的第index行的所有元素
list[m:n] 获取列表索引m到n的元素的值
plt.figure() 创建画布?
fig.add_subplot((m,n,x)) 把画布分割成m*n的区块,在第x块上绘图
scatter() 绘制散点
print 格式化输出
raw_input(“prompt string”) 显示提示字符串,将用户的输入转换成string
input(“prompt string”) 会根据用户输入变换相应的类型,而且如果要输入字符和字符串的时候必须要用引号包起来
range() range(1,5) #代表从1到5(不包含5); range(1,5,2) #代表从1到5,间隔2(不包含5); range(5) #代表从0到5(不包含5)
listdir(‘folder’) from os import listdir,获取给定文件夹下的文件名列表,不含文件路径

程序代码:

# coding=utf-8
# "coding=utf-8" 中间不要有空格,代码中有中文注释,需要添加第一行代码
from numpy import *
import operator
# from os import listdir 用于手写数字识别系统的测试代码
from os import listdir

# 导入测试数据
def createDataSet() :
    dataSet = array([[1.0,1.1]
        ,[1.0,1.0]
        ,[0,0]
        ,[0,0.1]])
    labels = ['A','A','B','B']
    return dataSet, labels

# kNN算法
# inX: 用于分类的输入向量
# dataSet: 输入的训练样本集
# labels: 标签向量
def classify0(inX, dataSet, labels, k) :
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k) :
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值