机器学习学习笔记之一:K最近邻算法(KNN)
2017-08-15 22:11
477 查看
算法
假定数据有M个特征,则这些数据相当于在M维空间内的点\[X = \begin{pmatrix}
x_{11} & x_{12} & ... & x_{1M} \\
x_{21} & x_{22} & ... & x_{2M} \\
. & . & & .\\
. & . & & .\\
. & . & & .\\
x_{N1} & x_{N2} & ... & x_{NM}
\end{pmatrix}\]
同时我们有标注集向量
\[\vec{y} = \begin{pmatrix}
y_1 \\
y_2 \\
. \\
. \\
. \\
y_M
\end{pmatrix}\]
那么对于一个新的数据点
\[\vec{x_z} = \begin{pmatrix}
x_{z1} & x_{z2} & ... & x_{zM}
\end{pmatrix}\]
我们通过计算其与其他所有点的欧氏距离
\[D_j=\sqrt{(x_{z1}-x_{j1})^2+(x_{z2}-x_{j2})^2+...+(x_{zM}-x_{jM})^2}\]
得到与所有点的距离向量(并按从小到大排序)
\[\vec{D} = \begin{pmatrix}
D_1 \\
D_2 \\
. \\
. \\
. \\
D_M
\end{pmatrix}\]
取前k个点即为最近邻的k个点。
\[\vec{D_k} = \begin{pmatrix}
D_1 \\
D_2 \\
. \\
. \\
. \\
D_k
\end{pmatrix}\]
根据这k个点所对应的标注,统计这些标注出现的次数\(n_k\)
\[\vec{y'}=\begin{pmatrix}
y_1 & n_1 \\
y_2 & n_2 \\
. & .\\
. & .\\
. & .\\
y_k & n_k
\end{pmatrix}\]
取数量最大的标注作为\(\vec{x_z}\)的标注。
\[y_z = \max_n{\vec{y'}}\]
算法实现(Python)
from numpy import * def KNNclassify(inX, dataset, labels, k): """ K-Nearest Neighbour algorithm :param inX: Input vector X :param dataset: Training Dataset :param labels: Labels vector :param k: the number of nearest neighbours :return: The class of input """ dataset_size = dataset.shape[0] diffMat = tile(inX, (dataset_size, 1)) - dataset # Use inX to fill a matrix of dataset_size sqDiffMat = diffMat**2 sqDistances = sqDiffMat.sum(axis=1) # Sum according to rows of matrix distances = sqDistances**0.5 sortedDistIndicies = distances.argsort() # Get the index of all distances 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][0]
算法优点
算法实现简单;不需要事先训练,可直接应用于数据。
算法缺点
数据条目很多时算法消耗时间很长,因为它要计算新数据点到每个已存在的数据点的距离;可能会出现多个相同的最大值,导致新的数据点无法准确判断真实的类别标注;
如果直接使用KNN算法,则数据范围大的特征对结果影响很大。为了消除这种影响,应该对数据进行归一化的预处理。
相关文章推荐
- 机器学习 学习笔记 knn算法 kd树实例
- 机器学习笔记(8)---K-近邻算法(6)---KNN算法学习总结
- 【机器学习】k-近邻算法(kNN) 学习笔记
- 机器学习实战笔记(1)——kNN(k Nearest Neighbor)算法
- 机器学习实战 笔记一:kNN分类算法
- 【机器学习 吴恩达】CS229课程笔记notes2翻译-Part IV生成学习算法
- 机器学习实战笔记——利用KNN算法改进约会网站的配对效果
- 最近邻分类算法KNN实现--参考麦子学院彭亮机器学习基础4.2
- TensorFlow学习笔记之源码分析(1)----最近算法nearest_neighbor
- 【学习笔记】斯坦福大学公开课(机器学习) 之生成学习算法:GDA
- 机器学习深度学习基础笔记(2)——梯度下降之手写数字识别算法实现
- 机器学习实战笔记——基于KNN算法的手写识别系统
- 机器学习(一):k最近邻(kNN)算法
- 机器学习笔记--KNN算法2-实战部分
- 机器学习笔记 监督学习算法小结(一)
- 台大林轩田机器学习课程笔记1----机器学习初探及PLA算法
- 机器学习笔记(8)——集成学习之Bootstrap aggregating(Bagging)装袋算法
- Hadoop学习笔记二 - kNN算法实现用户风险分类
- 机器学习具体算法系列之最近邻居法(KNN算法)
- 机器学习学习笔记:决策树归纳算法(ID3)