零基础实战机器学习 k-临近算法(初试)

1.目前技能状态

主要做web开发,有一定的服务器项目部署经验,使用的数据库有:mysql/sqlite/redis

 

2.优点

精度高

对异常值不敏感

无数据输入假定

 

3.缺点

计算复杂度高

空间复杂度高

 

4.算法公式

此算法的要点就是测量不同特征之间的距离(上面的公式是两个维度的计算公式,特征可以是多个维度)

通用公式应该这样写,

 

5.计算流程

收集数据 -> 准备数据 -> 分析数据 -> 测试算法 -> 使用算法

拿到分析数据后,要明确有几个特征,即几个维度,就是上述公式的n

根据算法公式,使用一条测试数据,如果分析数据有1000条,会有1000个距离结果集,由小到大排序

确定一组数据的k-临近算法,就是确定一个数,即取结果集前几个数,取出的这几个数,出现频率最高的结果即为这个测试数据预测的结果。

比如结果集为[A,A,C,A,A,A,A,C,C,C,C,C,C,C,C,C,CB,C,C,B,B,B,...]

现在如果确定这个数为5,则结果A的频率为80%,结果C的频率为20%,故预测结果为A

如果这个数为15时,结果A的频率为6/15,结果C的频率为9/15,此时预测结果就会不同,变为C

(其中,k就是上文提到的这个数)

 

6.注意

因为不同数据间的极差不同,不处理直接使用的话,极差大的特征对结果赢下很大,

此时,对数据做归一化处理就是很有必要的。

归一化,就是特征数据的值是0-1之间,就是取特征集的每一个值前去最小值,再除以最大值减去最小值的结果,就是它的归一化的值。

 

7.示例

from numpy import *
import operator
from os import listdir

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()     
    classCount={}          
    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]

def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group, labels

group, labels = createDataSet()
a = classify0([0,0.3], group, labels, 2)
print(a)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值