预约助教问题:

1.计算1-NN,k-nn和linear regression这三个算法训练和查询的时间复杂度和空间复杂度?

一、 WHy

最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多个训练对象匹配,导致一个训练对象被分到了多个类的问题,基于这些问题呢,就产生了KNN。

KNN基于这样一种假设,即相似的实例在某种距离度量上应该更为接近。因此在对新实例进行分类时,新实例的分类取决于与其最接近的K个已知实例中出现次数最多的分类(mode);在对新实例进行回归时,则可使用最接近的K个已知实例的值的平均数。

二、 What

2.1 定义

KNN是通过测量不同特征值之间的距离进行分类。它的的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

K最近邻(K-Nearest Neighbors, KNN)是一种基于实例的学习方法(instance-based learning),通过与已有实例的比较来对新的实例进行分类(classification)或回归(regression)。因为基于实例的学习方法在对新实例进行预测之前不需要进行训练,所以也是一种惰性学习方法(lazy learning)。

下面通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

2.2 距离函数选择

\[Manhattan Distance (曼哈顿距离) : d(x,y) = \sqrt{ \sum_{k=1}^{n} (x_k - y_k)^2 }
\]

\[Euclidian Distance (欧氏距离) : d(x,y) = \sqrt{ \sum_{k=1}^{n} |x_k - y_k|}
\]

P.S.加权距离——处理维度灾难的一种方法

2.3 Classification vs. Regression

Classification ——— Vote
Regression ——— Mean

通常, 在分类任务中可使用"投票法" 即选择这k 个样本中出现最多的类别标记作为预测结果;

在回归任务中时使用"平均法" ,即将这k 个样本的实值输出标记的平均值作为预测结果.

2.4 优点

无需训练,只需将已知实例存储起来

实现相对简单,例如计算实例之间的距离就比其他动辄需要求解最优化问题的算法要简单得多

2.5 缺点

因为需要将已知实例存储起来,所以需要占用的空间直接取决于实例的数量。

例如在项目中作为成果物提交的分类器,如果是其它方法只需提交训练得到的模型和参数,而基于实例的方法就需要把所有的实例数据都打包,因为其数据即模型。

因为预测时需要与所有已知实例比对,所以耗时也取决于实例的数量。可以用诸如对距离进行排序再进行二分查找的方式优化(此时时间复杂度为\(log_2 N\))

2.6 维度灾难(curse of dimensionality)

    As the number of features or dimensions grows,
the amount of data we need to generalize accurately also grows exponetially! 指数增长在CS领域很糟糕!

随着维度的增加,需要维持准确预测的已知实例的数量会随之指数级增加。

因为在增加了新维度之后,已知实例在新空间的投影就变得更稀疏,从而需要比原空间中多得多的实例进行填充

补充:由于KNN训练的代价小(因为不作训练),KNN或可被用于在线学习(online machine learning)中,即使用新数据不断训练和更新已有模型从而作出更好的预测.

三、How

3.1 pseudocode 伪代码流程

接下来对KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

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

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

3.2 Python 代码实例


#coding:utf-8 import numpy #科学计算包
import operator #运算符模块 ##给出训练数据以及对应的类别
def createDataSet():
group = array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
labels = ['A','A','B','B']
return group,labels ###通过KNN进行分类
def classify(input,dataSet,label,k): dataSize = dataSet.shape[0] #求数组的行数
####计算欧式距离
diff = tile(input,(dataSize,1)) - dataSet
#tile使input变为和dataSet相同行数的数组
#>>> numpy.tile([1.1,0.3],(4,1))#在行方向上重复4次 在列方向上重复1次,
# array([[ 1.1, 0.3],
# [ 1.1, 0.3],
# [ 1.1, 0.3],
# [ 1.1, 0.3]]) sqdiff = diff ** 2 # x^2 , y^2
squareDist = sum(sqdiff,axis = 1) ###矩阵行向量分别相加,从而得到新的一个行向量 #c = np.array([[0, 2, 1], [3, 5, 6], [0, 1, 1]])
#print c.sum()
#print c.sum(axis=0)
#print c.sum(axis=1)
#19
#[3 8 8]
#[ 3 14 2]
dist = squareDist ** 0.5 # 开根号 ##对距离进行排序
sortedDistIndex = argsort(dist)##argsort()根据元素的值从小到大对元素进行排序,返回下标 ###对选取的K个样本所属的类别个数进行统计
classCount={} # 保存A,B出现次数的字典
for i in range(k):
voteLabel = label[sortedDistIndex[i]]
# 获取索引值对应的是A还是B # 在字典中保存A,B出现的次数
classCount[voteLabel] = classCount.get(voteLabel,0) + 1 ###选取出现的类别次数最多的类别
maxCount = 0
for key,value in classCount.items():
if value > maxCount:
maxCount = value
classes = key return classes dataSet,labels = createDataSet()
input = array([1.1,0.3])
K = 3
output = classify(input,dataSet,labels,K)
print("test data :",input,"classification result:",output) <<<
('test data :', array([ 1.1, 0.3]), 'classification result:', 'A')

参考文章:

http://www.cnblogs.com/littlepear/p/8269653.html

http://www.cnblogs.com/ybjourney/p/4702562.html

http://blog.csdn.net/jmydream/article/details/8644004

k 近邻算法(k-Nearest Neighbor,简称kNN)的更多相关文章

  1. k近邻算法(k-nearest neighbor,k-NN)

    kNN是一种基本分类与回归方法.k-NN的输入为实例的特征向量,对应于特征空间中的点:输出为实例的类别,可以取多类.k近邻实际上利用训练数据集对特征向量空间进行划分,并作为其分类的"模型&q ...

  2. K近邻法(K-Nearest Neighbor,KNN)

    KNN是一种基本分类与回归方法,本篇只总结分类问题中的KNN. 输入:样本的特征向量,对应于特征空间中的点 输出:样本的类别,可取多类 算法思想:给定一个样本类别已知的训练数据集,对于新样本,根据其K ...

  3. 分类算法----k近邻算法

    K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的 ...

  4. 机器学习03:K近邻算法

    本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...

  5. 02-16 k近邻算法

    目录 k近邻算法 一.k近邻算法学习目标 二.k近邻算法引入 三.k近邻算法详解 3.1 k近邻算法三要素 3.1.1 k值的选择 3.1.2 最近邻算法 3.1.3 距离度量的方式 3.1.4 分类 ...

  6. 第4章 最基础的分类算法-k近邻算法

    思想极度简单 应用数学知识少 效果好(缺点?) 可以解释机器学习算法使用过程中的很多细节问题 更完整的刻画机器学习应用的流程 distances = [] for x_train in X_train ...

  7. k近邻算法

    k 近邻算法是一种基本分类与回归方法.我现在只是想讨论分类问题中的k近邻法.k近邻算法的输入为实例的特征向量,对应于特征空间的点,输出的为实例的类别.k邻近法假设给定一个训练数据集,其中实例类别已定. ...

  8. 机器学习(四) 分类算法--K近邻算法 KNN (上)

    一.K近邻算法基础 KNN------- K近邻算法--------K-Nearest Neighbors 思想极度简单 应用数学知识少 (近乎为零) 效果好(缺点?) 可以解释机器学习算法使用过程中 ...

  9. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

  10. 基本分类方法——KNN(K近邻)算法

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

随机推荐

  1. rest-assured之Schema validation(包括JSON Schema validation及Xml Schema validation)

    rest-assured从2.1.0版本开始支持  Schema 验证,包括JSON Schema validation及Xml Schema validation.我们之前断言响应体都是一个一个字段 ...

  2. [原创]SSH密钥访问Git仓库配置

    SSH密钥并非为了解决拉取git仓库代码时,需要频繁输入密码的问题. SSH是一种比较安全的协议,可以用来免去远程登录Linux等服务器时需要输入密码的繁琐过程. 命令: ssh user@serve ...

  3. Rx

    more detailed in WIKI's document SDP :session description protocal book AAA AA-Answer 鉴权授权应答AAR AA-R ...

  4. 《The One 团队》第二次作业:团队项目选题

    项目 内容 作业所属课程 http://www.cnblogs.com/nwnu-daizh/ 作业要求 https://www.cnblogs.com/nwnu-daizh/p/10726884.h ...

  5. pandas数据清洗

    1.我已安装好Anavonda3.5.所以我只用打开"jupyter notebook",然后打开浏览器 然后点击右侧的“new",然后打开python3

  6. Java_方法的调用①及案例

    方法调用的语法格式: 类名.方法名称([参数列表]); 调用过程: 案例: class Method01{ /*练习1:使用方法完成,输出5遍HelloWorld 方法语法格式: [修饰符] 返回值类 ...

  7. sqlplus column命令用法

    column是sqlplus里最实用的一个命令,很多时候sql语句输出的列宽度不合适而影响查看,都需要用到这个命令来更改select语句中指定列的宽度和标题.大部分时候,我们可以简写column为co ...

  8. FocusBI: 总线矩阵(原创)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. <商业智能教程>pdf下载地址 链接:https://pan.baidu.com/ ...

  9. FastReport打印table

    经过验证是对的. table第一行添加标题,也就是拖过来的文本label,第二行开始绑定数据源的字段. 先设计报表的静态部分,再用代码注册数据源,然后设计,添加注册的数据源,绑定字段. var rep ...

  10. Node.js学习笔记(四) --- fs模块的使用

    目录 . fs.stat 检测是文件还是目录 . fs.mkdir 创建目录 . fs.writeFile 创建写入文件 . fs.appendFile 追加文件 . fs.readFile 读取文件 ...