关于tile()函数在最近邻算法中的使用
这里讨论的tile()函数指的是Python中的numpy包中的tile()函数
0. 前言
最近在看机器学习实战这本书,在学习最近邻算法的时候书中使用了tile()这个函数。通过总结发现这个函数在一些场合中是非常好用的,可以通过数据的矩阵化思想来避免循环从而达到简化操作提高程序效率的目的。
1. tile()函数的使用介绍
以下测试都是在Python3下的1.13.0版本的numpy下进行的。
首先看看tile函数在文档中的解释:tile(A, reps): ———–> Construct an array by repeating A the number of times given by reps.
也就是说会按照reps给定的大小来对A进行重复,这里reps常用矩阵格式
tile这个单词在英文中的解释是铺瓷砖,铺瓦片。这个说法在使用中可谓是非常贴切了。
下面来举一些例子进行详细说明:
import numpy as np
# 先创建一个向量和一个矩阵来进行使用
a = np.array([1, 2, 3, 4]) # 经过测试(Python3下1.13.0版本numpy),这里使用python中的列表形式也可以,最终也会被tile()函数转化成numpy中的array形式。
# 第一种使用方法
x1 = np.tile(a, 2)
-> array([1, 2, 3, 4, 1, 2, 3, 4])
# 第二种方法
x2 = np.tile(a, (2, 1))
-> array([1, 2, 3, 4], [1, 2, 3, 4])
现在我们大概知道tile的基本用法了,就是根据reps参数的定义来返回又a组成的矩阵,那么我们再来看看在最近领算法中是怎么使用tile这个函数的。
2. 最近邻算法中的tile()
这里默认读者都懂最近领这个算法
这里使用的最近邻算法主要分为三步:
第一步: 计算我们投入那一个数值到原本训练数据集中的距离。
第二步: 选择离投入数值最近的那k个训练样本点
第三步: 对选择出来的样本点距离进行排序并返回
# 下面对输入进行基本介绍:
# inx: 投入的数据
# dataSet: 原始的数据集
# labels: 原始数据集的标签
# k: 选择最近的数据个数
def classify0(inx, dataSet, labels, k):
dataSetSize = dataSet.shape[0] # 这里shape函数返回的是dataSet的格式大小,而shape[0]表示的是dataSet的行数,这里行数代表的是数据集的数目。
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat**2
sqDistance = sqDiffMat.sum(axis=1)
distance = sqDistance**0.5
sortedDistIndicies = distances.argsort()
...
return sortedClassCount[0][0]
这里tile的主要意义是使用那一个投入进行的数据集作为“瓷砖”,铺成与训练集格式相同的维度。
后面直接使用矩阵计算来避免循环。体会下来发现矩阵这个东西真是太美了。
tips: 这里使用的是欧式距离,举二维两个点(a1, a2), (b1, b2)为例也就是:
distance = sqrt((a1 - b1)^2 + (a2 - b2)^2)