机器学习之KNN算法代码

1.直接上代码

import numpy as np
#import operator
import math


def createDataSet():
    group = np.array([[1.0, 2.0], [1.2,0.1], [0.1,1.4], [0.3,3.5]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels

def classify(testData, trainData, trainlabel, k):
    dataSize = trainData.shape[0]
    #calu distacne 
    #tile, repeat data
    diff = np.tile(testData, (dataSize, 1)) - trainData
    sdiff = diff ** 2
    #get sum result per row
    sumSdiff = np.sum(sdiff, axis = 1)
    
    dist = sumSdiff ** 0.5
    
    # sort,return index,up
    sortedIndexUp = np.argsort(dist)
    
    #use dictory,key = label, value = nums
    labelDict = {}
    for i in range(k):
        tL = trainlabel[sortedIndexUp[i]]
        labelDict[tL] = labelDict.get(tL, 0) + 1
   
    defaultValue = 0
    for k, v in labelDict.items():
        if v > defaultValue:
            defaultValue = v
            classes = k
    return classes

if __name__ == "__main__":
    group, lables = createDataSet()
    testData = [1.1, 0.3]
    k = 3
    cla = classify(testData, group, lables, k)
    print("predict calssify=", cla)

2. 算法介绍

KNN算法,即为K最近邻。通俗的讲,有两个村庄,分别是八里湾和柳树沟,突然有一天,从天上掉下来了一个家伙。他要在这里生活,首先要确定自己是哪个村庄的。那么如何确定呢?八里湾最帅的小哥出了个主意,那就是找到K个与自己最近的邻居,这K个邻居中那个村庄的最多,那他就是哪个村子的。

那么问题来了,要确定与邻居的距离,首先要确定自己的位置以及邻居的位置,其次来求距离。位置可通过坐标确定,那坐标即是机器学习中的特征,也就是从数据中提取出的有用信息。

求距离一般采用欧氏距离,即求两点间距离公式。

已确定的属于哪个村庄的居民是训练集,天上掉下的是测试集。

3. 算法流程及重点函数说明

3.1 算法流程

1)计算测试数据与各个训练数据之间的距离

2)按照升序排列距离数据

3)取出前K个距离数据,查看这K个距离数据对应的类别

4)返回最多的那个类别,即完成了分类

3.2 函数说明

numpy.tile(A,reps)
重复数据A,reps的数据格式是(row, col),即重复行多少次,列多少次。
如不reps的数据是单个数字,则代表行重复一次,列重复单个数字次。
举例说明如下:
in] a
out] array([1, 2])
in] np.tile(a, 2)
out] array([1, 2, 1, 2])
in] np.tile(a, (1,2))
out] array([[1, 2, 1, 2]])
numpy.argsort(A, axis=)
排序函数,返回值是其数据的index。默认升序。
当为二维数组时,axis=0,代表按照列进行排序。axis= 1, 代表按照行排序。

例子如下:
temp
array([[1, 2],
       [4, 3]])
np.argsort(temp, )
array([[0, 1],
       [1, 0]], dtype=int64)
np.argsort(temp, axis=0)
array([[0, 0],
       [1, 1]], dtype=int64)
np.argsort(temp, axis=1)
array([[0, 1],
       [1, 0]], dtype=int64)
字典的get函数
dict.get(key, default)
此函数用来得到key对应的value, 如果没有key,则value为默认值。如有Key,则返回其真实value值。

例子如下:
dict = {'a':4, 'b':1}
dict
{'a': 4, 'b': 1}
dict.get('a')
4
dict.get('b')
1
dict.get('b', 0)
1
dict.get('b', 0)+1
2
dict
{'a': 4, 'b': 1}

4. 代码说明

createDataSet()函数用来生成训练集。其中labels对应着其训练集的标签,也就是分类。

classify(testData, trainData, trainlabel, k)函数用来对测试数据进行分类预测。

具体代码介绍参考算法流程。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值