博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
K近邻分类
阅读量:4067 次
发布时间:2019-05-25

本文共 2026 字,大约阅读时间需要 6 分钟。

最近邻

K-近邻(待会介绍)的一种极端情况。“近朱者赤,近墨者黑”。

def distance(p0, p1):    # Computes squared euclidean distance    return np.sqrt(np.sum((p0-p1)**2))def nn_classify(training_set, training_labels, new_example):    dists = np.array([distance(t, new_example) for t in training_set])    nearest = dists.argmin()    return training_labels[nearest]

K近邻

将上述的最近邻算法泛化为一个k近邻分类器,不仅考虑最近邻的点,还要考虑前k个最近邻点。k近邻假设给定一个训练数据集,其中的实例类别已定,分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式来进行预测。k近邻不具有显式的学习过程(lazy learning),实际是利用训练数据集对特征向量空间进行划分。

这里写图片描述

这里写图片描述

  • 优点:精度高、对异常值不敏感、无数据输入假定
  • 缺点:计算复杂度高、空间复杂度高
    • K近邻算法必须保存全部数据集,如果训练集很大,需要使用大量的存储空间。
    • 由于需要对数据集中每个数据计算距离值,实际使用可能耗时。
    • 无法给出任何数据的基础结果信息,无法知晓平均实例样本和典型实例样本的特征。

K近邻算法的三个基本要素:

- 距离度量(常用欧式距离或者更一般的Lp距离),见距离度量的Blog。
- 分类决策规则(常用的多数表决,对应于经验风险最小化)。
- k值的选择(k值小时,模型更复杂;k值大,模型更简单;特别的:K=1,最近邻;K=N,无论输入什么,都预测为训练实例中最多的类。交叉检验选最优k值)。

def knn_classify(inX, dataset, labels, k):    size = dataset.shape[0]    diffMat = np.tile(inX, (size, 1)) - dataset    sqDiffMat = diffMat ** 2    sqDistances = sqDiffMat.sum(axis=1)    distances = sqDistances ** 0.5    sortedDistIndicies = distances.argsort()    classCount={}    for i in range(k):        votelabel = labels[sortedDistIndicies[i]]        classCount[votelabel] = classCount.get(votelabel, 0) + 1    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)    return sortedClassCount[0][0]

实践指导

  • 归一化到Z-score: 每个特征都采用同样的单位(无量纲的),可以放心的混合不同维度的特征。防止少量特征占统治地位,使得所有维度都具有相同的重要性。

X_norm = (X - X_min) / (X_max - X_min )

这里写图片描述

lambda x: (x - x.min()) / (x.max() - x.min())
def autoNorm(dataset):    minVals = dataset.min(0)    maxVals = dataset.max(0)    ranges = maxVals - minVals    normDataset = np.zeros(np.shape(dataset))    m = dataset.shape[0]    normDataset = dataset - np.tile(minVals, (m, 1))    normDataset = normDataset / np.tile(ranges, (m, 1))    return normDataset

拓展

k近邻由Cover和Hart与1967年提出。Cover T, Hart P. Nearest neighbor pattern classification. IEEE Transactions on Information Theory.

《Building Machine Learning Systems with Python》

《Machine Learning in Action》

《统计学习方法》

《机器学习》

你可能感兴趣的文章
MODULE_DEVICE_TABLE的理解
查看>>
platform_device与platform_driver
查看>>
platform_driver平台驱动注册和注销过程(下)
查看>>
.net强制退出主窗口的方法——Application.Exit()方法和Environment.Exit(0)方法
查看>>
c# 如何调用win8自带的屏幕键盘(非osk.exe)
查看>>
build/envsetup.sh 简介
查看>>
C++后继有人——D语言
查看>>
Android framework中修改或者添加资源无变化或编译不通过问题详解
查看>>
linux怎么切换到root里面?
查看>>
linux串口操作及设置详解
查看>>
安装alien,DEB与RPM互换
查看>>
linux系统下怎么安装.deb文件?
查看>>
编译Android4.0源码时常见错误及解决办法
查看>>
Android 源码编译make的错误处理
查看>>
linux环境下C语言中sleep的问题
查看>>
ubuntu 12.04 安装 GMA3650驱动
查看>>
新版本的linux如何生成xorg.conf
查看>>
xorg.conf的编写
查看>>
启用SELinux时遇到的问题
查看>>
virbr0 虚拟网卡卸载方法
查看>>