机器学习实战第二章

本文详细介绍了K-近邻算法的工作原理、一般流程,包括数据准备、算法实施、测试分类器等步骤。通过两个实战示例——改进约会网站配对效果和手写数字识别系统,展示了KNN算法的应用过程。KNN算法虽然精度高,但计算复杂度和空间复杂度较高,适用于数值型和标称型数据。
摘要由CSDN通过智能技术生成

K-近邻算法

优点:精度高、对异常值不敏感、无数据输入假定
缺点:计算复杂度高、空间复杂度高
适用数据范围:数值型和标称型

解释:
  标称型:标称型目标变量的结果只在有限目标集中取值,比如真与假(标称型目标变量主要用于分类)
  数值型(连续型):数值型目标变量则可以从无限的数值集合中取值

工作原理

  存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。

K-近邻算法的一般流程

  1. 收集数据:可以使用任何方法
  2. 准备数据:距离计算所需要的数值,最好是结构化的数据格式
  3. 分析数据:可以使用任何方法
  4. 训练算法:此步骤不适用于k-近邻算法
  5. 测试算法:计算错误
  6. 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理
1、准备:使用Python导入数据
2、实施KNN分类算法

k-近邻算法将每组数据划分到某个类中,主要操作如下:
(1)计算已知类别数据集中的点与当前点之间的距离
(2)按照距离递增次序排序
(3)选取与当前点距离最小的k个点
(4)确定k个点所在类别出现的频率
(5)返回前k个点出现的频率最高的类别作为当前的预测分类

3、如何测试分类器

我们可以使用已知答案的数据,检验分类器给出的结构是否符合预期。

错误率是分析器给出错误的结果的次数除以测试执行的总数。
完美的分类器的错误率为0,最差的分类器的错误率是1.0

4、KNN示例代码:
from numpy import *

import operator
import numpy

def createDataSet():
    group = numpy.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

def classify0(inx, dataSet, labels, k):
    dataSetsize = dataSet.shape[0]
    # 获得dataSet的数据大小
    diffMat = tile(inx, (dataSetsize, 1)) - dataSet
    # tile函数是一种扩展矩阵函数,对于给定的值进行加行或加列
    sqDiffMat = diffMat**2
    # 计算所有的矩阵元素的平方
    sqDistances = sqDiffMat.sum(axis=1)
    # axis=1将一个矩阵的每一行向量相加,axis=0表示按列相加
    distances = sqDistances ** 0.5
    # 将矩阵上的每一个元素都开根号
    sortedDistIndices = distances.argsort()
    # argsort函数返回的是数组值从小到大的索引值,本数据为[2 3 1 0]即表示最小的是下表为2的数据,最大的为小标为0的数据
    # 以上6行是用来计算距离的
    classCount = {
   }
    for i in range(k):
        voteIlabel = labels[sortedDistIndices[i]]
        # 获取当前的标签
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
        print(classCount[voteIlabel], classCount)
        # get(voteilabel,0):原型为get(key,默认值),作用是获取key对应的值,如果不存在key,则新增key,值为默认值
    sortedClassCount = sorted(
        classCount.items(), key=operator.itemgetter(1), reverse=True)
    # sorted(对象,排序值,reverse=True/False),reverse默认值为False,表示正序,reverse=True表示倒序。
    # 按照每个key的值对每对keyvalue进行降序排序,operator.itemgetter(1):得到item中的第二个位置的值
    return sortedClassCount[0][0]

group, labels = createDataSet()
print(group, "\n", labels)

test = classify0([0, 0], group, labels, 3)
print(test)

提示: 可以在不懂的地方将结果打印出来,看看每一个变量是怎么样的

示例:使用K-近邻算法改进约会网站的配对效果

使用K-近邻算法的具体流程

  1. 收集数据:提供文本文件
  2. 准备数据:使用Python解析文本文件
  3. 分析数据:使用Matplotlib画二维扩展图
  4. 训练算法:此步骤不适用于k-近邻算法
  5. 测试算法:使用提供的部分数据作为测试样本
    测试样本与非测式样本的区别在于:测试样本是已经完成分类的数据,如果测试分类与实际类别不同,则标记为一个错误
  6. 使用算法:产生简单的命令行数据,然后输入一些特征数据以判断是否为想要的结果
1、准备数据:从文本文件中解析数据

  在将特征数据输入到分类器之前,必须将数据的格式转变为分类器可以接受的格式。

2、分析数据:使用Matplotlib创建散点图

  可以使用不同的颜色或标记来区分不同的样本,以便更好的理解数据信息。可以多试几组相关的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值