《机器学习实战》第二章(KNN)记录

Preface

本文是对《机器学习实战》第二章KNN的一些记录.
完整代码以及数据集见github


图片整理

1.png
2.png
3.png


核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def classify0(inX, dataSet, labels, k):
dataSetsize = dataSet.shape[0]

# 计算距离
diffMat = tile(inX, (dataSetsize, 1)) - dataSet
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5

sortedDistIndicies = distances.argsort()
classCount = {}

# 选取距离最近的k个点
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(),
key = operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]

计算向量xA和xB之间的距离

$d = \sqrt[2]{(xA_0 - xB_0)^2 + (xA_1 - xB_1)^2} $


归一化

在处理不同取值范围的特征值,我们通常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。这章书上用到的是如下公式

$newValue = (oldValue - min) / (max - min)$

其中minmax分别是数据集中的最小特征值和最大特征值,参考代码如下

1
2
3
4
5
6
7
8
9
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet))
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m, 1))
normDataSet = normDataSet / tile(ranges, (m, 1))
return normDataSet, ranges, minVals

这面这个方法叫做极差变化法。归一化可以提升模型的收敛速度和精度,更多可以看以下链接

数据标准化/归一化normalization
机器学习中常见的几种归一化方法以及原因
数据预处理:独热编码(One-Hot Encoding)


4.png


参考

python系列】numpy中的tile函数
在hexo使用mathjax

关注我的微信公众号[李一二],即时看更多的文章