K-近邻算法

1. 原理

  • 存在一个样本集合,并且样本集合中的每个数据都存在标签(也就是有确定的值或分类)。
  • 当输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。 然后算法提取样本集中特征最相似数据的分类标签。
  • 一般,我们只选取样本数据集中前K个最相似的数据,选出k个最相似数据中出现次数最多的分类,作为新数据的分类。

    其中计算多个向量点之间的距离,使用欧氏距离公式:

    d=(xA0xB0)2+(xA1xB1)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=(067)2+(2000032000)2+(1.10.1)2

为了消除这种影响,常采用数值归一化处理,将取值范围处理为[0,1]或[-1, 1]之间。
计算公式如下:
newValue=oldValueminmaxmin


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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值