zoukankan      html  css  js  c++  java
  • 2.5 Local Methods in High Dimensions

    curse of dimensionality

    • 输入在p维立方体中符合均匀分布,如果需要覆盖比例r的体积,需要每个维度上(e_p(r)=r^{1/p})
      (e_{10}(0.01)=0.63,e_{10}(0.1)=0.8)
    • 输入在p维立方体中负荷均匀分布,p=1时,1000个点达到的采样密度
      在p=10时,需要(1000^{10})个点才能达到
      需要的数据量随维度增加幂增长
    • 输入在p维单位球体中符合均匀分布,使用1-nearest neighbor预测0点的値
      假设有N个训练数据,则这些点到0点距离的中値为
      (d(p,N)={(1-{(1/2)}^{1/N})}^{1/p})
      $ d(10, 500) ≈ 0.52$
      当维度高,数据量小时,最近邻离预测点往往比较远,所以得到的预测偏差大

    证明:
    p维,半径为r的球体体积为(V_p(r)=frac{pi^{p/2}}{Gamma(1+p/2)}r^p)
    N个点都在半径为d的球体外的概率为对应部分体积之比(p(D>d)={(1-d^p)}^N)
    (p(D>d)=1/2)(d(p,N)={(1-{(1/2)}^{1/N})}^{1/p})

    • 1000个训练数据均匀分布在({[-1,1]}^p)中,真实(Y)(X)的关系,符合以下函数:
      (Y=f(X)=e^{-8{||x||}^2}),使用1-nearest neighbor预测在0点的値
      进行bias–variance decomposition
      平均平方误差可以分成在训练集( au)上的方差,以及模型本身的偏差平方

    p = 10时,99%的训练集最近邻离0点的距离都大于0.5
    

    证明:
    (p(D>0.5)={left(1-frac{frac{pi^{10/2}}{Gamma(1+10/2)}{0.5}^{10}}{2^{10}} ight)}^{1000}≈0.99757)

    import python
    math.pow(1-math.pow(math.pi,5)/120/math.pow(4,10),1000)
    
    figure2.7 **_bais占主要,因为最近邻离的远,函数中有距离项_**
    

    每次训练集采样,得到的最近邻离0点距离差别不大

    figure2.8 将函数换成$f(X)={(X_1+1)}^3/2$,Y値只与第一个维度相关
    

    '''
    2.5<Local Methods in High Dimensions>
    page 25(figure2.7),26(figure2.8)
    function2.7 is f(x)=e^{-8||x||^2}
    function2.8 is f(x)=(x_1+1)^3/2
    x is uniformally distributed in [-1,1]^p ,p is the dimension
    MSE,VARIANCE,BAIS is about f(0)
    so for function2.7 f0=1
           function2.8 f0=0.5
    '''
    import numpy as np
    import matplotlib.pyplot as plt
    def func2_7(X):
        return np.array([np.exp(-8*np.dot(i,i)) for i in X])
    def func2_8(X):
        return np.array([np.power(i[0]+1,3)/2.0 for i in X])
    def mse_var_bais(N,T,p,func1,f0):
        X = np.zeros((T,p))
        for i in range(T):
            dt = np.random.uniform(-1,1,N*p).reshape((N,p))
            st = [np.dot(j,j) for j in dt]
            ind = (st==np.min(st))
            #get the nearest neighbor
            X[i,:] = dt[ind,:]
        arr = func1(X)
        mse = np.mean(np.power((arr - f0),2))
        var = np.mean(np.power(arr - np.mean(arr),2))
        bais = np.power(np.mean(arr)-f0,2)
        return mse,var,bais
    def getMSE_VAR_BAIS(N,T,f0,func1):
        VAR = []
        BAIS = []
        MSE = []
        for i in range(10):
            mse,var,bais=mse_var_bais(N,T,i+1,func1,f0)
            MSE.append(mse)
            VAR.append(var)
            BAIS.append(bais)
            print i+1
        return MSE,BAIS,VAR
    #MSE,BAIS,VAR =getMSE_VAR_BAIS(N=1000,T=1000,f0=1,func1=func2_7)
    MSE,BAIS,VAR =getMSE_VAR_BAIS(N=1000,T=1000,f0=0.5,func1=func2_8)
    xa=[i+1 for i in range(10)]
    plt.plot(xa,MSE,'ro-',label='MSE')
    plt.plot(xa,BAIS,'bo-',label='sq. BAIS')
    plt.plot(xa,VAR,'go-',label='VAR')
    plt.legend(loc='upper left')
    plt.show()  
    
  • 相关阅读:
    Kinect 开发 —— 硬件设备解剖
    Kinect 开发 —— 引言
    (转)OpenCV 基本知识框架
    OpenCV —— 摄像机模型与标定
    OpenCV —— 跟踪与运动
    OpenCV —— 图像局部与分割(二)
    OpenCV —— 图像局部与部分分割(一)
    OpenCV —— 轮廓
    OpenCV —— 直方图与匹配
    OpenCV —— 图像变换
  • 原文地址:https://www.cnblogs.com/porco/p/4717725.html
Copyright © 2011-2022 走看看