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

Grande variância e pequeno viés

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")