1. 原理
- 存在一个样本集合,并且样本集合中的每个数据都存在标签(也就是有确定的值或分类)。
- 当输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。 然后算法提取样本集中特征最相似数据的分类标签。
一般,我们只选取样本数据集中前K个最相似的数据,选出k个最相似数据中出现次数最多的分类,作为新数据的分类。
其中计算多个向量点之间的距离,使用欧氏距离公式:
d=(xA0−xB0)2+(xA1−xB1)2+...−−−−−−−−−−−−−−−−−−−−−−−−−−−−√
2. 算法
#inX @ 需要判断的输入向量
#dataSet @ 已知的样本集
#labels @ 样本集的标签(分类)向量
#K @ 最相近的几个值
def classify0(inX, dataSet, labels, k):
#计算距离
dataSetSize = dataSet.shape[0]
diffMat = np.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]
3. 归一化数值
在计算中,我们发现有些数字差值对结果影响比较大,例如:
d=(0−67)2+(20000−32000)2+(1.1−0.1)2)−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√
为了消除这种影响,常采用数值归一化处理,将取值范围处理为[0,1]或[-1, 1]之间。
计算公式如下:
newValue=oldValue−minmax−min
4. 备注
下面有一些常用函数:
array.shape 函数
#返回多维数组的维数
arrary.shape
#返回行数
array.shape[0]
#返回列数
array.shape[1]
array.tile 函数
格式:tile(A,reps)
* A:array_like
* 输入的array
* reps:array_like
* A沿各个维度重复的次数
A=[1,2]
tile(A,2)
# 结果:[1,2,1,2]
tile(A, (2,3))
#结果:[[1,2,1,2,1,2], [1,2,1,2,1,2]]
tile(A, (2,2,3))
#结果:[[[1,2,1,2,1,2], [1,2,1,2,1,2]],
[[1,2,1,2,1,2], [1,2,1,2,1,2]]]
reps的数字从后往前分别对应A的第N个维度的重复次数。
tile(A, 2)表示A的第一个维度(行)重复2遍,
tile(A, (2,3))表示A的第一个维度(列)重复3遍,然后第二个维度(行)重复2遍,
tile(A, (2,2,3))表示A的第一个维度重复3遍,第二个维度重复2遍,第三个维度重复2遍。
array.sum(axis=1)
将一个矩阵的每一行向量相加
a = np.array([[0, 2, 1]])
print a.sum()
print a.sum(axis=0)
print a.sum(axis=1)
结果分别是:3, [0 1 2], [3]
b = np.array([0, 2, 1])
print b.sum()
print b.sum(axis=0)
print b.sum(axis=1)
结果分别是:3, 3, 运行错误:'axis' entry is out of bounds
可知:对一维数组,只有第0轴,没有第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]
axis=0, 表示列。
axis=1, 表示行。
str.split()
通过指定分割符对字符串进行切片,返回字串列表
string = "www.gziscas.com.cn"
# 以'.'为分隔符
print(string.split('.'))
['www', 'gziscas', 'com', 'cn']
数组的切片
数组中的最大,最小值
array.min(0) #数组中每一列的最小值
[第一列的最小值,第二列的最小值,第三列的最小值,......]
array.max(0) #最大值
使用 r 进行不转义字符串
myfile = open('C:\new\text.dat', 'w')
#这样的话会被误认为\n为换行符、\t为制表符、而被转义、
#因此可以加上个r、表示raw字符、不进行转义
myfile = open(r'C:\new\text.dat', 'w')
另一种方法是用 ‘/’ 来代替 ‘\’
myfile = open('C:/new/text.dat', 'w')