In [16]:
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns  # prettier plots
import numpy as np

In [38]:
# Minimize a solution around some solution point
solution = np.array([0.5, 0.1, -0.3])

# objective function
def f(w):
    return -np.sum((w - solution) ** 2)

npop = 50  # population size
sigma = 0.1  # noise standard deviation
alpha = 0.001  # learning rate

no_iterations = 300

def run(no_iterations, verbose=True):
    output_format = 'Iteration {:>4}: [{w[0]:.4f}, {w[0]:.4f}, {w[0]:.4f}]'
    
    # Collect the values of w
    ws = []
    
    # Initialize randomly
    w = np.random.randn(3)
    ws.append(w)
    if verbose:
        print(output_format.format(0, w=w))
    
    for i in range(no_iterations):
        N = np.random.randn(npop, 3)
        R = np.zeros(npop)

        for j in range(npop):
            # Create a candidate w to try
            w_try = w + sigma * N[j]
            
            # Try the candidate
            R[j] = f(w_try)

        A = (R - np.mean(R)) / np.std(R)
        w = w + alpha / (npop * sigma) * np.dot(N.T, A)
        ws.append(w)
        if verbose:
            print(output_format.format(i + 1, w=w))
            
    return ws

In [40]:
ws = run(no_iterations)


Iteration    0: [2.3761, 2.3761, 2.3761]
Iteration    1: [2.3686, 2.3686, 2.3686]
Iteration    2: [2.3615, 2.3615, 2.3615]
Iteration    3: [2.3519, 2.3519, 2.3519]
Iteration    4: [2.3423, 2.3423, 2.3423]
Iteration    5: [2.3331, 2.3331, 2.3331]
Iteration    6: [2.3250, 2.3250, 2.3250]
Iteration    7: [2.3172, 2.3172, 2.3172]
Iteration    8: [2.3098, 2.3098, 2.3098]
Iteration    9: [2.3000, 2.3000, 2.3000]
Iteration   10: [2.2919, 2.2919, 2.2919]
Iteration   11: [2.2839, 2.2839, 2.2839]
Iteration   12: [2.2739, 2.2739, 2.2739]
Iteration   13: [2.2661, 2.2661, 2.2661]
Iteration   14: [2.2580, 2.2580, 2.2580]
Iteration   15: [2.2494, 2.2494, 2.2494]
Iteration   16: [2.2419, 2.2419, 2.2419]
Iteration   17: [2.2339, 2.2339, 2.2339]
Iteration   18: [2.2233, 2.2233, 2.2233]
Iteration   19: [2.2169, 2.2169, 2.2169]
Iteration   20: [2.2075, 2.2075, 2.2075]
Iteration   21: [2.1979, 2.1979, 2.1979]
Iteration   22: [2.1896, 2.1896, 2.1896]
Iteration   23: [2.1792, 2.1792, 2.1792]
Iteration   24: [2.1713, 2.1713, 2.1713]
Iteration   25: [2.1627, 2.1627, 2.1627]
Iteration   26: [2.1539, 2.1539, 2.1539]
Iteration   27: [2.1444, 2.1444, 2.1444]
Iteration   28: [2.1370, 2.1370, 2.1370]
Iteration   29: [2.1266, 2.1266, 2.1266]
Iteration   30: [2.1198, 2.1198, 2.1198]
Iteration   31: [2.1110, 2.1110, 2.1110]
Iteration   32: [2.1016, 2.1016, 2.1016]
Iteration   33: [2.0932, 2.0932, 2.0932]
Iteration   34: [2.0848, 2.0848, 2.0848]
Iteration   35: [2.0766, 2.0766, 2.0766]
Iteration   36: [2.0668, 2.0668, 2.0668]
Iteration   37: [2.0589, 2.0589, 2.0589]
Iteration   38: [2.0520, 2.0520, 2.0520]
Iteration   39: [2.0433, 2.0433, 2.0433]
Iteration   40: [2.0353, 2.0353, 2.0353]
Iteration   41: [2.0266, 2.0266, 2.0266]
Iteration   42: [2.0185, 2.0185, 2.0185]
Iteration   43: [2.0098, 2.0098, 2.0098]
Iteration   44: [2.0022, 2.0022, 2.0022]
Iteration   45: [1.9937, 1.9937, 1.9937]
Iteration   46: [1.9849, 1.9849, 1.9849]
Iteration   47: [1.9772, 1.9772, 1.9772]
Iteration   48: [1.9694, 1.9694, 1.9694]
Iteration   49: [1.9595, 1.9595, 1.9595]
Iteration   50: [1.9501, 1.9501, 1.9501]
Iteration   51: [1.9421, 1.9421, 1.9421]
Iteration   52: [1.9341, 1.9341, 1.9341]
Iteration   53: [1.9265, 1.9265, 1.9265]
Iteration   54: [1.9191, 1.9191, 1.9191]
Iteration   55: [1.9096, 1.9096, 1.9096]
Iteration   56: [1.9021, 1.9021, 1.9021]
Iteration   57: [1.8948, 1.8948, 1.8948]
Iteration   58: [1.8846, 1.8846, 1.8846]
Iteration   59: [1.8774, 1.8774, 1.8774]
Iteration   60: [1.8684, 1.8684, 1.8684]
Iteration   61: [1.8593, 1.8593, 1.8593]
Iteration   62: [1.8505, 1.8505, 1.8505]
Iteration   63: [1.8417, 1.8417, 1.8417]
Iteration   64: [1.8323, 1.8323, 1.8323]
Iteration   65: [1.8253, 1.8253, 1.8253]
Iteration   66: [1.8164, 1.8164, 1.8164]
Iteration   67: [1.8075, 1.8075, 1.8075]
Iteration   68: [1.7989, 1.7989, 1.7989]
Iteration   69: [1.7910, 1.7910, 1.7910]
Iteration   70: [1.7829, 1.7829, 1.7829]
Iteration   71: [1.7734, 1.7734, 1.7734]
Iteration   72: [1.7646, 1.7646, 1.7646]
Iteration   73: [1.7548, 1.7548, 1.7548]
Iteration   74: [1.7465, 1.7465, 1.7465]
Iteration   75: [1.7385, 1.7385, 1.7385]
Iteration   76: [1.7303, 1.7303, 1.7303]
Iteration   77: [1.7225, 1.7225, 1.7225]
Iteration   78: [1.7123, 1.7123, 1.7123]
Iteration   79: [1.7035, 1.7035, 1.7035]
Iteration   80: [1.6960, 1.6960, 1.6960]
Iteration   81: [1.6871, 1.6871, 1.6871]
Iteration   82: [1.6797, 1.6797, 1.6797]
Iteration   83: [1.6726, 1.6726, 1.6726]
Iteration   84: [1.6659, 1.6659, 1.6659]
Iteration   85: [1.6577, 1.6577, 1.6577]
Iteration   86: [1.6480, 1.6480, 1.6480]
Iteration   87: [1.6396, 1.6396, 1.6396]
Iteration   88: [1.6308, 1.6308, 1.6308]
Iteration   89: [1.6227, 1.6227, 1.6227]
Iteration   90: [1.6135, 1.6135, 1.6135]
Iteration   91: [1.6043, 1.6043, 1.6043]
Iteration   92: [1.5973, 1.5973, 1.5973]
Iteration   93: [1.5899, 1.5899, 1.5899]
Iteration   94: [1.5808, 1.5808, 1.5808]
Iteration   95: [1.5725, 1.5725, 1.5725]
Iteration   96: [1.5637, 1.5637, 1.5637]
Iteration   97: [1.5564, 1.5564, 1.5564]
Iteration   98: [1.5479, 1.5479, 1.5479]
Iteration   99: [1.5401, 1.5401, 1.5401]
Iteration  100: [1.5307, 1.5307, 1.5307]
Iteration  101: [1.5229, 1.5229, 1.5229]
Iteration  102: [1.5165, 1.5165, 1.5165]
Iteration  103: [1.5087, 1.5087, 1.5087]
Iteration  104: [1.4996, 1.4996, 1.4996]
Iteration  105: [1.4918, 1.4918, 1.4918]
Iteration  106: [1.4840, 1.4840, 1.4840]
Iteration  107: [1.4747, 1.4747, 1.4747]
Iteration  108: [1.4671, 1.4671, 1.4671]
Iteration  109: [1.4591, 1.4591, 1.4591]
Iteration  110: [1.4511, 1.4511, 1.4511]
Iteration  111: [1.4434, 1.4434, 1.4434]
Iteration  112: [1.4351, 1.4351, 1.4351]
Iteration  113: [1.4271, 1.4271, 1.4271]
Iteration  114: [1.4202, 1.4202, 1.4202]
Iteration  115: [1.4117, 1.4117, 1.4117]
Iteration  116: [1.4023, 1.4023, 1.4023]
Iteration  117: [1.3937, 1.3937, 1.3937]
Iteration  118: [1.3852, 1.3852, 1.3852]
Iteration  119: [1.3757, 1.3757, 1.3757]
Iteration  120: [1.3661, 1.3661, 1.3661]
Iteration  121: [1.3572, 1.3572, 1.3572]
Iteration  122: [1.3496, 1.3496, 1.3496]
Iteration  123: [1.3389, 1.3389, 1.3389]
Iteration  124: [1.3289, 1.3289, 1.3289]
Iteration  125: [1.3205, 1.3205, 1.3205]
Iteration  126: [1.3132, 1.3132, 1.3132]
Iteration  127: [1.3028, 1.3028, 1.3028]
Iteration  128: [1.2936, 1.2936, 1.2936]
Iteration  129: [1.2840, 1.2840, 1.2840]
Iteration  130: [1.2752, 1.2752, 1.2752]
Iteration  131: [1.2658, 1.2658, 1.2658]
Iteration  132: [1.2569, 1.2569, 1.2569]
Iteration  133: [1.2485, 1.2485, 1.2485]
Iteration  134: [1.2389, 1.2389, 1.2389]
Iteration  135: [1.2288, 1.2288, 1.2288]
Iteration  136: [1.2210, 1.2210, 1.2210]
Iteration  137: [1.2131, 1.2131, 1.2131]
Iteration  138: [1.2026, 1.2026, 1.2026]
Iteration  139: [1.1946, 1.1946, 1.1946]
Iteration  140: [1.1860, 1.1860, 1.1860]
Iteration  141: [1.1767, 1.1767, 1.1767]
Iteration  142: [1.1676, 1.1676, 1.1676]
Iteration  143: [1.1608, 1.1608, 1.1608]
Iteration  144: [1.1519, 1.1519, 1.1519]
Iteration  145: [1.1433, 1.1433, 1.1433]
Iteration  146: [1.1362, 1.1362, 1.1362]
Iteration  147: [1.1282, 1.1282, 1.1282]
Iteration  148: [1.1217, 1.1217, 1.1217]
Iteration  149: [1.1133, 1.1133, 1.1133]
Iteration  150: [1.1050, 1.1050, 1.1050]
Iteration  151: [1.0952, 1.0952, 1.0952]
Iteration  152: [1.0873, 1.0873, 1.0873]
Iteration  153: [1.0804, 1.0804, 1.0804]
Iteration  154: [1.0724, 1.0724, 1.0724]
Iteration  155: [1.0662, 1.0662, 1.0662]
Iteration  156: [1.0565, 1.0565, 1.0565]
Iteration  157: [1.0477, 1.0477, 1.0477]
Iteration  158: [1.0381, 1.0381, 1.0381]
Iteration  159: [1.0315, 1.0315, 1.0315]
Iteration  160: [1.0227, 1.0227, 1.0227]
Iteration  161: [1.0143, 1.0143, 1.0143]
Iteration  162: [1.0081, 1.0081, 1.0081]
Iteration  163: [1.0004, 1.0004, 1.0004]
Iteration  164: [0.9935, 0.9935, 0.9935]
Iteration  165: [0.9845, 0.9845, 0.9845]
Iteration  166: [0.9766, 0.9766, 0.9766]
Iteration  167: [0.9673, 0.9673, 0.9673]
Iteration  168: [0.9588, 0.9588, 0.9588]
Iteration  169: [0.9518, 0.9518, 0.9518]
Iteration  170: [0.9426, 0.9426, 0.9426]
Iteration  171: [0.9341, 0.9341, 0.9341]
Iteration  172: [0.9237, 0.9237, 0.9237]
Iteration  173: [0.9139, 0.9139, 0.9139]
Iteration  174: [0.9055, 0.9055, 0.9055]
Iteration  175: [0.8969, 0.8969, 0.8969]
Iteration  176: [0.8884, 0.8884, 0.8884]
Iteration  177: [0.8794, 0.8794, 0.8794]
Iteration  178: [0.8715, 0.8715, 0.8715]
Iteration  179: [0.8623, 0.8623, 0.8623]
Iteration  180: [0.8539, 0.8539, 0.8539]
Iteration  181: [0.8479, 0.8479, 0.8479]
Iteration  182: [0.8388, 0.8388, 0.8388]
Iteration  183: [0.8312, 0.8312, 0.8312]
Iteration  184: [0.8224, 0.8224, 0.8224]
Iteration  185: [0.8119, 0.8119, 0.8119]
Iteration  186: [0.8056, 0.8056, 0.8056]
Iteration  187: [0.7963, 0.7963, 0.7963]
Iteration  188: [0.7884, 0.7884, 0.7884]
Iteration  189: [0.7799, 0.7799, 0.7799]
Iteration  190: [0.7702, 0.7702, 0.7702]
Iteration  191: [0.7619, 0.7619, 0.7619]
Iteration  192: [0.7538, 0.7538, 0.7538]
Iteration  193: [0.7446, 0.7446, 0.7446]
Iteration  194: [0.7372, 0.7372, 0.7372]
Iteration  195: [0.7309, 0.7309, 0.7309]
Iteration  196: [0.7260, 0.7260, 0.7260]
Iteration  197: [0.7197, 0.7197, 0.7197]
Iteration  198: [0.7095, 0.7095, 0.7095]
Iteration  199: [0.7006, 0.7006, 0.7006]
Iteration  200: [0.6941, 0.6941, 0.6941]
Iteration  201: [0.6861, 0.6861, 0.6861]
Iteration  202: [0.6797, 0.6797, 0.6797]
Iteration  203: [0.6744, 0.6744, 0.6744]
Iteration  204: [0.6669, 0.6669, 0.6669]
Iteration  205: [0.6601, 0.6601, 0.6601]
Iteration  206: [0.6537, 0.6537, 0.6537]
Iteration  207: [0.6470, 0.6470, 0.6470]
Iteration  208: [0.6404, 0.6404, 0.6404]
Iteration  209: [0.6339, 0.6339, 0.6339]
Iteration  210: [0.6265, 0.6265, 0.6265]
Iteration  211: [0.6196, 0.6196, 0.6196]
Iteration  212: [0.6123, 0.6123, 0.6123]
Iteration  213: [0.6068, 0.6068, 0.6068]
Iteration  214: [0.5990, 0.5990, 0.5990]
Iteration  215: [0.5939, 0.5939, 0.5939]
Iteration  216: [0.5883, 0.5883, 0.5883]
Iteration  217: [0.5853, 0.5853, 0.5853]
Iteration  218: [0.5833, 0.5833, 0.5833]
Iteration  219: [0.5785, 0.5785, 0.5785]
Iteration  220: [0.5734, 0.5734, 0.5734]
Iteration  221: [0.5688, 0.5688, 0.5688]
Iteration  222: [0.5659, 0.5659, 0.5659]
Iteration  223: [0.5616, 0.5616, 0.5616]
Iteration  224: [0.5551, 0.5551, 0.5551]
Iteration  225: [0.5496, 0.5496, 0.5496]
Iteration  226: [0.5431, 0.5431, 0.5431]
Iteration  227: [0.5415, 0.5415, 0.5415]
Iteration  228: [0.5364, 0.5364, 0.5364]
Iteration  229: [0.5360, 0.5360, 0.5360]
Iteration  230: [0.5332, 0.5332, 0.5332]
Iteration  231: [0.5298, 0.5298, 0.5298]
Iteration  232: [0.5261, 0.5261, 0.5261]
Iteration  233: [0.5206, 0.5206, 0.5206]
Iteration  234: [0.5225, 0.5225, 0.5225]
Iteration  235: [0.5221, 0.5221, 0.5221]
Iteration  236: [0.5191, 0.5191, 0.5191]
Iteration  237: [0.5180, 0.5180, 0.5180]
Iteration  238: [0.5144, 0.5144, 0.5144]
Iteration  239: [0.5144, 0.5144, 0.5144]
Iteration  240: [0.5104, 0.5104, 0.5104]
Iteration  241: [0.5093, 0.5093, 0.5093]
Iteration  242: [0.5113, 0.5113, 0.5113]
Iteration  243: [0.5139, 0.5139, 0.5139]
Iteration  244: [0.5158, 0.5158, 0.5158]
Iteration  245: [0.5158, 0.5158, 0.5158]
Iteration  246: [0.5126, 0.5126, 0.5126]
Iteration  247: [0.5098, 0.5098, 0.5098]
Iteration  248: [0.5133, 0.5133, 0.5133]
Iteration  249: [0.5122, 0.5122, 0.5122]
Iteration  250: [0.5130, 0.5130, 0.5130]
Iteration  251: [0.5086, 0.5086, 0.5086]
Iteration  252: [0.5109, 0.5109, 0.5109]
Iteration  253: [0.5101, 0.5101, 0.5101]
Iteration  254: [0.5097, 0.5097, 0.5097]
Iteration  255: [0.5053, 0.5053, 0.5053]
Iteration  256: [0.5048, 0.5048, 0.5048]
Iteration  257: [0.5016, 0.5016, 0.5016]
Iteration  258: [0.5000, 0.5000, 0.5000]
Iteration  259: [0.5015, 0.5015, 0.5015]
Iteration  260: [0.5012, 0.5012, 0.5012]
Iteration  261: [0.5036, 0.5036, 0.5036]
Iteration  262: [0.5040, 0.5040, 0.5040]
Iteration  263: [0.5043, 0.5043, 0.5043]
Iteration  264: [0.5010, 0.5010, 0.5010]
Iteration  265: [0.4985, 0.4985, 0.4985]
Iteration  266: [0.4985, 0.4985, 0.4985]
Iteration  267: [0.4997, 0.4997, 0.4997]
Iteration  268: [0.5004, 0.5004, 0.5004]
Iteration  269: [0.5004, 0.5004, 0.5004]
Iteration  270: [0.4984, 0.4984, 0.4984]
Iteration  271: [0.4969, 0.4969, 0.4969]
Iteration  272: [0.4982, 0.4982, 0.4982]
Iteration  273: [0.4951, 0.4951, 0.4951]
Iteration  274: [0.4963, 0.4963, 0.4963]
Iteration  275: [0.4978, 0.4978, 0.4978]
Iteration  276: [0.4989, 0.4989, 0.4989]
Iteration  277: [0.4968, 0.4968, 0.4968]
Iteration  278: [0.4997, 0.4997, 0.4997]
Iteration  279: [0.4997, 0.4997, 0.4997]
Iteration  280: [0.5016, 0.5016, 0.5016]
Iteration  281: [0.4959, 0.4959, 0.4959]
Iteration  282: [0.4961, 0.4961, 0.4961]
Iteration  283: [0.4943, 0.4943, 0.4943]
Iteration  284: [0.4940, 0.4940, 0.4940]
Iteration  285: [0.4948, 0.4948, 0.4948]
Iteration  286: [0.4964, 0.4964, 0.4964]
Iteration  287: [0.4971, 0.4971, 0.4971]
Iteration  288: [0.4981, 0.4981, 0.4981]
Iteration  289: [0.4955, 0.4955, 0.4955]
Iteration  290: [0.4975, 0.4975, 0.4975]
Iteration  291: [0.4999, 0.4999, 0.4999]
Iteration  292: [0.5013, 0.5013, 0.5013]
Iteration  293: [0.5015, 0.5015, 0.5015]
Iteration  294: [0.5050, 0.5050, 0.5050]
Iteration  295: [0.5044, 0.5044, 0.5044]
Iteration  296: [0.4995, 0.4995, 0.4995]
Iteration  297: [0.5009, 0.5009, 0.5009]
Iteration  298: [0.5019, 0.5019, 0.5019]
Iteration  299: [0.5008, 0.5008, 0.5008]
Iteration  300: [0.5020, 0.5020, 0.5020]

In [42]:
def plot_weights(ws):
    ax = plt.plot(ws);
    plt.xlabel('Iteration')
    plt.ylabel('Weight');

In [43]:
plot_weights(ws)



In [44]:
ws = run(no_iterations, verbose=False)
plot_weights(ws)



In [45]:
ws = run(no_iterations, verbose=False)
plot_weights(ws)