zoukankan      html  css  js  c++  java
  • k近邻法( k-nearnest neighbor)

    基本思想:

    给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把该输入实例分为这个类


    距离度量:

    特征空间中两个实例点的距离是两个实例点相似程度的反映,一般常用欧氏距离,更一般的有行内公式(L_p)或者Minkowski距离

    [L_p(x_i,x_j)=(sum_{l=1}^{n}|x_i^{(l)}-x_j^{(l)}|^p)^{frac{1}{p}} ]

    • 当(p=1)时,为曼哈顿距离,(L_1(x_i,x_j)=sum_{l=1}{n}|x_i{(l)}-x_j^{(l)}|)

    • 当(p=2)时,为欧式距离,(L_2(x_i,x_j)=(sum|x_i{(l)}-x_j{(l)}|2){frac{1}{2}})

    • 当(p=infty)时,它是各个坐标距离的最大值,(L_infty(x_i,x_j)=max_l|x_i{(l)}-x_j{(l)}|)

    机器学习实战第二章代码

    import numpy as np
    def classify0(inx,dataSet,labels,k):
        datasize=dataSet.shape[0]
        diffmat=np.tile(inx,(datasize,1))-dataSet
        sqdismat=diffmat**2
        sqdist=sqdismat.sum(axis=1)
        dist=sqdist**0.5
        sortdistpos=dist.argsort()
        labelscount=np.array([0,0,0,0])
        for i in range(k):
            votelabels=labels[sortdistpos[i]]
            labelscount[votelabels]+=1
        returnresult=labelscount.argsort()
        return returnresult[-1]
    
    def dataload(filename):
        file=open(filename)
        ar=file.readlines()
        num=len(ar)
        returnMat=np.zeros((num,3))
        returnLabels=[]
        index=0
        for line in ar:
            line=line.strip()
            linelist=line.split('	')
            returnMat[index,:]=linelist[0:3]
            returnLabels.append(int(linelist[-1]))
            index+=1
        return returnMat,returnLabels
    
    def autoNorm(dataSet):
        minvals=dataSet.min(0)
        maxvals=dataSet.max(0)
        ranges=maxvals-minvals
        normDataSet=np.zeros(np.shape(dataSet))
        m=dataSet.shape[0]
        normDataSet=dataSet-np.tile(minvals,(m,1))
        normDataSet=normDataSet/np.tile(ranges,(m,1))
        return normDataSet
    
    DataMat,DataLabels=dataload('datingTestSet2.txt')
    normDataMat=autoNorm(DataMat)
    ratio=0.1
    tep=normDataMat.shape[0]
    testnum=int(tep*ratio)
    print(tep,testnum)
    errorcount=0
    for i in range(testnum):
        result=classify0(normDataMat[i,:],normDataMat[testnum:tep,:],DataLabels[testnum:tep],3)
        if(result!=DataLabels[i]):
            errorcount+=1
        print(i," the test result is ",result,",the real result is ",DataLabels[i])
    print(errorcount)
    print("the error ratio is ",errorcount*1.0/testnum)
    
  • 相关阅读:
    linux之ftp命令详解
    ubuntu-18.04 设置开机启动脚本
    web端调起Windows系统应用程序(exe执行文件),全面兼容所有浏览器
    logstash 6.6.0 读取nginx日志 插入到elasticsearch中
    微服务架构中服务注册与发现
    logstash kafka output 日志处理
    filebeat输出到kafka
    nginx优化之request_time 和upstream_response_time差别
    利用ldirectord实现lvs后端realserver健康状态检查
    ELK 架构之 Logstash 和 Filebeat 安装配置
  • 原文地址:https://www.cnblogs.com/zhangchengc919/p/7226586.html
Copyright © 2011-2022 走看看