机器学习——KNN算法

一、近 邻 算 法 (KNN)原理:

  工 作 原 理 是 : 存 在 一 个 样 本 数据 集 合 , 也 称 作 训练 样 本 集 , 并 且 样 本 集 中 每 个 数 据 都 存 在 标 签 , 即 我 们 知 道 样 本 集 中 每 一 数 据与 所 属 分 类 的 对 应关系 。输 人 没 有 标 签 的 新 数 据 后 , 将 新 数 据 的 每 个 特 征 与 样 本 集 中 数 据 对 应的特 征 进 行 比较 , 然 后 算 法 提 取 样 本 集 中 特 征 最 相 似 数 据 ( 最 近 邻 ) 的 分 类 标 签 。一 般 来 说 , 我 们只 选 择 样 本 数 据 集 中 前 k个 最 相 似 的 数 据 ,这 就 是 k- 近 邻 算 法 中 k 的 出 处 , 通 常 k 是 不 大 于 20 的 整 数 。最 后 , 选 择 k 个 最 相 似 数 据 中 出 现 次 数 最 多 的 分 类 , 作 为 新 数 据 的 分 类。

二、KNN算法一般流程:

(1) 收集 数 据 : 可 以 使 用 任 何 方 法 。

(2) 准 备 数 据 : 距 离 计 算 所 需 要 的 数 值 , 最 好 是 结 构 化 的 数 据 格 式 。

(3) 分 析 数 据 : 可 以 使 用 任 何 方 法 。

(4) 训练 算 法 : 此步 驟 不 适 用 于 k-近 邻 算 法 。

(5) 测 试 算 法 : 计 算 错 误 率 。

(6) 使 用 算 法 : 首 先 需 要 输 入 样 本 数 据 和 结 构 化 的 输 出 结 果 , 然 后 运 行 女 -近 邻 算 法 判 定 输

入 数 据 分 别 属 于 哪 个 分 类 , 最 后 应用 对 计 算 出 的 分 类 执 行 后 续 的 处 理 。

三、KNN算法步骤:

对 未 知 类 别 属 性 的 数 据 集 中 的 每 个 点依 次 执 行 以 下 操 作 :

(1) 计 算 已 知 类 别 数 据 集 中 的 点与 当 前 点之 间 的 距 离 ;

(2) 按 照 距 离 递 增 次 序 排 序 ;

(3) 选 取 与 当 前 点距 离 最 小 的 k个 点;

(4) 确 定 前 k 个 点所 在 类 别 的 出 现 频 率 ;

(5) 返回 前 K 个 点出 现 频 率 最 高 的 类 别 作 为 当 前 点的 预 测 分 类

下面来看代码:


# -*- coding: UTF-8 -*-
from numpy import *
import operator

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

# 输入向量inX 训练样本集dataSet 标签向量lables
def classify0(inX, dataSet, labels, k):
    # shape 为求数组或矩阵维度的函数 对于二维数组来说 shape[0]表示其行数
    dataSetSize = dataSet.shape[0]
    # tile(A,n),功能是将数组A重复n次,构成一个新的数组
    # tile(intX,(dataSetSize,1))) 将数组intX 转为dataSize行1列
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    # 矩阵diffmat每项求平方
    sqDiffMat = diffMat**2
    # sum(axis=1)将一个矩阵的每一行向量相加
    sqDistances = sqDiffMat.sum(axis=1)
    # 开方
    distances = sqDistances**0.5
    # 排序 argsort函数返回的是数组值从小到大的索引值
    sortedDistIndicies = distances.argsort()

    classCount = {}
    # 选择距离最小的k个点
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    # 通过逆序排序找到k个中出现次数最多的分类
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]

if __name__ == "__main__":
	group,labels = createDataSet()
	print classify0([1,1], group, labels, 3)



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值