-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathGradientDescent.nb
7817 lines (7675 loc) · 409 KB
/
GradientDescent.nb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
(* Content-type: application/vnd.wolfram.mathematica *)
(*** Wolfram Notebook File ***)
(* http://www.wolfram.com/nb *)
(* CreatedBy='Mathematica 10.3' *)
(*CacheID: 234*)
(* Internal cache information:
NotebookFileLineBreakTest
NotebookFileLineBreakTest
NotebookDataPosition[ 158, 7]
NotebookDataLength[ 418757, 7808]
NotebookOptionsPosition[ 413943, 7642]
NotebookOutlinePosition[ 414304, 7658]
CellTagsIndexPosition[ 414261, 7655]
WindowFrame->Normal*)
(* Beginning of Notebook Content *)
Notebook[{
Cell[CellGroupData[{
Cell["Introduction to Machine Learning: Gradient Descent", "Title",
CellChangeTimes->{{3.727023377049157*^9, 3.727023389396599*^9}}],
Cell["\<\
This notebook will walk through implementing gradient descent from scratch. \
We will use this to fit a line to data, such that we only have two parameters \
to learn. Extending to more dimensions is easy, but hard to visualize.\
\>", "Text",
CellChangeTimes->{{3.727023392493475*^9, 3.727023465118483*^9}}],
Cell[CellGroupData[{
Cell["Generate the Data", "Section",
CellChangeTimes->{{3.7270234820354643`*^9, 3.7270234854355783`*^9}}],
Cell[CellGroupData[{
Cell["Create", "Subsection",
CellChangeTimes->{{3.727023724246903*^9, 3.7270237254926147`*^9}}],
Cell["\<\
The data will consist of (x,y) pairs. The range of x will be from 0 to 10.\
\>", "Text",
CellChangeTimes->{{3.727023492326118*^9, 3.727023535066783*^9}}],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"XData", " ", "=", " ",
RowBox[{"Table", "[",
RowBox[{"i", ",",
RowBox[{"{",
RowBox[{"i", ",", "0", ",", "10"}], "}"}]}], "]"}]}]], "Input",
CellChangeTimes->{{3.726838455793324*^9, 3.726838475011786*^9}}],
Cell[BoxData[
RowBox[{"{",
RowBox[{
"0", ",", "1", ",", "2", ",", "3", ",", "4", ",", "5", ",", "6", ",", "7",
",", "8", ",", "9", ",", "10"}], "}"}]], "Output",
CellChangeTimes->{
3.726838475914364*^9, {3.726843608336453*^9, 3.726843613576767*^9},
3.727023666451951*^9}]
}, Open ]],
Cell["\<\
We then will pick the y values to follow the equation y(x) = 8 - 0.8 x. \
However, we add a little noise so that the line is not perfect.\
\>", "Text",
CellChangeTimes->{{3.727023539924862*^9, 3.727023590814786*^9}}],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"YData", " ", "=", " ",
RowBox[{"Table", "[",
RowBox[{
RowBox[{
RowBox[{"(",
RowBox[{"1", "+",
RowBox[{
RowBox[{"RandomVariate", "[",
RowBox[{"NormalDistribution", "[", "]"}], "]"}], "/", "10"}]}],
")"}], "*",
RowBox[{"(",
RowBox[{"8", "-",
RowBox[{"0.8",
RowBox[{"XData", "[",
RowBox[{"[", "i", "]"}], "]"}]}]}], ")"}]}], ",", " ",
RowBox[{"{",
RowBox[{"i", ",", "1", ",",
RowBox[{"Length", "[", "XData", "]"}]}], "}"}]}], "]"}]}]], "Input",
CellChangeTimes->{{3.72683847803689*^9, 3.726838513555543*^9}, {
3.726838796433177*^9, 3.726838826230307*^9}, {3.7268389085286083`*^9,
3.726838933106207*^9}}],
Cell[BoxData[
RowBox[{"{",
RowBox[{
"7.350860695971188`", ",", "7.156021144466463`", ",", "6.416683325771835`",
",", "5.90649737226585`", ",", "4.700570725073088`", ",",
"4.41449335904084`", ",", "2.7089321310719283`", ",",
"2.6343895747493944`", ",", "1.7671031513224082`", ",",
"0.7546681604339667`", ",", "0.`"}], "}"}]], "Output",
CellChangeTimes->{3.7270236681860037`*^9}]
}, Open ]],
Cell["Now combine the x and y columns into (x,y) pairs", "Text",
CellChangeTimes->{{3.726855262557066*^9, 3.726855262566296*^9}, {
3.727023595681378*^9, 3.727023613134757*^9}}],
Cell[CellGroupData[{
Cell[BoxData[{
RowBox[{
RowBox[{"pData", "=",
RowBox[{"Table", "[",
RowBox[{
RowBox[{"{",
RowBox[{
RowBox[{"XData", "[",
RowBox[{"[", "i", "]"}], "]"}], ",",
RowBox[{"YData", "[",
RowBox[{"[", "i", "]"}], "]"}]}], "}"}], ",",
RowBox[{"{",
RowBox[{"i", ",", "1", ",",
RowBox[{"Length", "[", "XData", "]"}]}], "}"}]}], "]"}]}],
";"}], "\[IndentingNewLine]",
RowBox[{"pData", "//", "TableForm"}]}], "Input",
CellChangeTimes->{{3.7268390374334707`*^9, 3.7268390540427227`*^9}, {
3.7270236728013153`*^9, 3.727023676259429*^9}}],
Cell[BoxData[
TagBox[GridBox[{
{"0", "7.350860695971188`"},
{"1", "7.156021144466463`"},
{"2", "6.416683325771835`"},
{"3", "5.90649737226585`"},
{"4", "4.700570725073088`"},
{"5", "4.41449335904084`"},
{"6", "2.7089321310719283`"},
{"7", "2.6343895747493944`"},
{"8", "1.7671031513224082`"},
{"9", "0.7546681604339667`"},
{"10", "0.`"}
},
GridBoxAlignment->{
"Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}},
"RowsIndexed" -> {}},
GridBoxSpacings->{"Columns" -> {
Offset[0.27999999999999997`], {
Offset[2.0999999999999996`]},
Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> {
Offset[0.2], {
Offset[0.4]},
Offset[0.2]}, "RowsIndexed" -> {}}],
Function[BoxForm`e$,
TableForm[BoxForm`e$]]]], "Output",
CellChangeTimes->{
3.726839055085923*^9, {3.726843610832975*^9, 3.726843615293051*^9},
3.7270236767906303`*^9}]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Visualize", "Subsection",
CellChangeTimes->{{3.727023713250536*^9, 3.727023714622445*^9}}],
Cell["\<\
Now plot the data so that we can see what we are trying to fit\
\>", "Text",
CellChangeTimes->{{3.7270237296549473`*^9, 3.727023741381454*^9}}],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"DataPlot", " ", "=", " ",
RowBox[{"ListPlot", "[",
RowBox[{"pData", ",", "\[IndentingNewLine]",
RowBox[{"BaseStyle", "\[Rule]",
RowBox[{"FontSize", "\[Rule]", "14"}]}], ",", "\[IndentingNewLine]",
RowBox[{"Frame", "\[Rule]", "True"}], ",", "\[IndentingNewLine]",
RowBox[{"FrameStyle", "\[Rule]", "Black"}], ",", "\[IndentingNewLine]",
RowBox[{"PlotRange", "\[Rule]",
RowBox[{"{",
RowBox[{
RowBox[{"{",
RowBox[{
RowBox[{"-", "0.5"}], ",", "10.5"}], "}"}], ",",
RowBox[{"{",
RowBox[{
RowBox[{"-", "0.5"}], ",", "10"}], "}"}]}], "}"}]}], ",",
"\[IndentingNewLine]",
RowBox[{"AspectRatio", "\[Rule]", "1"}], ",", "\[IndentingNewLine]",
RowBox[{"PlotStyle", "\[Rule]",
RowBox[{"{",
RowBox[{"Black", ",",
RowBox[{"PointSize", "[", "Large", "]"}]}], "}"}]}], ",",
"\[IndentingNewLine]",
RowBox[{"FrameLabel", "\[Rule]",
RowBox[{"{",
RowBox[{"\"\<Time [s]\>\"", ",", " ", "\"\<Distance [m]\>\""}], "}"}]}],
",", "\[IndentingNewLine]",
RowBox[{"ImageSize", "\[Rule]",
RowBox[{"{",
RowBox[{"200", ",", "200"}], "}"}]}]}], "\[IndentingNewLine]",
"]"}]}]], "Input",
CellChangeTimes->{{3.726838939593025*^9, 3.726838947120015*^9}, {
3.726839058353323*^9, 3.726839088329007*^9}, {3.726839137109939*^9,
3.726839159659185*^9}, {3.7268393670354033`*^9, 3.7268395064341173`*^9}, {
3.726839682715858*^9, 3.726839712298628*^9}, {3.72702415350686*^9,
3.72702415603643*^9}}],
Cell[BoxData[
GraphicsBox[{{}, {{},
{GrayLevel[0], PointSize[Large], AbsoluteThickness[1.6],
StyleBox[
PointBox[{{0., 7.350860695971188}, {1., 7.156021144466463}, {2.,
6.416683325771835}, {3., 5.90649737226585}, {4., 4.700570725073088}, {
5., 4.41449335904084}, {6., 2.7089321310719283`}, {7.,
2.6343895747493944`}, {8., 1.7671031513224082`}, {9.,
0.7546681604339667}, {10., 0.}}],
FontSize->14]}, {}}, {}},
AspectRatio->1,
Axes->{True, True},
AxesLabel->{None, None},
AxesOrigin->{0, 0},
BaseStyle->(FontSize -> 14),
DisplayFunction->Identity,
Frame->{{True, True}, {True, True}},
FrameLabel->{{
FormBox["\"Distance [m]\"", TraditionalForm], None}, {
FormBox["\"Time [s]\"", TraditionalForm], None}},
FrameStyle->GrayLevel[0],
FrameTicks->{{Automatic, Automatic}, {Automatic, Automatic}},
GridLines->{None, None},
GridLinesStyle->Directive[
GrayLevel[0.5, 0.4]],
ImageSize->{200, 200},
Method->{},
PlotRange->{{-0.5, 10.5}, {-0.5, 10}},
PlotRangeClipping->True,
PlotRangePadding->{{0, 0}, {0, 0}},
Ticks->{Automatic, Automatic}]], "Output",
CellChangeTimes->{
3.726838947707398*^9, 3.726839059050662*^9, 3.7268393963812304`*^9, {
3.726839438367628*^9, 3.726839453407558*^9}, {3.726839492902062*^9,
3.726839506758259*^9}, {3.726839690690487*^9, 3.7268397130267963`*^9}, {
3.726843611922104*^9, 3.7268436160559072`*^9}, 3.727023746292783*^9,
3.72702415874879*^9}]
}, Open ]]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Function definitions", "Section",
CellChangeTimes->{{3.727023760507868*^9, 3.727023764018993*^9}}],
Cell[CellGroupData[{
Cell["Our prediction", "Subsection",
CellChangeTimes->{{3.727023958435637*^9, 3.727023961728013*^9}}],
Cell[TextData[{
"First we have to define a function that we think may fit the data. In this \
case, it looks like a line should do. The we will use the standard form of ",
Cell[BoxData[
FormBox[
RowBox[{"y", " ", "=", " ",
RowBox[{
RowBox[{"m", "*", "x"}], " ", "+", "b"}]}], TraditionalForm]],
FormatType->"TraditionalForm"],
", and define ",
Cell[BoxData[
FormBox["m", TraditionalForm]],
FormatType->"TraditionalForm"],
" as ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "0"], TraditionalForm]],
FormatType->"TraditionalForm"],
" and ",
Cell[BoxData[
FormBox["b", TraditionalForm]],
FormatType->"TraditionalForm"],
" as ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "1"], TraditionalForm]],
FormatType->"TraditionalForm"],
". Our goal is to learn the values of ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "0"], TraditionalForm]],
FormatType->"TraditionalForm"],
" and ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "1"], TraditionalForm]],
FormatType->"TraditionalForm"],
". For a given x, a0, and a1, we then make a prediction for what the y-value \
should be."
}], "Text",
CellChangeTimes->{{3.727023766880088*^9, 3.727023946183429*^9}, {
3.727024636134604*^9, 3.727024654049952*^9}}],
Cell[BoxData[
RowBox[{
RowBox[{"OurPrediction", "[",
RowBox[{"x_", ",", "a0_", ",", "a1_"}], "]"}], ":=",
RowBox[{"a0", "+",
RowBox[{"a1", "*", "x"}]}]}]], "Input",
CellChangeTimes->{{3.7268397417248*^9, 3.726839791351802*^9}, {
3.727023870089327*^9, 3.7270238747884083`*^9}, {3.72702397622468*^9,
3.727023979440727*^9}}]
}, Open ]],
Cell[CellGroupData[{
Cell["Loss function", "Subsection",
CellChangeTimes->{{3.727023967662188*^9, 3.727023969666318*^9}}],
Cell[CellGroupData[{
Cell["Errors", "Subsubsection",
CellChangeTimes->{{3.727024128252508*^9, 3.727024129104776*^9}}],
Cell[TextData[{
"Once we have our prediction, we need to decide if it fits the data well or \
not. Make a function that for a given ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "0"], TraditionalForm]],
FormatType->"TraditionalForm"],
" and ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "1"], TraditionalForm]],
FormatType->"TraditionalForm"],
" will scan through each of the given x-values and subtract the TRUE y-value \
from our prediction"
}], "Text",
CellChangeTimes->{{3.727023986002686*^9, 3.727024079535062*^9}}],
Cell[BoxData[
RowBox[{
RowBox[{"Errors", "[",
RowBox[{"a0_", ",", "a1_"}], "]"}], ":=",
RowBox[{"Table", "[",
RowBox[{
RowBox[{
RowBox[{"YData", "[",
RowBox[{"[", "i", "]"}], "]"}], "-",
RowBox[{"OurPrediction", "[",
RowBox[{
RowBox[{"XData", "[",
RowBox[{"[", "i", "]"}], "]"}], ",", "a0", ",", "a1"}], "]"}]}], ",",
RowBox[{"{",
RowBox[{"i", ",", "1", ",",
RowBox[{"Length", "[", "XData", "]"}]}], "}"}]}], "]"}]}]], "Input",
CellChangeTimes->{{3.726839796026537*^9, 3.7268398962074966`*^9},
3.727024085668895*^9}],
Cell["\<\
Lets see if that worked. Plot a test prediction versus the data.\
\>", "Text",
CellChangeTimes->{{3.727024114232161*^9, 3.727024165603283*^9},
3.72702452993184*^9}],
Cell[BoxData[
RowBox[{
RowBox[{"testa0", "=", "1"}], ";",
RowBox[{"testa1", "=", "2"}], ";"}]], "Input",
CellChangeTimes->{{3.7270241792357483`*^9, 3.727024187902101*^9}}],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"Show", "[",
RowBox[{"DataPlot", ",", "\[IndentingNewLine]",
RowBox[{"Plot", "[",
RowBox[{
RowBox[{"OurPrediction", "[",
RowBox[{"x", ",", "testa0", ",", "testa1"}], "]"}], ",",
RowBox[{"{",
RowBox[{"x", ",", "0", ",", "10"}], "}"}]}], "]"}]}],
"\[IndentingNewLine]", "]"}]], "Input",
CellChangeTimes->{{3.727024168315853*^9, 3.7270242106085873`*^9}}],
Cell[BoxData[
GraphicsBox[{{{}, {{},
{GrayLevel[0], PointSize[Large], AbsoluteThickness[1.6],
StyleBox[
PointBox[{{0., 7.350860695971188}, {1., 7.156021144466463}, {2.,
6.416683325771835}, {3., 5.90649737226585}, {4., 4.700570725073088}, {
5., 4.41449335904084}, {6., 2.7089321310719283`}, {7.,
2.6343895747493944`}, {8., 1.7671031513224082`}, {9.,
0.7546681604339667}, {10., 0.}}],
FontSize->14]}, {}}, {}}, {{}, {},
{RGBColor[0.368417, 0.506779, 0.709798], AbsoluteThickness[1.6], Opacity[
1.], LineBox[CompressedData["
1:eJwt0v9T03UcwPERgihIjS9jm2MbexPi+NLG3nLgFe+XeTEQsLI4ErxgshmW
uBO8zC8HIgaBQOiuOAMyiTw7j3mnVoBFO0cng40r0SjT80SBhFEfnCDSYOnx
+uF5j3/gGbHduMXwHI/Hy3raM1vLtvuq9cdSxL2NxTwex77Mda7Pke9kec8Q
cezPrNoSuXw/awkZBUjg2D7t1kAfeQ2TGpJDDus5ltoL2x7LTjKF70i3p49j
HUdoJSf7lsWkafw8x6fZXZ1ZMCXrYi/bb7QtEBc7+OYHBZMyG8u/Lv5jXjvL
Vjxptu2Kv8mOuh36xLAFtudKeZ2z5B5LustSP+zygvh202+XzA9Y2DVbUe7w
MhjdXCS5k8SxJf2gSVwVfrrAxZb0h+SSzvPe9lm2ZCBYh5vfMK6ZZyOTWWd/
COaDum4xRZi+wISp5bK69iDQjq2/o8rhoSEwHvf9a4+cXmgoHHTXaH484I2G
wXL+3zvfVvqgIvBx+Gj9f/JFxfDfYMeuE3v8UAmM5phFUulKVAobPtld3Nfh
j8rgs8XOFRvzV8Gm8ltHT5+XQ57EmnnLFQjxDbqof/ZHQIAlxqnIfgFVgGFd
28zWWD5KYF/ZR1vkM3yUwMcTpqHBwSA0EjKVz58N+CIYfRHqOxItmboQNAr6
3/ravTc5FF0DFoexLtZbgEbDhfcrwH5bgEaDNIMl7b4Uhq6FjZ5tlacOCVEl
6H//+WFntgiNgZSKI9/p5GI0Fk4Ypy8HjIvRWBg5/M3YqZ7VaBxMGrr0V6ol
aDxwxUHLHbpw9CUwpw+4d8RJYbjdUHZRoIKxIlWi94wUSqmwueKACsTnbpqq
HTKoz56yWcdUUFlQ0ubIkKNqeOwW1Wd0yVE1RF9uOtkfGYEmwLrCX17n10Sg
CWBpCRXaZyLQBIi2hNZuzlOgGsjycYZf61GgGuD+um+1KQlKwdhSH1zzKUEp
2L0i/910nKAUlO919weYCErhvnq8ovFzglJ45ypwTa0EpfDqQ5f9zDmCUhCk
5Vb1XiUohdIOTldlIyiFX4OqX0kbICiFY7cvPhoYJCgFXumqwqEbBKUw0Wph
I/cISkHrnbO6fZSgFNqLpmYN4wSlkK8Rmx9MEJTC9b5SyfQ0QSmo41fOXXAR
lEKD6auhvU8/XZJC+ruO2rk5glI4Yy3c0T1PUArL1s5vOOQmKAVdQ2N4yiJB
KfS4op54PASl8D9Xmyzq
"]]}}},
AspectRatio->1,
Axes->{True, True},
AxesLabel->{None, None},
AxesOrigin->{0, 0},
BaseStyle->(FontSize -> 14),
DisplayFunction->Identity,
Frame->{{True, True}, {True, True}},
FrameLabel->{{
FormBox["\"Distance [m]\"", TraditionalForm], None}, {
FormBox["\"Time [s]\"", TraditionalForm], None}},
FrameStyle->GrayLevel[0],
FrameTicks->{{Automatic, Automatic}, {Automatic, Automatic}},
GridLines->{None, None},
GridLinesStyle->Directive[
GrayLevel[0.5, 0.4]],
ImageSize->{200, 200},
Method->{},
PlotRange->{{-0.5, 10.5}, {-0.5, 10}},
PlotRangeClipping->True,
PlotRangePadding->{{0, 0}, {0, 0}},
Ticks->{Automatic, Automatic}]], "Output",
CellChangeTimes->{3.727024211183609*^9}]
}, Open ]],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"Errors", "[",
RowBox[{"testa0", ",", "testa1"}], "]"}]], "Input",
CellChangeTimes->{{3.726839900430717*^9, 3.726839901487084*^9}, {
3.727024220278689*^9, 3.727024224288786*^9}}],
Cell[BoxData[
RowBox[{"{",
RowBox[{
"6.350860695971188`", ",", "4.156021144466463`", ",", "1.4166833257718352`",
",",
RowBox[{"-", "1.09350262773415`"}], ",",
RowBox[{"-", "4.299429274926912`"}], ",",
RowBox[{"-", "6.58550664095916`"}], ",",
RowBox[{"-", "10.29106786892807`"}], ",",
RowBox[{"-", "12.365610425250605`"}], ",",
RowBox[{"-", "15.232896848677592`"}], ",",
RowBox[{"-", "18.245331839566035`"}], ",",
RowBox[{"-", "21.`"}]}], "}"}]], "Output",
CellChangeTimes->{3.7268399021126213`*^9, 3.726843619840543*^9,
3.727024225252613*^9}]
}, Open ]],
Cell[TextData[{
"Note that this is only a function of ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "0"], TraditionalForm]],
FormatType->"TraditionalForm"],
" and ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "1"], TraditionalForm]],
FormatType->"TraditionalForm"],
"."
}], "Text",
CellChangeTimes->{{3.7270245400990343`*^9, 3.727024552865519*^9}}]
}, Open ]],
Cell[CellGroupData[{
Cell["Mean squared error", "Subsubsection",
CellChangeTimes->{{3.72702426489797*^9, 3.727024273140615*^9}}],
Cell[TextData[{
"By putting a positive slope, we see that some of the errors are positive \
and some are negative. How do we decide if the fit is good or not? If we take \
the mean of these numbers, the positive and negative will cancel out. That \
doesn\[CloseCurlyQuote]t seem good! Having a big negative error and big \
positive error should not be as good as having small errors. To fix this, \
lets take the square of all of the errors and then take the mean. We can then \
look to find ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "0"], TraditionalForm]],
FormatType->"TraditionalForm"],
" and ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "1"], TraditionalForm]],
FormatType->"TraditionalForm"],
" which give us the smallest mean squared error."
}], "Text",
CellChangeTimes->{{3.727024235543025*^9, 3.727024295777137*^9}, {
3.7270243437995987`*^9, 3.727024438009878*^9}}],
Cell[BoxData[
RowBox[{
RowBox[{"MeanSquaredError", " ", "[",
RowBox[{"a0_", ",", "a1_"}], "]"}], ":=", " ",
RowBox[{
FractionBox["1",
RowBox[{"Length", "[", "XData", "]"}]], "*",
RowBox[{"Sum", "[",
RowBox[{
RowBox[{
RowBox[{
RowBox[{"Errors", "[",
RowBox[{"a0", ",", "a1"}], "]"}], "[",
RowBox[{"[", "i", "]"}], "]"}], "^", "2"}], ",",
RowBox[{"{",
RowBox[{"i", ",", "1", ",",
RowBox[{"Length", "[", "XData", "]"}]}], "}"}]}], "]"}]}]}]], "Input",
CellChangeTimes->{{3.726839929786456*^9, 3.726839980280221*^9}, {
3.726840040714808*^9, 3.726840043938142*^9}}],
Cell[TextData[{
"Note that we have summed over all of the actual data points, so this is \
only a function of ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "0"], TraditionalForm]],
FormatType->"TraditionalForm"],
" and ",
Cell[BoxData[
FormBox[
SubscriptBox["a", "1"], TraditionalForm]],
FormatType->"TraditionalForm"],
". Now lets make a plot to visualize how the score (the mean squared error) \
changes over a range of the parameters. We know the answer should be around \
",
Cell[BoxData[
FormBox[
RowBox[{
SubscriptBox["a", "0"], "=", " ",
RowBox[{"-", "0.8"}]}], TraditionalForm]],
FormatType->"TraditionalForm"],
" and ",
Cell[BoxData[
FormBox[
RowBox[{
SubscriptBox["a", "1"], " ", "=", " ", "8"}], TraditionalForm]],
FormatType->"TraditionalForm"],
"."
}], "Text",
CellChangeTimes->{{3.7270244708765574`*^9, 3.727024513389835*^9}, {
3.727024563456564*^9, 3.727024618610141*^9}, {3.7270246644725*^9,
3.727024684192505*^9}}],
Cell[CellGroupData[{
Cell[BoxData[
RowBox[{"ContourPlot", "[",
RowBox[{
RowBox[{"MeanSquaredError", " ", "[",
RowBox[{"a0", ",", "a1"}], "]"}], ",", "\[IndentingNewLine]",
RowBox[{"{",
RowBox[{"a0", ",", "0", ",", "20"}], "}"}], ",",
RowBox[{"{",
RowBox[{"a1", ",",
RowBox[{"-", "2"}], ",", "2"}], "}"}], ",", "\[IndentingNewLine]",
RowBox[{"PlotRange", "\[Rule]",
RowBox[{"{",
RowBox[{
RowBox[{"{",
RowBox[{"0", ",", "20"}], "}"}], ",",
RowBox[{"{",
RowBox[{
RowBox[{"-", "2"}], ",", "2"}], "}"}], ",", "All"}], "}"}]}], ",",
"\[IndentingNewLine]",
RowBox[{"Contours", "\[Rule]",
RowBox[{"{",
RowBox[{
"1", ",", "2", ",", " ", "5", ",", "10", ",", "20", ",", "50", ",",
"100", ",", "200", ",", "500", ",", "1000"}], "}"}]}], ",",
"\[IndentingNewLine]",
RowBox[{"ContourShading", "\[Rule]", "Automatic"}], ",",
"\[IndentingNewLine]",
RowBox[{"ContourLabels", "\[Rule]",
RowBox[{"(",
RowBox[{
RowBox[{"Text", "[",
RowBox[{
RowBox[{"Framed", "[", "#3", "]"}], ",",
RowBox[{"{",
RowBox[{"#1", ",", "#2"}], "}"}], ",",
RowBox[{"Background", "\[Rule]", "White"}]}], "]"}], "&"}], ")"}]}],
",", "\[IndentingNewLine]",
RowBox[{"BaseStyle", "\[Rule]",
RowBox[{"FontSize", "\[Rule]", "14"}]}], ",", "\[IndentingNewLine]",
RowBox[{"Frame", "\[Rule]", "True"}], ",", "\[IndentingNewLine]",
RowBox[{"FrameStyle", "\[Rule]", "Black"}], ",", "\[IndentingNewLine]",
RowBox[{"PlotRange", "\[Rule]",
RowBox[{"{",
RowBox[{
RowBox[{"{",
RowBox[{
RowBox[{"-", "0.5"}], ",", "10.5"}], "}"}], ",",
RowBox[{"{",
RowBox[{
RowBox[{"-", "0.5"}], ",", "10"}], "}"}]}], "}"}]}], ",",
"\[IndentingNewLine]",
RowBox[{"AspectRatio", "\[Rule]", "1"}], ",", "\[IndentingNewLine]",
RowBox[{"ImageSize", "\[Rule]", "Medium"}], ",", "\[IndentingNewLine]",
RowBox[{"FrameLabel", "\[Rule]",
RowBox[{"{",
RowBox[{"\"\<a1\>\"", ",", " ", "\"\<a0\>\""}], "}"}]}]}],
"\[IndentingNewLine]", "]"}]], "Input",
CellChangeTimes->{{3.726839999513816*^9, 3.726840025246468*^9}, {
3.7268401457403917`*^9, 3.726840171512847*^9}, {3.726840521417995*^9,
3.726840608888505*^9}, {3.726840797097715*^9, 3.7268409071192617`*^9}, {
3.726840947260976*^9, 3.726840979449635*^9}, {3.72684104898053*^9,
3.7268410716903133`*^9}, {3.72684110489884*^9, 3.726841109557044*^9}, {
3.72684114050735*^9, 3.726841145705799*^9}, {3.72684117972836*^9,
3.7268413008514547`*^9}, {3.726841334342576*^9, 3.726841458849678*^9}, {
3.726841495907673*^9, 3.726841554700822*^9}, {3.7268417644843807`*^9,
3.726841771727962*^9}, {3.726841839694339*^9, 3.726841903951247*^9}, {
3.726854973250864*^9, 3.7268550225308743`*^9}}],
Cell[BoxData[
GraphicsBox[GraphicsComplexBox[CompressedData["
1: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
d+Vu8b9vEvQa+iL4F9V37ST9z0qyPziUjMfo/y3rk9Sf2VvUB72V9UuZ3tDy
AMl+JOwn8cCyf7es38n+z7TcyUT/lP2dZf1T9n+W9VHZvxn8UC2PMrlvl/2Z
qX5nzmT9VPZnpvWdTPRV2b9Z1l9Rjv1M74d0JvdFOO/q9yMl/TfCxH9Z1l9l
f21ZX5T9l2V9VvZnlvVb2X6H/mL8sn1fvq9HOfYjlZcCTfyb6ffDTPybZX1Z
9m+m+qc5k/Vl8Ef1PFeU+KmjkEcwH/J9Gq3vI9FnnfR7vaQv+5v4O8v6tuzv
LOvbsv82tV+9UWT7tWw/RX+xfsA4j7I/s+yPIPszy/q67M8s6+uy/7Ksr8v+
CNCfcb5KyJXwR6b6u7cox/zL+j3KMf+yfo9y7DdZv6fft5P8F5wExvmR/Ytp
uc5Ev5f9iWX9XvYflvV7+b4P9lycB6pfmzGUYzwoR39l/V/2F6b+FnoT/V/2
B5b1f9k/mernDib+urL+L/vvohzrK+v/sv8w9G3QB9m/FuWYD1n/l/1nZf1f
9qel9oQYE/1f9v+l+r1GQ/VxOxN7gOwfS3+vM7EHyP6rsj1A9seFvo75kv1P
ZXuA7D8q2wNkf1iqv2s0wBiPbA8oqSb8Q6m+H25iD0D94uZio4Q+VvzzLX5C
PlSrBZnYc6m+aSfkR5Wf2Ap9B/oDMPgFvX/0k/xZMJ740+CnB4vrHRT8msYT
SPfVLIKp7RYKegZ5A/oC7BnQ76AvqcPUCqzOj1boA9D3qD5kJfRhFdtL96Gl
hP+HOj9Fyqniv6cE3lb8octC/4Q+g/ND/UF0kj1Eb+KfQ+8rdJL86C/KMR/Q
L9V595LsKT6SvOYl3T94Sf4l3qJcPT++Jv4/sj8lylFf/r3sn4ly6G/Ql9X2
XUzsUdTfykWKN3Ol5Qk+VH9OMOr/0B8hf2F/QD/D/sH5QX8pDpDsQwHS/Yle
sp/pJPuFpWQvsjeRz6j/pr34PbDsz0n9dVyFfo/1xflUf1+gUP8CW6r/GzD0
RdAjer41Guo/mSTue+n9P+57i5SWxeWbBL1HfcwH7DegzxQnKbL9ndr3vIX8
h/0JDPpD/cFsxXhwfqj/iZM0fzbMovjvbaE/gx7Q85kl9o/sbyXvL+wftEfk
qTi92L+wZ2B90D8irzPY54qEvYb6A4YLe4U6XsQHGLHa7g8h7+N8wh6D8QHD
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
z0rym0F/J+/rGOgP6DH4rUyfyfuvqUb5B/Mh+9vT92ACGY2H0AsM/gn5Hvoi
7LHAND7bkqnfwfvuFSR/8gqSPBBK/UkN4yf2OcP45Xx3sr8zvf83vgcBTN+j
MxPyA/YHMM4b+AvsoThfOC+wZ9N8WR+EfoX9hP2D/Qf9BPwQ64n9BHpO4gN0
laXzX6BQfbdAIfeHIn+scf/Q9x4CpffKA6R89qVZS3W9BMZ4VLJeSpwfrB/J
95QeQv2jBhYpNJ7Hk77HsNiD5rOJ9RD6ENaHvi9VpEBfRTn6i/6tKf4/u8X3
iH9vuoekb+nZ+3Od9cuaFfF/dicmX03JFfkusJ77zsx3i838Juon/9Qj6Yj+
u5CnB7U/quvxJouPvn6izR8/yprkh9jf9NKItvPzuGXCqCsHtjvS+B7D+DtW
s9dVOZjHa9fp/G+FGHfp974sU//026gOeXzzmgoX9mlCRPnkvKPedeZmi3wM
Y5y0GRb3jfkWvoRkXMsaacyncG9Q27eP6kRJ76tqNP2PuWR8n5LCa9a38K3Y
0Zjf9/Ki20HlXhvzHxyMLX8+Zp4xv8FmXZOzX+5GCNxh1JoVZ0ZlC/2hYbvp
fe7V85Douy/73DX3a0/rl/zPgf2muK4OE+VOjQOfRfasLOjH8X5Dc8emRwoM
ft/q+o4ct8ablDNr+5573MBJyi8UyfYUhEfHfzunVA6c3OKzW1lx/73HMrKG
az3T+P5GVf9rGLIkUdhbvX4L/rv9k4fKu9Od/p6wwkfyR9Wxp02PtPb8NUXY
W3v4jwtq62OM19/wJKzhpOVpSrWnudEp/nrJPzSIle0etvXW2o+KhUf47SO3
TeP1O+oX2qcHwP6k0fyWum/RLadcZZCS3Cqptq04v9k9g9y3e0SZ2KtXH/I/
2L7hV9FewyMW1l9vfxfteZycs/Xlz4XC3tPg22bL9IVGe3Pdg2an/vX4ofRa
Gnh+koG/V1+e/+B4owKee9TN5mq/PGXMpZsVArPy+OTN3Rv1/VvPRqfeiqrT
7gt/un3eR6+R5sz78ZoU22FZPDfscu6b1k6sR4Z+yYXDBvnj8JuOy0p7MP1P
66+5nc7iG25dyng/MIjVNSvUPz6TxX03ftb51Q5h11fEde6WkMWPnO+TlJ0c
we6frrDG2z2b37Ob+OjYjWjGvdKGV/iQxefWv+M6oV6ucjZ/S5yzbRp39v/n
R7v6tqxH1O6T9e6kcWun42Oirjqy2TuthiVr07l7qXinh+EebNZC3dyqFdJ4
x7OJeUUP9KzMu9927BvzkWfpe7Z+tySIVb/0dPHfzz7y2UuP7x5qGc7c56ay
pf+m8QHr7+2d0T+Kje6w0jx0QBof7v3HplNeZVlReOMab/ak8BCNW0LnFU7M
ptzrXyyPJnPzdRViH2f5sebd5rhUGZ7MHcuM6rngkJ6tqx9w4/iVZP7o9qUx
60NDWNthD6bXmZvCrSqcWdi1IILFpdlf6d44hW9KbD5+llWuMqbs8fkjT93j
n+0X7br6tCzbPlX/aMHLe7zjtOs/RvzkxHLG2E9gHRP58/cvelgO92BNtMf+
89t7l3/qOGJ+07sGfaO+c82dbRO5z2mXIRnb/FhE+ecXfacl8slTNa/NYoPY
pU4Vrh6ecp/3K/9h5x8W4WzU9q6lH91J5A9eLXjblUezh48mRv46/T5Pu16t
0omRPmz87Jc/vCYc4EmPzBfuM+zvST12jF8XcpC/jun5anTZEDZ1eP8aj4P2
8MwXA1s9NdCbu+MW2pzsvI+Puzyo7+mNTqyr9cyrMxbeUXYdCHwa292cNT/X
KqXyu1fKyads+mBzD5ZSJ/Rrt36vFJ9jr7vYv/dhLS8/ONN83wflas5vLz2m
m7FeAc839W+fqbx71TVkv96ddal66lodfaaS5zB71P/oU4celxZ1v5qplF72
vKb9h2gWfnP03K+ls5QKRYeOaG7asvdf3EaELM9Tlu1cdLdhMz82NCV4kCPP
Vd54P/jxsGMUO/3+Q/WBEXlKQM+jY35ci2AD2jDrX1p+U+rbaJKOvnFkw+Ka
T65eo0j5ZffORod6eLNJNco8KW2Rwe3L9m315x5v1rXCsvygqAw+4PyEgf2r
ubK24WWna7e85UHh1Y/dnVGaDXkbMI8fvcxda73x+rnAiv1aavab4LUXuNOX
C+b7Uk3fK/4pYoHyMtf4PkVQ9Of+HSt94R6uLQ8e/WR8j/hpxas29X7xZtml
krs9OJLDR60+mvZPL29qDx7ozcL2Hf/lWNMsXuH62Ls/t9Uy9+feTy5mGPWL
J/olX1utz+I3ghb9MTDMoM9enMfPBmfwloO3T8zMCmaBf37f3ee3DO7tu+Z8
pRtG/7mCjpcudP9NJ/Cluq02XP0/+SycPrzY/b6HP7Mek9zC9vQb/iX+w3+T
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