Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Você pode dar um exemplo de evidência empírica da Decomposição Viés-Variância?

0 votos
108 visitas

1 Resposta

0 votos
respondida Jun 1, 2016 por danielcajueiro (5,251 pontos)  

A idéia por detrás da decomposição Viés-Variância é que:

a) Modelos muito flexíveis possuem Alta variância e baixo viés

b) Modelos pouco flexíveis possuem baixa variância e alto viés

Um exemplo bem simples pode ser gerado usando uma rede neural de base radial que considera um termo de regularização na função objetivo usada para estimar os seus parâmetros. Variando o parâmetro de regularização \(lambda\) podemos chegar as seguintes figuras:

Variância pequena e grande viés
small Variance - Bias variance decomposition

Grande variância e pequeno viés
large variance - bias variance decomposition

O código usado para gerar essas figuras foi:

import tensorflow as tf
import numpy as np
import math
import matplotlib.pyplot as plt


def gaussian_function(x,mu,sigma):
    return tf.exp(-tf.square(x-mu)/(2*np.power(sigma,2)))

def init_weights(shape):
    return tf.Variable(tf.random_uniform(shape, -0.01, 0.01))

def init_gaussian_location(shape):
    return tf.linspace(0.0,6.28,24)

def model(X,w,b,gaussianLocations,sigma):
    h=gaussian_function(X,gaussianLocations,sigma)
    return tf.matmul(h,w)+b

def generate_sin(n):
    theInput = np.float32(np.random.uniform(0,6.28,[n,1])) # Random input            
    theOutput=np.empty([n,1])
    for i in range(n):
        theOutput[i,0]=np.sin(theInput[i,0]) + np.random.normal(loc=0.0,scale=0.3)
    return theInput,theOutput



if __name__ == '__main__':

# Generate Data
    n=100
    [theInput,theOutput]=generate_sin(n)

    numberInputs=1
    numberGaussian=24
    numberOutputs=1


    w = init_weights([numberGaussian,1])
    b = init_weights([1,1])
    W=tf.concat(0,[w,b])

    X=tf.placeholder("float",[None,numberInputs])
    Y=tf.placeholder("float",[None,numberOutputs])    

    gaussianLocation=init_gaussian_location([None,numberGaussian])

    sigma=1
    y_x = model(X,w,b,gaussianLocation,sigma)

# Minimizing the squared errors with regularization
    lamb=np.exp(-2.6)
    loss = tf.square(Y-y_x)+lamb*tf.matmul(tf.transpose(W),W)
    #optimizer = tf.train.GradientDescentOptimizer(0.001)
    optimizer = tf.train.AdagradOptimizer(0.01,0.0001)
    train = optimizer.minimize(loss)

# Model Evaluation
    modelOutput=y_x

# For initializing the variables.
    init = tf.initialize_all_variables()

# Launch the graph
    sess = tf.Session()
    sess.run(init)

# Fit the plane.
    numberDataSet=10
    numberEpochs=1001
    sizeDataSet=25    

    fig = plt.figure()
    ax1 = fig.add_subplot(111)  
    ax1.axis([0, 2*math.pi, -1.5, 1.5]) 
    fig.hold()
    ax1.plot(theInput,theOutput,'bo',markersize=7, markeredgewidth=0)    

    for i in range(numberDataSet):
        print i
        theSamples=np.random.randint(0,n,[sizeDataSet])
        sampleIn=theInput[theSamples]
        sampleOut=theOutput[theSamples]        

        for epoch in range(numberEpochs):
            _=sess.run(train,feed_dict={X:sampleIn,Y:sampleOut})        

            if(epoch%10==0):
                [modelOutputValue,lossValue]=sess.run([modelOutput,loss],feed_dict={X:theInput,Y:theOutput})  
                #print sum(lossValue)

        idx=np.argsort(theInput.T)
        plotResultsVector=[theInput[idx,0],modelOutputValue[idx,0]]        
        ax1.plot(plotResultsVector[0][:],plotResultsVector[1][:], 'ro')    
    fig.savefig("largeVariance.eps")
...