KNN算法

算法原理

通用步骤

  • 计算距离(常用欧几里得距离或者马氏距离)(矩阵)
  • 升序排列
  • 取前K个数据
  • 加权平均(距离越近,权重越大)

K得选取

  • K太大:导致分类模糊
  • K太小:受个例影响,波动较大

如何选取K

  • 均方根误差
  • 经验

KNN算法_第1张图片

代码:

def kNN_classify(k,dis,X_train,x_train,Y_test):
    assert dis == 'E' or dis == 'M', 'dis must E or M,E代表欧式距离,M代表曼哈顿距离'
    num_test = Y_test.shape[0] #测试样本的数量
    labellist = []
'''
使用欧拉公式作为距离度量
'''
    if (dis == 'E'):
        for i in range(num_test):
			#实现欧式距离公式
            distances = np.sqrt(np.sum(((X_train -np.tile(Y_test[i], (X_train.shape[0], 1))) ** 2), axis=1))
            nearest_k = np.argsort(distances) #距离由小到大进行排序,并返回index值
            topK = nearest_k[:k] #选取前k个距离
            classCount = {}
        for i in topK: #统计每个类别的个数
            classCount[x_train[i]] =classCount.get(x_train[i],0) + 1
        sortedClassCount =sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
        labellist.append(sortedClassCount[0][0])
    return np.array(labellist

个人理解

其中 k 代表选取k个数据。
X_train 代表整个数据集
x_train 代表标签,比如图中有三角形和正方形
Y_train 代表要预测的数据

首先num_test代表要进行测试的次数,作为循环条件
Y_train中有n个数据,X_train数据集中有m个数据。计算Y_train中每个数据到X_train数据集中每个数据的距离。然后再进行从小到大排列,选取前k个距离。创建一个类别字典。随后遍历k个距离,每一个类别都用x_train标签保存,加一,然后对整个字典进行从大到小排序。返回字典中数量最多的那个就是我们要预测的。
例如:classCount = {‘△’ :8, ‘□’:6},那么就预测这个是三角形的概率更大。

其他

python种sorted排序:

sorted(iterable,key=None,reverse=False)
其中 iterable: 排序对象,如字符串,列表,元组,字典等
         key:排序依据,通常为函数名
         reverse:排序规则,True为降序,False为升序(默认)
如果排序的对象比较复杂,单一参数难以实现,需要引入匿名函数 lambda

lambda x : x + 1 相当于
def f(x):
     return x+1

为什么要数据归一化
假设在准备预测一个超市的销售情况。但是零食有10000个,酒只有100个,有这样两个维度的特征,但是这两个维度的两级不一样,会影响参数w的大小,导致酒的 w 参数较大,零食的 w 参数较小。参数小的特征对目标函数的影响会被覆盖。
所以要对每个特征数据进行归一化,减少这种不同量级特征数据覆盖其他量级特征数据对目标函数的影响。

你可能感兴趣的:(深度学习)