In [2]:
import numpy as np
import matplotlib.pyplot as plt

In [10]:
def f(x):
    return x * x - 2 * x + 1

def g(x):
    return 2 * x - 2

x = np.linspace(-5,7,100)
y = f(x)

In [11]:
print x


[-5.         -4.87878788 -4.75757576 -4.63636364 -4.51515152 -4.39393939
 -4.27272727 -4.15151515 -4.03030303 -3.90909091 -3.78787879 -3.66666667
 -3.54545455 -3.42424242 -3.3030303  -3.18181818 -3.06060606 -2.93939394
 -2.81818182 -2.6969697  -2.57575758 -2.45454545 -2.33333333 -2.21212121
 -2.09090909 -1.96969697 -1.84848485 -1.72727273 -1.60606061 -1.48484848
 -1.36363636 -1.24242424 -1.12121212 -1.         -0.87878788 -0.75757576
 -0.63636364 -0.51515152 -0.39393939 -0.27272727 -0.15151515 -0.03030303
  0.09090909  0.21212121  0.33333333  0.45454545  0.57575758  0.6969697
  0.81818182  0.93939394  1.06060606  1.18181818  1.3030303   1.42424242
  1.54545455  1.66666667  1.78787879  1.90909091  2.03030303  2.15151515
  2.27272727  2.39393939  2.51515152  2.63636364  2.75757576  2.87878788
  3.          3.12121212  3.24242424  3.36363636  3.48484848  3.60606061
  3.72727273  3.84848485  3.96969697  4.09090909  4.21212121  4.33333333
  4.45454545  4.57575758  4.6969697   4.81818182  4.93939394  5.06060606
  5.18181818  5.3030303   5.42424242  5.54545455  5.66666667  5.78787879
  5.90909091  6.03030303  6.15151515  6.27272727  6.39393939  6.51515152
  6.63636364  6.75757576  6.87878788  7.        ]

In [12]:
print y


[  3.60000000e+01   3.45601469e+01   3.31496786e+01   3.17685950e+01
   3.04168962e+01   2.90945822e+01   2.78016529e+01   2.65381084e+01
   2.53039486e+01   2.40991736e+01   2.29237833e+01   2.17777778e+01
   2.06611570e+01   1.95739210e+01   1.85160698e+01   1.74876033e+01
   1.64885216e+01   1.55188246e+01   1.45785124e+01   1.36675849e+01
   1.27860422e+01   1.19338843e+01   1.11111111e+01   1.03177227e+01
   9.55371901e+00   8.81910009e+00   8.11386593e+00   7.43801653e+00
   6.79155188e+00   6.17447199e+00   5.58677686e+00   5.02846648e+00
   4.49954086e+00   4.00000000e+00   3.52984389e+00   3.08907254e+00
   2.67768595e+00   2.29568411e+00   1.94306703e+00   1.61983471e+00
   1.32598714e+00   1.06152433e+00   8.26446281e-01   6.20752984e-01
   4.44444444e-01   2.97520661e-01   1.79981635e-01   9.18273646e-02
   3.30578512e-02   3.67309458e-03   3.67309458e-03   3.30578512e-02
   9.18273646e-02   1.79981635e-01   2.97520661e-01   4.44444444e-01
   6.20752984e-01   8.26446281e-01   1.06152433e+00   1.32598714e+00
   1.61983471e+00   1.94306703e+00   2.29568411e+00   2.67768595e+00
   3.08907254e+00   3.52984389e+00   4.00000000e+00   4.49954086e+00
   5.02846648e+00   5.58677686e+00   6.17447199e+00   6.79155188e+00
   7.43801653e+00   8.11386593e+00   8.81910009e+00   9.55371901e+00
   1.03177227e+01   1.11111111e+01   1.19338843e+01   1.27860422e+01
   1.36675849e+01   1.45785124e+01   1.55188246e+01   1.64885216e+01
   1.74876033e+01   1.85160698e+01   1.95739210e+01   2.06611570e+01
   2.17777778e+01   2.29237833e+01   2.40991736e+01   2.53039486e+01
   2.65381084e+01   2.78016529e+01   2.90945822e+01   3.04168962e+01
   3.17685950e+01   3.31496786e+01   3.45601469e+01   3.60000000e+01]

In [13]:
%matplotlib inline
plt.plot(x, y)


Out[13]:
[<matplotlib.lines.Line2D at 0x10640a350>]

In [33]:
def gd(x_start, step, g):   # gd代表了Gradient Descent
    x = x_start
    for i in range(20):
        grad = g(x)
        x -= grad * step
        print '[ Epoch {0} ] grad = {1}, x = {2}'.format(i, grad, x)
        if abs(grad) < 1e-6:
            break;
    return x
gd(5,0.1,g)


[ Epoch 0 ] grad = 8, x = 4.2
[ Epoch 1 ] grad = 6.4, x = 3.56
[ Epoch 2 ] grad = 5.12, x = 3.048
[ Epoch 3 ] grad = 4.096, x = 2.6384
[ Epoch 4 ] grad = 3.2768, x = 2.31072
[ Epoch 5 ] grad = 2.62144, x = 2.048576
[ Epoch 6 ] grad = 2.097152, x = 1.8388608
[ Epoch 7 ] grad = 1.6777216, x = 1.67108864
[ Epoch 8 ] grad = 1.34217728, x = 1.536870912
[ Epoch 9 ] grad = 1.073741824, x = 1.4294967296
[ Epoch 10 ] grad = 0.8589934592, x = 1.34359738368
[ Epoch 11 ] grad = 0.68719476736, x = 1.27487790694
[ Epoch 12 ] grad = 0.549755813888, x = 1.21990232556
[ Epoch 13 ] grad = 0.43980465111, x = 1.17592186044
[ Epoch 14 ] grad = 0.351843720888, x = 1.14073748836
[ Epoch 15 ] grad = 0.281474976711, x = 1.11258999068
[ Epoch 16 ] grad = 0.225179981369, x = 1.09007199255
[ Epoch 17 ] grad = 0.180143985095, x = 1.07205759404
[ Epoch 18 ] grad = 0.144115188076, x = 1.05764607523
[ Epoch 19 ] grad = 0.115292150461, x = 1.04611686018
Out[33]:
1.0461168601842739

In [34]:
gd(5,100,g)


[ Epoch 0 ] grad = 8, x = -795
[ Epoch 1 ] grad = -1592, x = 158405
[ Epoch 2 ] grad = 316808, x = -31522395
[ Epoch 3 ] grad = -63044792, x = 6272956805
[ Epoch 4 ] grad = 12545913608, x = -1248318403995
[ Epoch 5 ] grad = -2496636807992, x = 248415362395205
[ Epoch 6 ] grad = 496830724790408, x = -49434657116645595
[ Epoch 7 ] grad = -98869314233291192, x = 9837496766212473605
[ Epoch 8 ] grad = 19674993532424947208, x = -1957661856476282247195
[ Epoch 9 ] grad = -3915323712952564494392, x = 389574709438780167192005
[ Epoch 10 ] grad = 779149418877560334384008, x = -77525367178317253271208795
[ Epoch 11 ] grad = -155050734356634506542417592, x = 15427548068485133400970550405
[ Epoch 12 ] grad = 30855096136970266801941100808, x = -3070082065628541546793139530395
[ Epoch 13 ] grad = -6140164131257083093586279060792, x = 610946331060079767811834766548805
[ Epoch 14 ] grad = 1221892662120159535623669533097608, x = -121578319880955873794555118543211995
[ Epoch 15 ] grad = -243156639761911747589110237086423992, x = 24194085656310218885116468590099187205
[ Epoch 16 ] grad = 48388171312620437770232937180198374408, x = -4814623045605733558138177249429738253595
[ Epoch 17 ] grad = -9629246091211467116276354498859476507192, x = 958109986075540978069497272636517912465605
[ Epoch 18 ] grad = 1916219972151081956138994545273035824931208, x = -190663887229032654635829957254667064580655195
[ Epoch 19 ] grad = -381327774458065309271659914509334129161310392, x = 37942113558577498272530161493678745851550384005
Out[34]:
37942113558577498272530161493678745851550384005L

In [35]:
gd(4,1,g)


[ Epoch 0 ] grad = 6, x = -2
[ Epoch 1 ] grad = -6, x = 4
[ Epoch 2 ] grad = 6, x = -2
[ Epoch 3 ] grad = -6, x = 4
[ Epoch 4 ] grad = 6, x = -2
[ Epoch 5 ] grad = -6, x = 4
[ Epoch 6 ] grad = 6, x = -2
[ Epoch 7 ] grad = -6, x = 4
[ Epoch 8 ] grad = 6, x = -2
[ Epoch 9 ] grad = -6, x = 4
[ Epoch 10 ] grad = 6, x = -2
[ Epoch 11 ] grad = -6, x = 4
[ Epoch 12 ] grad = 6, x = -2
[ Epoch 13 ] grad = -6, x = 4
[ Epoch 14 ] grad = 6, x = -2
[ Epoch 15 ] grad = -6, x = 4
[ Epoch 16 ] grad = 6, x = -2
[ Epoch 17 ] grad = -6, x = 4
[ Epoch 18 ] grad = 6, x = -2
[ Epoch 19 ] grad = -6, x = 4
Out[35]:
4

In [32]:
def f2(x):
    return 4 * x * x - 4 * x + 1
def g2(x):
    return 8 * x -4
gd(5,0.25,g2)


[ Epoch 0 ] grad = 36, x = -4.0
[ Epoch 1 ] grad = -36.0, x = 5.0
[ Epoch 2 ] grad = 36.0, x = -4.0
[ Epoch 3 ] grad = -36.0, x = 5.0
[ Epoch 4 ] grad = 36.0, x = -4.0
[ Epoch 5 ] grad = -36.0, x = 5.0
[ Epoch 6 ] grad = 36.0, x = -4.0
[ Epoch 7 ] grad = -36.0, x = 5.0
[ Epoch 8 ] grad = 36.0, x = -4.0
[ Epoch 9 ] grad = -36.0, x = 5.0
[ Epoch 10 ] grad = 36.0, x = -4.0
[ Epoch 11 ] grad = -36.0, x = 5.0
[ Epoch 12 ] grad = 36.0, x = -4.0
[ Epoch 13 ] grad = -36.0, x = 5.0
[ Epoch 14 ] grad = 36.0, x = -4.0
[ Epoch 15 ] grad = -36.0, x = 5.0
[ Epoch 16 ] grad = 36.0, x = -4.0
[ Epoch 17 ] grad = -36.0, x = 5.0
[ Epoch 18 ] grad = 36.0, x = -4.0
[ Epoch 19 ] grad = -36.0, x = 5.0
Out[32]:
5.0