K近邻法(K-nearest neighbor,K-NN)—有监督学习方法、非概率模型、判别模型、线性模型、非参数化模型、批量学习、核方法

定义

输入:训练数据集(T= { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } \left\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\right\} {(x1,y1),(x2,y2),,(xN,yN)}

             其中:

                        x i ∈ χ ⊆ R n x_i \in {\tt \chi} \subseteq R^n xiχRn :实例的特征向量

                        y i ∈ y y_i \in {\tt y} yiy = { c 1 , c 2 , ⋯   , c k } = \{c_1,c_2,\cdots,c_k \} ={c1,c2,,ck} :实例的类别, i = 1 , 2 , ⋯   , N i=1,2,\cdots,N i=1,2,,N

                        x x x:实例特征向量

输出:实例 x x x所属的类 y y y

(1)根据给定的距离度量,在训练集T中找出与 x x x最近邻的 k k k个点,涵盖这 k k k个点的 x x x的邻域记作 N k ( x ) N_k(x) Nk(x)

(2)在 N k ( x ) N_k(x) Nk(x)中根据分类决策规则(如多数表决)决定 x x x的类别 y y y
y = a r g m a x c j ∑ x i ∈ N k ( x ) I ( y i = c j ) , i = 1 , 2 , … , N ; j = 1 , 2 , … , K y=argmax_{c_j}\sum_{x_i \in N_k(x)}I(y_i=c_j),i=1,2,\dots,N;j=1,2,\dots,K y=argmaxcjxiNk(x)I(yi=cj),i=1,2,,N;j=1,2,,K

指示函数: I ( y i = c j ) : { 1 ; y i = c j 0 ; y i ≠ c j I(y_i=c_j):\begin{cases} 1; y_i=c_j \\ 0 ;y_i \neq c_j \end{cases} I(yi=cj):{1;yi=cj0;yi=cj

输入空间

T= { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } \left\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\right\} {(x1,y1),(x2,y2),,(xN,yN)}

import numpy as np
import time
start = time.time()
def loadData(fileName,lines=60000):
    '''
    加载Mnist数据集 下载地址:https://download.csdn.net/download/nanxiaotao/89720991)
    :param fileName:要加载的数据集路径
    :return: 数据集
    '''
    # 定义数据集
    dataSet = np.zeros((lines, 785))
    #读取文件
    fr = open(fileName)
    #遍历文件中的每一行
    i = 0
    for line in fr.readlines():
        curLine = line.strip().split(',')
        x = [int(num) for num in curLine[1:]]
        y=int(curLine[0])
        dataSet[i] = np.append(x, y)
        i=i+1
    #返回数据集
    return dataSet
train_dataSet = loadData('../Mnist/mnist_train.csv')
np.shape(train_dataSet)

特征空间(Feature Space)

train_dataSet[0][0:784]

统计学习方法

模型

y i = f ( t r a i n D a t a S e t , x i , t o p K ) , x i ∈ χ ⊆ R n , y i ∈ y = { c 1 , c 2 , ⋯   , c k } y_i=f(trainDataSet,x_i,topK),x_i \in {\tt \chi} \subseteq R^n,y_i \in {\tt y} = \{c_1,c_2,\cdots,c_k \} yi=f(trainDataSet,xi,topK),xiχRn,yiy={c1,c2,,ck}

策略

距离度量

x i , x j ∈ χ , x i = ( x i ( 1 ) , x i ( 2 ) , ⋯   , x i ( n ) ) T , x j = ( x j ( 1 ) , x j ( 2 ) , ⋯   , x j ( n ) ) T x_i,x_j \in \chi,x_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)})^T,x_j=(x_j^{(1)},x_j^{(2)},\cdots,x_j^{(n)})^T xi,xjχ,xi=(xi(1),xi(2),,xi(n))T,xj=(xj(1),xj(2),,xj(n))T

L p ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ p ) 1 p L_p (x_i,x_j)=\left(\sum_{l=1}^{n}\left| x_i^{(l)}-x_j^{(l)} \right|^p\right)^{\frac{1}{p}} Lp(xi,xj)=(l=1n xi(l)xj(l) p)p1

欧式距离(Euclidean Distance)

L 2 ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ 2 ) 1 2 L_2 (x_i,x_j)=\left(\sum_{l=1}^{n}\left| x_i^{(l)}-x_j^{(l)} \right|^2\right)^{\frac{1}{2}} L2(xi,xj)=(l=1n xi(l)xj(l) 2)21

曼哈顿距离(Manhattan Distance)

L 1 ( x i , x j ) = ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ L_1 (x_i,x_j)=\sum_{l=1}^{n}\left| x_i^{(l)}-x_j^{(l)} \right| L1(xi,xj)=l=1n xi(l)xj(l)

各个坐标距离的最大值

L ∞ ( x i , x j ) = m a x l ∣ x i ( l ) − x j ( l ) ∣ L_{\infty} (x_i,x_j)=max_{l}\left| x_i^{(l)}-x_j^{(l)} \right| L(xi,xj)=maxl xi(l)xj(l)

K值的选择

k值一般选择较小的值,交叉验证法来选取最优的k值

分类决策规则

多数表决规则(Majority Voting Rule)

分类函数: f : R n ⇒ { c 1 , c 2 , ⋯   , c K } f:R^n \Rightarrow \left\{ c_1,c_2,\cdots,c_K \right\} f:Rn{c1,c2,,cK}

误分类率: 1 k ∑ x i ∈ N k ( x ) I ( y i ≠ c j ) = 1 − 1 k ∑ x i ∈ N k ( x ) I ( y i = c j ) \frac{1}{k}\sum_{x_i \in N_k{(x)}} I(y_i \ne c_j)=1-\frac{1}{k}\sum_{x_i \in N_k{(x)}}I(y_i = c_j) k1xiNk(x)I(yi=cj)=1k1xiNk(x)I(yi=cj)

算法

L 2 ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ 2 ) 1 2 L_2 (x_i,x_j)=\left(\sum_{l=1}^{n}\left| x_i^{(l)}-x_j^{(l)} \right|^2\right)^{\frac{1}{2}} L2(xi,xj)=(l=1n xi(l)xj(l) 2)21

m a x ( ∑ x i ∈ N k ( x ) I ( y i = c j ) ) max(\sum_{x_i \in N_k{(x)}}I(y_i = c_j)) max(xiNk(x)I(yi=cj))

def calcDist(x1, x2):
    '''
    计算两个样本点向量之间的距离
    :param x1:向量1
    :param x2:向量2
    :return:向量之间的欧式距离
    '''
    return np.sqrt(np.sum(np.square(x1 - x2)))
def getClosest(train_dataSet, x, topK):
    '''
    预测样本x的标记
    :param train_dataSet:训练数据集
    :param x:要预测的样本x
    :param topK:选择参考最邻近样本的数目
    :return:预测的标记
    '''
    trainDataMat = np.mat(train_dataSet[:,0:784]); 
    #trainLabelMat = np.mat(train_dataSet[:,784:785]).T
    trainLabelMat = np.mat(train_dataSet[:,784:785])
    distList = [0] * len(trainLabelMat)
    for i in range(len(trainDataMat)):
        x1 = trainDataMat[i]
        curDist = calcDist(x1, x)
        distList[i] = curDist

    topKList = np.argsort(np.array(distList))[:topK]        #升序排序
    labelList = [0] * 10
    #对topK个索引进行遍历
    for index in topKList:
        labelList[int(trainLabelMat[index])] += 1
    return labelList.index(max(labelList))

假设空间(Hypothesis Space)

{ f ∣ f ( x ) = a r g m a x c j ∑ x i ∈ N k ( x ) I ( y i = c j ) , i = 1 , 2 , … , N ; j = 1 , 2 , … , K } \left\{f|f(x) = argmax_{c_j}\sum_{x_i \in N_k(x)}I(y_i=c_j),i=1,2,\dots,N;j=1,2,\dots,K \right\} {ff(x)=argmaxcjxiNk(x)I(yi=cj),i=1,2,,N;j=1,2,,K}

输出空间

y {\tt y} y = { c 1 , c 2 , ⋯   , c k } = \{c_1,c_2,\cdots,c_k \} ={c1,c2,,ck}

模型评估

训练误差(Training Error)

test_dataSet = loadData('../Mnist/mnist_test.csv',10000)
np.shape(test_dataSet)
def model_test(train_dataSet, test_dataSet, topK):
    '''
    测试正确率
    :param train_dataSet:训练集数据集
    :param test_dataSet: 测试集数据集
    :param topK: 选择多少个邻近点参考
    :return: 正确率
    '''
    testDataMat = np.mat(test_dataSet[:,0:784]); 
    testLabelMat = np.mat(test_dataSet[:,784:785])

    #错误值技术
    errorCnt = 0

    for i in range(200):
        print('test %d:%d' % (i, 200))
        #读取测试集当前测试样本的向量
        x = testDataMat[i]
        #获取预测的标记
        y = getClosest(train_dataSet, x, topK)
        #如果预测标记与实际标记不符,错误值计数加1
        if y != testLabelMat[i]: errorCnt += 1

    #返回正确率
    return 1 - (errorCnt / 200)
#计算测试集正确率
accur = model_test(train_dataSet, test_dataSet, 25)
#打印正确率
print('accur is:%d'%(accur * 100), '%')

测试误差(Test Error)

模型选择

过拟合

正则化

泛化能力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值