diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/.idea/cs229-2018-autumn.iml b/.idea/cs229-2018-autumn.iml
new file mode 100644
index 0000000..b5ad51a
--- /dev/null
+++ b/.idea/cs229-2018-autumn.iml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..a971a2c
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..5a3a3f2
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Pipfile b/Pipfile
new file mode 100644
index 0000000..58877f8
--- /dev/null
+++ b/Pipfile
@@ -0,0 +1,12 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+
+[dev-packages]
+
+[requires]
+python_version = "3.11"
+python_full_version = "3.11.5"
diff --git a/Pipfile.lock b/Pipfile.lock
new file mode 100644
index 0000000..a552889
--- /dev/null
+++ b/Pipfile.lock
@@ -0,0 +1,21 @@
+{
+ "_meta": {
+ "hash": {
+ "sha256": "ace7e9784a57c9841694abb0b34b2c60c71c5820bbe44603aad915ceb02cba3b"
+ },
+ "pipfile-spec": 6,
+ "requires": {
+ "python_full_version": "3.11.5",
+ "python_version": "3.11"
+ },
+ "sources": [
+ {
+ "name": "pypi",
+ "url": "https://pypi.org/simple",
+ "verify_ssl": true
+ }
+ ]
+ },
+ "default": {},
+ "develop": {}
+}
diff --git a/andrew-ng-machine-learning-yearning-1.pdf b/andrew-ng-machine-learning-yearning-1.pdf
new file mode 100644
index 0000000..7ce771e
Binary files /dev/null and b/andrew-ng-machine-learning-yearning-1.pdf differ
diff --git a/cs229_main_notes.pdf b/cs229_main_notes.pdf
new file mode 100644
index 0000000..cbffe0e
Binary files /dev/null and b/cs229_main_notes.pdf differ
diff --git a/problem-sets/PS1/src/__pycache__/linear_model.cpython-311.pyc b/problem-sets/PS1/src/__pycache__/linear_model.cpython-311.pyc
new file mode 100644
index 0000000..3ce4954
Binary files /dev/null and b/problem-sets/PS1/src/__pycache__/linear_model.cpython-311.pyc differ
diff --git a/problem-sets/PS1/src/__pycache__/p01b_logreg.cpython-311.pyc b/problem-sets/PS1/src/__pycache__/p01b_logreg.cpython-311.pyc
new file mode 100644
index 0000000..59d6d55
Binary files /dev/null and b/problem-sets/PS1/src/__pycache__/p01b_logreg.cpython-311.pyc differ
diff --git a/problem-sets/PS1/src/__pycache__/p01e_gda.cpython-311.pyc b/problem-sets/PS1/src/__pycache__/p01e_gda.cpython-311.pyc
new file mode 100644
index 0000000..a251106
Binary files /dev/null and b/problem-sets/PS1/src/__pycache__/p01e_gda.cpython-311.pyc differ
diff --git a/problem-sets/PS1/src/__pycache__/p02cde_posonly.cpython-311.pyc b/problem-sets/PS1/src/__pycache__/p02cde_posonly.cpython-311.pyc
new file mode 100644
index 0000000..5f31b43
Binary files /dev/null and b/problem-sets/PS1/src/__pycache__/p02cde_posonly.cpython-311.pyc differ
diff --git a/problem-sets/PS1/src/__pycache__/p03d_poisson.cpython-311.pyc b/problem-sets/PS1/src/__pycache__/p03d_poisson.cpython-311.pyc
new file mode 100644
index 0000000..9090506
Binary files /dev/null and b/problem-sets/PS1/src/__pycache__/p03d_poisson.cpython-311.pyc differ
diff --git a/problem-sets/PS1/src/__pycache__/p05b_lwr.cpython-311.pyc b/problem-sets/PS1/src/__pycache__/p05b_lwr.cpython-311.pyc
new file mode 100644
index 0000000..5859921
Binary files /dev/null and b/problem-sets/PS1/src/__pycache__/p05b_lwr.cpython-311.pyc differ
diff --git a/problem-sets/PS1/src/__pycache__/p05c_tau.cpython-311.pyc b/problem-sets/PS1/src/__pycache__/p05c_tau.cpython-311.pyc
new file mode 100644
index 0000000..ebe512d
Binary files /dev/null and b/problem-sets/PS1/src/__pycache__/p05c_tau.cpython-311.pyc differ
diff --git a/problem-sets/PS1/src/__pycache__/util.cpython-311.pyc b/problem-sets/PS1/src/__pycache__/util.cpython-311.pyc
new file mode 100644
index 0000000..52c5ded
Binary files /dev/null and b/problem-sets/PS1/src/__pycache__/util.cpython-311.pyc differ
diff --git a/problem-sets/PS1/src/output/p01b_pred_1.txt b/problem-sets/PS1/src/output/p01b_pred_1.txt
new file mode 100644
index 0000000..2ae9e9f
--- /dev/null
+++ b/problem-sets/PS1/src/output/p01b_pred_1.txt
@@ -0,0 +1,100 @@
+0
+0
+1
+0
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+0
+1
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
diff --git a/problem-sets/PS1/src/output/p01b_pred_1_fig.png b/problem-sets/PS1/src/output/p01b_pred_1_fig.png
new file mode 100644
index 0000000..0efaf6c
Binary files /dev/null and b/problem-sets/PS1/src/output/p01b_pred_1_fig.png differ
diff --git a/problem-sets/PS1/src/output/p01b_pred_2.txt b/problem-sets/PS1/src/output/p01b_pred_2.txt
new file mode 100644
index 0000000..3d909de
--- /dev/null
+++ b/problem-sets/PS1/src/output/p01b_pred_2.txt
@@ -0,0 +1,100 @@
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+1
+1
+1
+1
+0
+0
+1
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
diff --git a/problem-sets/PS1/src/output/p01b_pred_2_fig.png b/problem-sets/PS1/src/output/p01b_pred_2_fig.png
new file mode 100644
index 0000000..e03be85
Binary files /dev/null and b/problem-sets/PS1/src/output/p01b_pred_2_fig.png differ
diff --git a/problem-sets/PS1/src/output/p01e_pred_1.txt b/problem-sets/PS1/src/output/p01e_pred_1.txt
new file mode 100644
index 0000000..b52b6a4
--- /dev/null
+++ b/problem-sets/PS1/src/output/p01e_pred_1.txt
@@ -0,0 +1,100 @@
+0
+1
+1
+0
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+1
+0
+0
+0
+1
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+1
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+1
+1
+0
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+0
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
diff --git a/problem-sets/PS1/src/output/p01e_pred_1_fig.png b/problem-sets/PS1/src/output/p01e_pred_1_fig.png
new file mode 100644
index 0000000..384c615
Binary files /dev/null and b/problem-sets/PS1/src/output/p01e_pred_1_fig.png differ
diff --git a/problem-sets/PS1/src/output/p01e_pred_2.txt b/problem-sets/PS1/src/output/p01e_pred_2.txt
new file mode 100644
index 0000000..3474959
--- /dev/null
+++ b/problem-sets/PS1/src/output/p01e_pred_2.txt
@@ -0,0 +1,100 @@
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+1
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+0
+1
+1
+1
+1
+1
+1
+1
diff --git a/problem-sets/PS1/src/output/p01e_pred_2_fig.png b/problem-sets/PS1/src/output/p01e_pred_2_fig.png
new file mode 100644
index 0000000..d6525a9
Binary files /dev/null and b/problem-sets/PS1/src/output/p01e_pred_2_fig.png differ
diff --git a/problem-sets/PS1/src/output/p02c_pred.txt b/problem-sets/PS1/src/output/p02c_pred.txt
new file mode 100644
index 0000000..c09c26f
--- /dev/null
+++ b/problem-sets/PS1/src/output/p02c_pred.txt
@@ -0,0 +1,124 @@
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
diff --git a/problem-sets/PS1/src/output/p02c_pred_fig.png b/problem-sets/PS1/src/output/p02c_pred_fig.png
new file mode 100644
index 0000000..a28b1ab
Binary files /dev/null and b/problem-sets/PS1/src/output/p02c_pred_fig.png differ
diff --git a/problem-sets/PS1/src/output/p02d_pred.txt b/problem-sets/PS1/src/output/p02d_pred.txt
new file mode 100644
index 0000000..1b5ac46
--- /dev/null
+++ b/problem-sets/PS1/src/output/p02d_pred.txt
@@ -0,0 +1,124 @@
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
diff --git a/problem-sets/PS1/src/output/p02d_pred_fig.png b/problem-sets/PS1/src/output/p02d_pred_fig.png
new file mode 100644
index 0000000..fd151e8
Binary files /dev/null and b/problem-sets/PS1/src/output/p02d_pred_fig.png differ
diff --git a/problem-sets/PS1/src/output/p02e_pred.txt b/problem-sets/PS1/src/output/p02e_pred.txt
new file mode 100644
index 0000000..eac636a
--- /dev/null
+++ b/problem-sets/PS1/src/output/p02e_pred.txt
@@ -0,0 +1,124 @@
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
diff --git a/problem-sets/PS1/src/output/p02e_pred_fig.png b/problem-sets/PS1/src/output/p02e_pred_fig.png
new file mode 100644
index 0000000..ae89396
Binary files /dev/null and b/problem-sets/PS1/src/output/p02e_pred_fig.png differ
diff --git a/problem-sets/PS1/src/output/p02e_pred_fig_1.png b/problem-sets/PS1/src/output/p02e_pred_fig_1.png
new file mode 100644
index 0000000..ae89396
Binary files /dev/null and b/problem-sets/PS1/src/output/p02e_pred_fig_1.png differ
diff --git a/problem-sets/PS1/src/output/p03d_pred.png b/problem-sets/PS1/src/output/p03d_pred.png
new file mode 100644
index 0000000..402b9b9
Binary files /dev/null and b/problem-sets/PS1/src/output/p03d_pred.png differ
diff --git a/problem-sets/PS1/src/output/p03d_pred.txt b/problem-sets/PS1/src/output/p03d_pred.txt
new file mode 100644
index 0000000..194c7b3
--- /dev/null
+++ b/problem-sets/PS1/src/output/p03d_pred.txt
@@ -0,0 +1,250 @@
+12003264
+2829789
+20529119
+1606054
+478442
+5703695
+688683
+482172
+1907501
+113300
+4191018
+496303
+4189573
+1847337
+146316
+1167915
+1589608
+3150062
+407711
+123071
+2117534
+118168
+1183351
+4786955
+578619
+9574643
+409468
+1099053
+1744190
+1470158
+494960
+3468353
+5675723
+24963785
+464990
+14629232
+777239
+1288541
+454136
+10173933
+2684415
+7234900
+459949
+203637
+3452766
+10846761
+6562307
+344402
+994860
+1477492
+1527524
+227820
+4056056
+218431
+2127383
+352285
+5846722
+4573591
+2959514
+696310
+10982719
+4079530
+3984765
+318705
+345636
+2807543
+382816
+13826792
+656840
+905002
+267465
+252442
+344744
+1606482
+799479
+1959872
+854184
+10703286
+1947334
+3753486
+2219174
+7459049
+4391794
+8098473
+3009169
+310023
+432320
+931799
+443265
+1482065
+878622
+2237126
+2913022
+215672
+296807
+196924
+4726978
+1979417
+1152382
+543210
+1659342
+315410
+347054
+5755635
+6788972
+1079980
+2614364
+2729788
+260023
+645603
+6697996
+338730
+8307945
+3906913
+1555440
+760415
+532293
+2419347
+3746725
+1438441
+8532285
+1467622
+3824587
+169928
+723547
+3114875
+261614
+7605320
+1573478
+1603858
+757689
+9450517
+11602140
+181602
+152951
+722889
+11078841
+140525
+208343
+475531
+4299319
+2673348
+265198
+363323
+5172854
+133668
+241212
+3473602
+190455
+156264
+370055
+134228
+239950
+1259402
+8207263
+741507
+9060386
+5472262
+3091917
+10358322
+1973971
+14609190
+5368024
+557239
+1030994
+18353106
+65941
+2302542
+1118548
+4044411
+1156728
+1376943
+3981421
+1278112
+5427722
+5489504
+15065047
+415744
+550852
+2270041
+2108438
+190145
+3336367
+1027416
+8820788
+370236
+33134844
+536961
+27697262
+1132961
+2084020
+3286021
+382745
+1150338
+697008
+510519
+9407013
+305378
+4348929
+313811
+613087
+20712034
+4361454
+73645
+15665937
+442725
+19686345
+5696536
+1225223
+15583928
+1820469
+1797114
+1043652
+472055
+178658
+815098
+15191469
+3139159
+195781
+1226129
+8751685
+8845960
+568142
+334653
+9108577
+180519
+4497334
+271914
+2252843
+1806147
+111596
+132212
+2599369
+6820905
+5020782
+16359535
+360256
+1367486
+257844
+562211
+317155
+958043
+2180602
+654621
+13312049
+5724903
+11601637
+142535
+401299
+3277210
diff --git a/problem-sets/PS1/src/output/p05b_pred_1.png b/problem-sets/PS1/src/output/p05b_pred_1.png
new file mode 100644
index 0000000..5435740
Binary files /dev/null and b/problem-sets/PS1/src/output/p05b_pred_1.png differ
diff --git a/problem-sets/PS1/src/output/p05c_pred_tau_0_03.png b/problem-sets/PS1/src/output/p05c_pred_tau_0_03.png
new file mode 100644
index 0000000..1f887f5
Binary files /dev/null and b/problem-sets/PS1/src/output/p05c_pred_tau_0_03.png differ
diff --git a/problem-sets/PS1/src/output/p05c_pred_tau_0_05.png b/problem-sets/PS1/src/output/p05c_pred_tau_0_05.png
new file mode 100644
index 0000000..79bc946
Binary files /dev/null and b/problem-sets/PS1/src/output/p05c_pred_tau_0_05.png differ
diff --git a/problem-sets/PS1/src/output/p05c_pred_tau_0_1.png b/problem-sets/PS1/src/output/p05c_pred_tau_0_1.png
new file mode 100644
index 0000000..d755da6
Binary files /dev/null and b/problem-sets/PS1/src/output/p05c_pred_tau_0_1.png differ
diff --git a/problem-sets/PS1/src/output/p05c_pred_tau_0_5.png b/problem-sets/PS1/src/output/p05c_pred_tau_0_5.png
new file mode 100644
index 0000000..5435740
Binary files /dev/null and b/problem-sets/PS1/src/output/p05c_pred_tau_0_5.png differ
diff --git a/problem-sets/PS1/src/output/p05c_pred_tau_10_0.png b/problem-sets/PS1/src/output/p05c_pred_tau_10_0.png
new file mode 100644
index 0000000..93963c0
Binary files /dev/null and b/problem-sets/PS1/src/output/p05c_pred_tau_10_0.png differ
diff --git a/problem-sets/PS1/src/output/p05c_pred_tau_1_0.png b/problem-sets/PS1/src/output/p05c_pred_tau_1_0.png
new file mode 100644
index 0000000..a712d68
Binary files /dev/null and b/problem-sets/PS1/src/output/p05c_pred_tau_1_0.png differ
diff --git a/problem-sets/PS1/src/p01b_logreg.py b/problem-sets/PS1/src/p01b_logreg.py
index c79f9bb..1fa03bb 100644
--- a/problem-sets/PS1/src/p01b_logreg.py
+++ b/problem-sets/PS1/src/p01b_logreg.py
@@ -1,5 +1,6 @@
import numpy as np
import util
+import os
from linear_model import LinearModel
@@ -15,6 +16,15 @@ def main(train_path, eval_path, pred_path):
x_train, y_train = util.load_dataset(train_path, add_intercept=True)
# *** START CODE HERE ***
+ model = LogisticRegression()
+ theta = model.fit(x_train, y_train)
+
+ x_test, y_test = util.load_dataset(eval_path, add_intercept=True)
+ fcsts, _ = model.predict(x_test)
+
+ model.write(fcsts, pred_path)
+ fig_path_prefix = pred_path.split(".")[0]
+ util.plot(x_train, y_train, theta, save_path=f"{fig_path_prefix}_fig")
# *** END CODE HERE ***
@@ -35,16 +45,78 @@ def fit(self, x, y):
y: Training example labels. Shape (m,).
"""
# *** START CODE HERE ***
+ tolerance = 10 ** -5
+ change = np.inf
+ max_iters = 15
+ self.theta = np.zeros(np.shape(x)[1])
+ i = 0
+ while change > tolerance and i < max_iters:
+ grad = self.loss_gradient(self.theta, x, y)
+ hess = self.loss_hessian(self.theta, x)
+ h_inv = np.linalg.inv(hess)
+ self.theta = self.theta - h_inv @ grad
+ i += 1
+
+ return self.theta
# *** END CODE HERE ***
def predict(self, x):
"""Make a prediction given new inputs x.
Args:
- x: Inputs of shape (m, n).
+ x: Inputs of shape ((m, n), m).
Returns:
Outputs of shape (m,).
"""
# *** START CODE HERE ***
+ S = self.sigmoid(self.theta, x)
+ fcsts = (S >= 0.5) * 1
+ return fcsts, S
# *** END CODE HERE ***
+
+ def sigmoid(self, theta, X):
+ """Evaluate sigmoid based on the given params and X matrix
+
+ Args:
+ theta: Input of shape (n, 1)
+ X: Input of shape (m, n)
+
+ Returns:
+ Outputs of shape (m, 1)
+ """
+ return 1/(1 + np.exp(-theta @ X.T))
+
+ def loss_gradient(self, theta, X, Y):
+ """Evaluate the logistic loss diff
+
+ Args:
+ theta: Input of shape (n, 1)
+ X: Input of shape (m, n)
+ Y: Input of shape (m, 1)
+ Returns:
+ Outputs of shape (n, 1)
+ """
+ S = self.sigmoid(theta, X)
+ m = len(X[0])
+ grad = (1/m)*(np.sum((S - Y) * X.T, axis=1))
+ return grad
+
+ def loss_hessian(self, theta, X):
+ """Evaluate the logistic loss diff
+
+ Args:
+ theta: Input of shape (n, 1)
+ X: Input of shape (m, n)
+ Y: Input of shape (m, 1)
+ Returns:
+ Outputs of shape (n, 1)
+ """
+ S = self.sigmoid(theta, X)
+ m = len(X[0])
+ return (1/m)*((S*(1 - S) * X.T) @ X)
+
+ def write(self, data, path):
+ dir = os.path.dirname(path)
+ os.makedirs(dir, exist_ok=True)
+ np.savetxt(path, data, fmt="%d", delimiter=",")
\ No newline at end of file
diff --git a/problem-sets/PS1/src/p01e_gda.py b/problem-sets/PS1/src/p01e_gda.py
index 33837ed..fb9a514 100644
--- a/problem-sets/PS1/src/p01e_gda.py
+++ b/problem-sets/PS1/src/p01e_gda.py
@@ -1,5 +1,6 @@
import numpy as np
import util
+import os
from linear_model import LinearModel
@@ -16,6 +17,15 @@ def main(train_path, eval_path, pred_path):
x_train, y_train = util.load_dataset(train_path, add_intercept=False)
# *** START CODE HERE ***
+ model = GDA()
+ theta = model.fit(x_train, y_train)
+
+ x_test, y_test = util.load_dataset(eval_path, add_intercept=True)
+ fcst = model.predict(x_test)
+
+ util.write(fcst, pred_path)
+ fig_path_prefix = pred_path.split(".")[0]
+ util.plot(x_train, y_train, theta, save_path=f"{fig_path_prefix}_fig")
# *** END CODE HERE ***
@@ -39,6 +49,31 @@ def fit(self, x, y):
theta: GDA model parameters.
"""
# *** START CODE HERE ***
+ # get m and n
+ m, n = x.shape[0], x.shape[1]
+
+ # calculate phi
+ phi = np.sum(y) / m
+
+ # calculate mu0 and mu1
+ y0, y1 = y == 0, y == 1
+ num_0, num_1 = np.sum(y0), np.sum(y1)
+ y0, y1 = y0.reshape(len(y0), 1), y1.reshape(len(y1), 1)
+ mu0, mu1 = np.sum(x * y0, axis=0) / num_0, np.sum(x * y1,
+ axis=0) / num_1
+
+ # calculate sigma
+ x_diff = x - (y0 * mu0) - (y1 * mu1)
+ sigma = (1 / m) * x_diff.T @ x_diff
+
+ # calculate thetas
+ sigma_inv = np.linalg.inv(sigma)
+ theta = (mu1 - mu0) @ sigma_inv
+ theta0 = (1 / 2) * (mu0 + mu1) @ sigma_inv @ (
+ mu0 - mu1).T - np.log((1 - phi) / phi)
+
+ self.theta = np.insert(theta, 0, theta0)
+ return self.theta
# *** END CODE HERE ***
def predict(self, x):
@@ -51,4 +86,7 @@ def predict(self, x):
Outputs of shape (m,).
"""
# *** START CODE HERE ***
+ # calculate sigmoid
+ S = 1 / (1 + np.exp(-(x @ self.theta)))
+ return S >= 0.5
# *** END CODE HERE
diff --git a/problem-sets/PS1/src/p02cde_posonly.py b/problem-sets/PS1/src/p02cde_posonly.py
index 87a5a94..4578be0 100644
--- a/problem-sets/PS1/src/p02cde_posonly.py
+++ b/problem-sets/PS1/src/p02cde_posonly.py
@@ -26,10 +26,52 @@ def main(train_path, valid_path, test_path, pred_path):
pred_path_e = pred_path.replace(WILDCARD, 'e')
# *** START CODE HERE ***
+ x_train, t_train = util.load_dataset(train_path, label_col="t", add_intercept=True)
+ x_test, t_test = util.load_dataset(test_path, label_col="t", add_intercept=True)
+
+ x_train, y_train = util.load_dataset(train_path, label_col="y", add_intercept=True)
+ x_test, y_test = util.load_dataset(test_path, label_col="y", add_intercept=True)
+
+ x_valid, y_valid = util.load_dataset(train_path, label_col="y", add_intercept=True)
+
# Part (c): Train and test on true labels
# Make sure to save outputs to pred_path_c
+ logreg_model = LogisticRegression()
+ theta = logreg_model.fit(x_train, t_train)
+ t_fcsts_c, _ = logreg_model.predict(x_test)
+ util.evaluate_classification(t_fcsts_c, t_test, "PS1 p02 (c)")
+ util.write(t_fcsts_c, pred_path_c)
+
+ fig_path_prefix = pred_path_c.split(".")[0]
+ util.plot(x_test, t_test, theta, save_path=f"{fig_path_prefix}_fig")
+
# Part (d): Train on y-labels and test on true labels
# Make sure to save outputs to pred_path_d
+ logreg_model = LogisticRegression()
+ theta = logreg_model.fit(x_train, y_train)
+ t_fcsts_d, _ = logreg_model.predict(x_test)
+ util.evaluate_classification(t_fcsts_d, t_test, "PS1 p02 (d)")
+ util.write(t_fcsts_d, pred_path_d)
+
+ fig_path_prefix = pred_path_d.split(".")[0]
+ util.plot(x_test, t_test, theta, save_path=f"{fig_path_prefix}_fig")
+
# Part (e): Apply correction factor using validation set and test on true labels
# Plot and use np.savetxt to save outputs to pred_path_e
+ pos_examples = np.asarray(y_valid, dtype="int")
+ v_pos_x = x_valid[pos_examples]
+ _, raw_probs = logreg_model.predict(x_valid)
+ a = np.sum(raw_probs)/len(raw_probs)
+ print(f"\n\nalpha = {a}")
+ _, raw_probs = logreg_model.predict(x_test)
+ adjusted_probs = raw_probs/a
+ fcsts = adjusted_probs >= 0.5
+ util.evaluate_classification(fcsts, t_test, "PS1 p02 (e)")
+ util.write(fcsts, pred_path_e)
+
+ fig_path_prefix = pred_path_e.split(".")[0]
+ util.plot(x_test, t_test, theta, save_path=f"{fig_path_prefix}_fig",
+ correction=-np.log((2/a) - 1)/theta[2])
+ # util.plot(x_test, t_test, theta, save_path=f"{fig_path_prefix}_fig",
+ # correction=a)
# *** END CODER HERE
diff --git a/problem-sets/PS1/src/p03d_poisson.py b/problem-sets/PS1/src/p03d_poisson.py
index 3c58214..33c6ce6 100644
--- a/problem-sets/PS1/src/p03d_poisson.py
+++ b/problem-sets/PS1/src/p03d_poisson.py
@@ -1,5 +1,6 @@
import numpy as np
import util
+import matplotlib.pyplot as plt
from linear_model import LinearModel
@@ -19,6 +20,17 @@ def main(lr, train_path, eval_path, pred_path):
# *** START CODE HERE ***
# Fit a Poisson Regression model
# Run on the validation set, and use np.savetxt to save outputs to pred_path
+ model = PoissonRegression()
+ model.fit(x_train, y_train)
+
+ x_valid, y_valid = util.load_dataset(eval_path, add_intercept=False)
+ fcsts = model.predict(x_valid)
+ util.evaluate_regression(y_valid, fcsts, "PS1 p03(d)")
+ fcsts = np.asarray(fcsts, dtype="int")
+ util.write(fcsts, pred_path)
+ fig_path_prefix = pred_path.split(".")[0]
+ util.plot_regression(fcsts, y_valid, "forecast",
+ "true", fig_path_prefix)
# *** END CODE HERE ***
@@ -31,7 +43,11 @@ class PoissonRegression(LinearModel):
> clf.predict(x_eval)
"""
- def fit(self, x, y):
+ def __init__(self, lr=0.003):
+ super().__init__()
+ self.lr = lr
+
+ def fit(self, x, y, scale_y = "True"):
"""Run gradient ascent to maximize likelihood for Poisson regression.
Args:
@@ -39,6 +55,19 @@ def fit(self, x, y):
y: Training example labels. Shape (m,).
"""
# *** START CODE HERE ***
+ # calculate the early stopping criteria as 0.01 * prev_loss
+ # if the change in loss is less than this value for 3 times in a row,
+ # then stop. However, since we may encounter anomalies which can result
+ # in a really high loss for a single value. We evaluate this over a
+ # batch.
+ x = util.add_intercept(x)
+ self.scale_param = np.min(y)
+ y = y/self.scale_param
+ m, n = x.shape
+ theta = np.zeros(n)
+ for x_i, y_i in zip(x, y):
+ theta += self.lr * (y_i - np.exp(theta @ x_i.T)) * x_i
+ self.theta = theta
# *** END CODE HERE ***
def predict(self, x):
@@ -51,4 +80,7 @@ def predict(self, x):
Floating-point prediction for each input, shape (m,).
"""
# *** START CODE HERE ***
+ x = util.add_intercept(x)
+ unscaled_y_hat = np.exp(self.theta @ x.T)
+ return unscaled_y_hat * self.scale_param
# *** END CODE HERE ***
diff --git a/problem-sets/PS1/src/p05b_lwr.py b/problem-sets/PS1/src/p05b_lwr.py
index af9ae51..dd85601 100644
--- a/problem-sets/PS1/src/p05b_lwr.py
+++ b/problem-sets/PS1/src/p05b_lwr.py
@@ -18,8 +18,19 @@ def main(tau, train_path, eval_path):
# *** START CODE HERE ***
# Fit a LWR model
+ model = LocallyWeightedLinearRegression(tau)
+ model.fit(x_train, y_train)
+
# Get MSE value on the validation set
- # Plot validation predictions on top of training set
+ x_valid, y_valid = util.load_dataset(eval_path, add_intercept=True)
+ fcsts = model.predict(x_valid)
+ util.evaluate_regression(y_valid, fcsts, "PS1 p05(b)")
+
+ # Plot validation predictions on top of validation set
+ fig_path_prefix = "output/p05b_pred_1"
+ util.plot_regression_train_and_fcst(x_valid, y_valid, x_valid, fcsts,
+ save_path=fig_path_prefix)
+
# No need to save predictions
# Plot data
# *** END CODE HERE ***
@@ -35,16 +46,32 @@ class LocallyWeightedLinearRegression(LinearModel):
"""
def __init__(self, tau):
- super(LocallyWeightedLinearRegression, self).__init__()
+ super().__init__()
self.tau = tau
self.x = None
self.y = None
+ self.theta = None
+
+ def get_weights(self, x_hat):
+ j, n = x_hat.shape
+ # 'n' can be overwritten because it's same for both
+ m, n = self.x.shape
+
+ # read https://numpy.org/doc/stable/user/basics.broadcasting.html
+ x_hat = x_hat.reshape(j, 1, n)
+
+ diffs = self.x - x_hat
+ l2_norm = np.linalg.norm(diffs, ord=2, axis=2)
+ l2_norm_squared = l2_norm ** 2
+ return np.exp(-l2_norm_squared/(2 * self.tau**2))
def fit(self, x, y):
"""Fit LWR by saving the training set.
"""
# *** START CODE HERE ***
+ self.x = x
+ self.y = y
# *** END CODE HERE ***
def predict(self, x):
@@ -57,4 +84,15 @@ def predict(self, x):
Outputs of shape (m,).
"""
# *** START CODE HERE ***
+ W = self.get_weights(x)
+ j, k = W.shape
+ W = W.reshape(j, k, 1)
+ weighted_X = self.x * W
+ weighted_X = np.transpose(weighted_X, axes=(0, 2, 1))
+
+ X = np.copy(self.x)
+ Thetas = np.linalg.inv(weighted_X @ X) @ weighted_X @ self.y
+
+ y_hats = np.sum(Thetas * x, 1)
+ return y_hats
# *** END CODE HERE ***
diff --git a/problem-sets/PS1/src/p05c_tau.py b/problem-sets/PS1/src/p05c_tau.py
index 9585fd5..18f5712 100644
--- a/problem-sets/PS1/src/p05c_tau.py
+++ b/problem-sets/PS1/src/p05c_tau.py
@@ -24,4 +24,33 @@ def main(tau_values, train_path, valid_path, test_path, pred_path):
# Run on the test set to get the MSE value
# Save predictions to pred_path
# Plot data
+
+ fig_path_prefix = util.get_fig_prefix(pred_path)
+ x_valid, y_valid = util.load_dataset(valid_path, add_intercept=True)
+ mse_vals = []
+
+ for tau in tau_values:
+ model = LocallyWeightedLinearRegression(tau)
+ model.fit(x_train, y_train)
+
+ # Get MSE value on the validation set
+ fcsts = model.predict(x_valid)
+ mse = util.evaluate_regression(y_valid, fcsts,
+ f"PS1 p05(c) tau: {tau} valid_set")
+ tau_str = str(tau).split(".")
+ tau_str = "_".join(tau_str)
+ plot_path = f"{fig_path_prefix}_tau_{tau_str}"
+ util.plot_regression_train_and_fcst(x_valid, y_valid, x_valid, fcsts,
+ save_path=plot_path)
+ mse_vals.append(mse)
+
+ # Plot validation predictions on top of test set
+ best_tau = tau_values[np.argmin(mse_vals)]
+ model = LocallyWeightedLinearRegression(best_tau)
+ model.fit(x_train, y_train)
+
+ x_test, y_test = util.load_dataset(test_path, add_intercept=True)
+ fcsts = model.predict(x_test)
+ mse = util.evaluate_regression(y_test, fcsts,
+ f"PS1 p05(c) tau: {best_tau}, test_set")
# *** END CODE HERE ***
diff --git a/problem-sets/PS1/src/util.py b/problem-sets/PS1/src/util.py
index baa0336..45d1459 100644
--- a/problem-sets/PS1/src/util.py
+++ b/problem-sets/PS1/src/util.py
@@ -1,5 +1,6 @@
import matplotlib.pyplot as plt
import numpy as np
+import os
def add_intercept(x):
@@ -60,7 +61,8 @@ def add_intercept_fn(x):
return inputs, labels
-def plot(x, y, theta, save_path=None, correction=1.0):
+def plot(x, y, theta, save_path=None, correction=0.0):
+# def plot(x, y, theta, save_path=None, correction=1.0):
"""Plot dataset and fitted logistic regression parameters.
Args:
x: Matrix of training examples, one per row.
@@ -75,16 +77,90 @@ def plot(x, y, theta, save_path=None, correction=1.0):
plt.plot(x[y == 0, -2], x[y == 0, -1], 'go', linewidth=2)
# Plot decision boundary (found by solving for theta^T x = 0)
- margin1 = (max(x[:, -2]) - min(x[:, -2]))*0.2
- margin2 = (max(x[:, -1]) - min(x[:, -1]))*0.2
- x1 = np.arange(min(x[:, -2])-margin1, max(x[:, -2])+margin1, 0.01)
- x2 = -(theta[0] / theta[2] * correction + theta[1] / theta[2] * x1)
+ margin1 = (max(x[:, -2]) - min(x[:, -2])) * 0.2
+ margin2 = (max(x[:, -1]) - min(x[:, -1])) * 0.2
+ x1 = np.arange(min(x[:, -2]) - margin1, max(x[:, -2]) + margin1, 0.01)
+ x2 = correction - (theta[0] / theta[2] + theta[1] / theta[2] * x1)
+ # x2 = -(theta[0] / theta[2]*correction + theta[1] / theta[2] * x1)
plt.plot(x1, x2, c='red', linewidth=2)
- plt.xlim(x[:, -2].min()-margin1, x[:, -2].max()+margin1)
- plt.ylim(x[:, -1].min()-margin2, x[:, -1].max()+margin2)
+ plt.xlim(x[:, -2].min() - margin1, x[:, -2].max() + margin1)
+ plt.ylim(x[:, -1].min() - margin2, x[:, -1].max() + margin2)
# Add labels and save to disk
plt.xlabel('x1')
plt.ylabel('x2')
if save_path is not None:
plt.savefig(save_path)
+
+def plot_regression(x, y, label_x="x", label_y="y", save_path=""):
+ plt.figure()
+ plt.scatter(x, y)
+ # Add labels and save to disk
+ plt.xlabel(label_x)
+ plt.ylabel(label_y)
+ if save_path is not None:
+ plt.savefig(save_path)
+
+def plot_regression_train_and_fcst(x_train, y_train, x_test, y_test, label_x="x", label_y="y", save_path=""):
+ plt.figure()
+ plt.plot(x_train, y_train, 'bx', linewidth=2)
+ plt.plot(x_test, y_test, 'ro', linewidth=2)
+ # Add labels and save to disk
+ plt.xlabel(label_x)
+ plt.ylabel(label_y)
+ if save_path is not None:
+ plt.savefig(save_path)
+
+
+def evaluate_classification(fcst, y_test, heading=""):
+ print(f"\n\n{heading}")
+ # evaluate
+ y_test_vec = y_test.reshape(len(y_test), 1)
+ fcst_vec = fcst.reshape(len(fcst), 1)
+
+ correct = (y_test_vec == fcst_vec)
+ wrong = 1 - correct
+
+ accuracy = np.sum(correct) / len(fcst_vec)
+ true_pos = np.sum(correct * fcst_vec)
+ true_neg = np.sum(correct * (1 - fcst_vec))
+ false_pos = np.sum(wrong * fcst_vec)
+ false_neg = np.sum(wrong * (1 - fcst_vec))
+
+ if (true_pos + false_pos) == 0:
+ precision = 0
+ else:
+ precision = true_pos / (true_pos + false_pos)
+
+ if (true_pos + false_neg) == 0:
+ recall = 0
+ else:
+ recall = true_pos / (true_pos + false_neg)
+
+ print(f"y_test_vec, shape: {y_test_vec.shape}, num: {np.sum(y_test_vec)}")
+ print(f"fcst_vec, shape: {fcst_vec.shape}, num: {np.sum(fcst_vec)}")
+ print(f"correct vec, shape: {correct.shape}, num: {np.sum(correct)}")
+ print(f"wrong vec, shape: {wrong.shape}, num: {np.sum(wrong)}")
+ print(f"accuracy: {np.round(accuracy, 2)}, "
+ f"precision: {np.round(precision, 2)}, "
+ f"recall: {np.round(recall, 2)}")
+
+
+def evaluate_regression(y, y_hat, heading=""):
+ print(f"\n\n{heading}")
+ m = len(y)
+ # evaluate
+ y_vec = y.reshape(m, 1)
+ y_hat_vec = y_hat.reshape(m, 1)
+ mse = (1/m) * np.sum((y_hat_vec - y_vec)**2)
+ mse = np.round(mse, 2)
+ print(f"MSE = {mse}")
+ return mse
+
+def write(data, path):
+ dir_name = os.path.dirname(path)
+ os.makedirs(dir_name, exist_ok=True)
+ np.savetxt(path, data, fmt="%d", delimiter=",")
+
+def get_fig_prefix(pred_path):
+ return pred_path.split(".")[0]
diff --git a/problem-sets/PS2/MHA's notebooks/.ipynb_checkpoints/PS2_P1-checkpoint.ipynb b/problem-sets/PS2/MHA's notebooks/.ipynb_checkpoints/PS2_P1-checkpoint.ipynb
new file mode 100644
index 0000000..993243b
--- /dev/null
+++ b/problem-sets/PS2/MHA's notebooks/.ipynb_checkpoints/PS2_P1-checkpoint.ipynb
@@ -0,0 +1,1274 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "434b7bba-ab2c-4595-b3d6-5aa7152e3dfb",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import sys\n",
+ "SCRIPT_DIR = os.path.dirname(os.path.abspath(\"__file__\"))\n",
+ "SCRIPT_DIR_PARENT = os.path.dirname(SCRIPT_DIR)\n",
+ "sys.path.append(os.path.dirname(SCRIPT_DIR_PARENT))\n",
+ "\n",
+ "from PS2.src import util\n",
+ "from PS2.src.p01_lr import logistic_regression_modified\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "7ad972a6-a11f-4f75-b6d0-76f8c8b0038d",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Xa, Ya = util.load_csv('../data/ds1_a.csv', add_intercept=False)\n",
+ "Xb, Yb = util.load_csv('../data/ds1_b.csv', add_intercept=False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "4562fa2a-ef15-4f52-8293-4b8263e3cc26",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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",
+ "text/plain": [
+ "