机器学习实践笔记(一)KNN

主要是参考机器学习实践(作者peter harrington)

优点:精度高,对异常值不敏感,无数据输入假定。
缺点:计算复杂度、空间复杂度高
适用数据:数值型和标称型

个人理解:数据型是连续数据,标称型离散数据。

KNN基本原理
写了一段时间了,没人看就没更新以后的。有兴趣或者没基础可以看看。
KNN的步骤

1、导入数据

import numpy as np
import operator
data =np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels =['A','A','B','B']

其中data是传统意义上的x,是二维的,labels是y。

把x画出来观察,很明显,2个A标签和2个B标签差距很大。
在这里插入图片描述

2、knn原理

写的应该很清楚啦!

'''
1.计算已经知道属性的数据集中的点与当前点之间的距离;
2.按照距离递增次序排序;
3.选取与当前距离最小的k个点;
4.确定前k个点所在类别的出现频率;
5.返回前k个点出现频率最高的类别作为当前点的预测分类。
'''
def Knn(inX,dataSet,labels,k):
    '''
    四个参数inX是分类的输入向量,dataSet是输入的训练样本集,标签向量是labels,k是选择的最近的邻居个数
    '''
    dataSetSize = dataSet.shape[0]
    '''
    得到样本集中样本的数量
    '''
    diffMat = np.tile(inX,(dataSetSize,1))-dataSet
    '''
    tile共有2个参数,第一个指待输入数组
    比如tile([1,2,3],(3,2))
    就会输出:[[1,2,3,1,2,3,1,2,3]
             [1,2,3,1,2,3,1,2,3]]    
    第二个就是数组重复次数,第一个参数是重复次数,第二个参数是重复几个数组
    '''
    x_square = diffMat ** 2
    distances_square = x_square.sum(axis = 1)
    '''
    如果axis就是普通相加,axis=0
    如果axiss=1那么比如矩阵为[[1,2,3],[4,5,6]]
    经过sum(axis=1)就会变成[6,16]
    '''
    distances = distances_square ** 0.5
    '''
    很明显的欧拉距离计算
    '''
    sorted_dostances = distances.argsort()
    '''
    升序排序
    '''
    Count = {
   }
    '''
    收集最近的点的计数,是个字典
    '''
    for i in range(k):
        voteIlabel = labels[sorted_dostances[i]]
        Count[voteIlabel] = Count.get(voteIlabel,0) + 1
        '''
        dict.get(name,0)就是查询字典里是否有name这个值,没有就返回0
        '''
    '''
    选择最小的k个点
    '''
    sortedCount = sorted(Count.items(),key = operator.itemgetter(1),
                         reverse = True)
    '''
    sorted(iterable, key = None, reverse = False)  
    iterable是可迭代对象
    key是主要是用来进行比较的元素,只有一个参
    数,具体的函数的参数就是取自于可迭代对象
    中,指定可迭代对象中的一个元素来进行排序。
    reverse是排序规则,reverse = True 降序,
    reverse = False 升序(默认)。
    iteritems()是把字典改成迭代器
    operator.itemgetter(1)是获取对象的第1个域的值
    '''
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值