From 7aafa768ad4734a1bdc7128e7d07209ccdaf38f6 Mon Sep 17 00:00:00 2001
From: Anders Bjorholm Dahl <abda@dtu.dk>
Date: Wed, 20 Mar 2024 11:10:33 +0100
Subject: [PATCH] New tool for making data

---
 Chapter08/cases/case_1.png    | Bin 0 -> 1878 bytes
 Chapter08/cases/case_2.png    | Bin 0 -> 2716 bytes
 Chapter08/cases/case_3.png    | Bin 0 -> 2709 bytes
 Chapter08/cases/case_4.png    | Bin 0 -> 3612 bytes
 Chapter08/cases/case_5.png    | Bin 0 -> 4622 bytes
 Chapter08/cases/case_6.png    | Bin 0 -> 2374 bytes
 Chapter08/cases/case_7.png    | Bin 0 -> 2626 bytes
 Chapter08/make_data.py        | 163 +++++++++++++++-------------------
 Chapter08/make_data_simple.py | 107 ++++++++++++++++++++++
 9 files changed, 178 insertions(+), 92 deletions(-)
 create mode 100644 Chapter08/cases/case_1.png
 create mode 100644 Chapter08/cases/case_2.png
 create mode 100644 Chapter08/cases/case_3.png
 create mode 100644 Chapter08/cases/case_4.png
 create mode 100644 Chapter08/cases/case_5.png
 create mode 100644 Chapter08/cases/case_6.png
 create mode 100644 Chapter08/cases/case_7.png
 mode change 100755 => 100644 Chapter08/make_data.py
 create mode 100755 Chapter08/make_data_simple.py

diff --git a/Chapter08/cases/case_1.png b/Chapter08/cases/case_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..f49f90a9a392ab491da1cf805c58a8a8394ec7f3
GIT binary patch
literal 1878
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

literal 0
HcmV?d00001

diff --git a/Chapter08/cases/case_2.png b/Chapter08/cases/case_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad68f1c93a8155a3bcd08a5079a32eeb47977071
GIT binary patch
literal 2716
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

literal 0
HcmV?d00001

diff --git a/Chapter08/cases/case_3.png b/Chapter08/cases/case_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..15d5694144c6172d2461b370dc292948c8ba414f
GIT binary patch
literal 2709
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

literal 0
HcmV?d00001

diff --git a/Chapter08/cases/case_4.png b/Chapter08/cases/case_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f9c27aabae7efd3bb5987577a2a82a45ce35f83
GIT binary patch
literal 3612
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

literal 0
HcmV?d00001

diff --git a/Chapter08/cases/case_5.png b/Chapter08/cases/case_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d4071d3186aa4fb901f3efb8e00ae3267097893
GIT binary patch
literal 4622
zcmbVQX*3jU*dAMCEy}(XB|BwjjD5}6-l!N`nDoY!8QWNsr4o{|j<F>n+bd+4QIU0G
zvV<68of%^*Geh=I|GuB!`OdlSb6@v$pXbkW?&UepQzx)BAGbI+007{#wXtvk09Y7*
zjq5}JY+w`IP6D|gb8{zKb931Tp|HT9`vCyJm8_x{opxPL=X&CUDvnGQ(jM#iKlm``
zcR9EE412Pu^39?V`LBM0<}Y1h*hm&KZy(G4;T_^0iqkdF%lpccy4gFA+HBu38w7v(
z;5nJBRl_~8DWIO}zP%t3j8Pf&Rp1)z*o;!pLJzyEl&b?5$BlL<D;5vM>?qYL_%!bK
zv5nViLc5eOt!&3m2eK{YT4~*m3+q?Xc?%&Rhqv>Ym2Kbdp&+P2+&!M$JK*09VwwSF
zW|ocxRq&)P^jL-L9QvhG!I>J}(d%E+-@VEnd~{cKBv^b)XVu72Q7-EGQh?xw&2rF|
z#_>LO`=J}`wglbiN+M?5t-0q;WPDQdh4-MYfiUwQBb%+-cs(W_MEb)qQsZ>{JKZw%
z<kn6<u(<^X0Mz9E8cSpaDEvg^MA$l5a#GpOoj$|L!ST7`L=r<--b9$gf`bD>5CHSg
z0AECazidPh;;yW<t%H;MBYqJ8;LI&s3)6ohf36ona%MjAC392==M??+3Gx!#5~NIK
zSF2@pt3TWv{Rj+k{u62H^rm|?QI_lfjsoEuAsv!2umoJ9BvpX-DPv_e0oNxvxyosV
z2@5sxPUT+<GnbVzG$_$USFsv246kk=7g?z#{QnCXiXN(-?3G=s2^qY}j0|>xzqx=$
zHe@gDIRJYB$;ycP#e$U!Kk;*aJyYX3>G*R3`n;joh2f`IcRzTU@zK#80~%4pQ$-7R
zAO;2v(_o_4Q0V_M(=NdEfHf2SFZE%%*>i}^ryWhhmgoa60{l&j@8mI~p|j&4J5aLJ
zu~EqGn`dP*Klr#DZugjYw+BC7{cZXy8N+P6k*H2ky#z#5iHyxysXO)Ax+yyclBFRF
zLqwxKGj(^e_%a1m8d;stdQW60K@I18_*+J^W1STeDtmnBIMqcnwwkcXsTaieZg)~l
zXe(FwcCS`)Ep1*@|M^|?HvTJmvS^la=Z%dp<<AT|<|=&HTYj%Iwm|<z68e>XOb8cH
zo$j2Z|N607^^Pl%BK)=a&0{ZMt33~`6^g$i051kg)yNqfPIj!<o>u>31bf!{(+nO>
zvPpk*EqVn9-JTw%vX?9LSL^1vSEwnX_{o+HB(Rm^Clrx0jE+{WD&jAOmc_Mu8ne-#
zRL*tHD82l#0?ChlqtZxeL<IAYjdnf$_-5M{sujvrJSQ~g(+}zwdL7(San_LQqAuEG
zWYEvk7&hjVn@8r#8^dc0iPQP5Jz*|u;$8$>U9;-wr$kyeV$44Fl}T1qk#1%2vYlr0
z!q}y-^dWv7@66QYe;o!aJE}%kHHT^8#OUhm+4F<pze7md*Th|7^`QB)H`0fUFO#08
z2GcDC$i#liMPKIh5q**~FgFqG9`mUYpM&q)TJ{My=v!G^hW_{O+b=%{Bbw~B5Ww;#
zo?o5<g2Ii1`rsX<!Ty(f4;o*-O2ok!yiKtEW)=<_r#=L~7{$$GCA10Biwg`<?_>a2
zQTQV3k*$4&5d(>r$~n-jBKd4A!!2v#3o*8-W@;kvTq4kLY*X$z8c*47p7F|ti4tX7
zd!r%vQjz1iYx+1n&{d~SUj)yRao30vbK4r>yqvuvTt)hp9+Hd#ZtdTr!zMenrQUy>
z54n$UUCLJ|jPS_xXh+fa=E36}jx0w)%z06Yz?e65zs+)_Kzhy#5O<ZiQ=DTIc750>
z7yjcYojy98qm>B85=NZCG6hnSV_CBT;$sR`(9{f=wYZbxCc~1ZH`;awDRL95!C1b{
zAGmq5k0lyOt(oS}aeEb=2~BmJ+RKC384&NLIt#72M%?<c!WIH*dEpVGnKa@j^V_Pv
z;{!$l*F{tdD>@o&qBRCE^UUJp1LAsy@~tIOmI%xr$+IYBY*STmVyCXKra}exczZzN
zj`WPR-qwh#jss0$9O1p0)Kab;^>D;`5NYl)<DNXpx7*v^v54`_n}8gI6wVaCRzO4<
z62H(ud;a2bmKsnH$oW&A+R&*oj`lJ7E?tr9ywcKSCK6i>{%2@S*50vDKJr`WkkYWV
z^cOKc;u8!@IONx5=mRCNqs!1}RJrT>FLYbRAl?#gcW)JuM!(0bi41O9m4HO~`9-sq
zOCf~TUS+jWNlzXkz4<_}ui;F4AtksTajHO6V>lvi?>cp|tTRgrzWtCFGEY#gD)ey-
z)hhH2D!b9~WY1Fitu5FRlD^xMIwDzF={t7K*WC~2ddnyXGi(%FCFz@NqwbD)<jN>Y
z1GRf&Ih{}So)>r>xd$v5zq0TivO!^dT{%;O$k1-(tnFTlVZ2f?WFVsz`_}BgKi4}V
zQi3k(@3?T6hv54CirXgG{5LsrSLBD^kL$l3?TAS6juSO+iM1#ncMH^gAQUA|gdxQm
zJ{Z8lzu`0kcrMi!YI+}_o0Sk(ztq{qa<}^j;tmcymW#~%!sbh-3<JgOrd72R7y7zT
zr+$<;(K0>kdNn6VLU*kozRh8^jUUDh(oXNGX&v$%hmXnlPIx!XCe{skvgO4wLvCJf
zbTiIVN|AiKS~fY8r#NlVCFm4SnBk*Ip1*Y*g(0pk2#<C4x(JFw=uZ^6I|P~@6*U*y
z*VK+E5f%Gh1-<i*uK%RcocrT;x7x%|)~teS$B~o%hiQo&botjt*NDU);`i%CbFd%u
zLZ>-I?3<e4@MX!Ro|^kYfyI?WKiwQ78d`3_H{@f-eS9YPnowOcalpfs1DC=*8<QgV
z)txDe?>R`9-8EE{|F)#q(LEF5zwKi}YXf8BwQ;;*oxo6?)mwXBum?KzlpdRGrpmN{
zb#YJ_iP#{l=64gQ%NX=Ko84R+7sIiM-6T$|vUv>yuvRIc8QKx-<45E9lySI8YaVwO
zZKYI1L-6y;?j4#QOvq&TYD3dTNnFcB7mn3oD%~OhZTybr2FlxuHC;c)MeL{9{Ng}m
z$ZdREOkm6sXq=`{#t18+|581liLpMmizYgH!6Y@*M4=lb&;J0~_0*t54qG0>iQuIr
zWH_HEoFu>3c*+nYz+;;~yzc3jb*=n8VJ(*HbHIV%A{<w-l!Hci4skc;>v#_1)uxRv
zrCm%v;?rf>Ymdyl#dr|uKwbRiIMXOlvaPa|5_Th?-*XS^0-sKf{%COjqpX5S1j=;E
z(;kV_i<t0hC!BJ-t{rGqc?Y#IAtf9;%ha^MrCxiJhWb1+v0|*|tvbK9znCz}huQ{K
z^A?NPY`(d7k^gQ%nd-aKh)R?qN1m?IlGY=5Kyfh_B+&?cKZU<iS&l-}(G?$q*^9oX
zYTqE24RwsUY)ScidVSKdUiLWx&~xe1`O}b$vIpz#>W1aYfkqJW$kZ}7Ay!(;YWHAl
zg5n*hbyF2TfUnRDN!E-lYMb2a_;N*h@|%|xzWx&V4dV5s@||7bf#7b>+GnGI{P_-3
zH@{Is@T$+z2-CxWP;*I9oynP@6$$($IXX%X^ClEI(#=sQVMbD1xI93aKZODSt>-tW
z4--cn;O&pTXN|3wW*V_?&5<8!F@WUTR;lg4QVC6%_nT}I_+UD>4XntKyKhGFSM%{Y
zgON*TA?ugGa^Btip~6K}YKu@`puLUI0158>^3QnukZu^8rk}$2K!|N|Fu8#`Dr$TA
z{d-$XX(l_qRz6{475?rb!-1Uo&qGhB2Ik*gNpmDWwOukJzwTka8twOQlc3KB$71wG
zF!axXxyly5rFt~EKk(li!+#=It`v3?RME+l-)%`a>xh{=HHXmXrYOv5xXORyb+e^`
zgsho)ga!<N9WqM;U=DdN4N+}0BVNSfETzBhN8Q;gn+ALNXPcMgB3n)8PHM^7js+Q9
zu?9z%5AvACONJ+ovgL7#Z1zfaq?@T}ha0dX6Xk7p8+cIstrN*$sGIq6qe2*R%X-sm
ztm-1d?jB;m3IYx_C^8sVEt-e9J4!JQZg59jplcpxF4j@sK{xnI-Y+n#rx~?6in61I
zl%LV>KN(@?KhB;<u8u?WfU`7KYJ)+^aaC42CQrPm!1TBw)VL?gOW+D;&}g8f|2?oE
ztcw#9UbGc9KBloA8kf!FA_tTnzZS?DcIPV&>eVXIVL+xk%faxwE$^krR>FG`HN5T4
zjlaQ@K?VF%8kH%8)=Fr{xu`A4m@Zs>gaz`rYV_Amh`J-I18)EFbxL+CF6`y!WAs&O
z>kkbTW(pxTyw~6mHVj>DB)yn6)+=k9)4vR0VzcgBK6|D~irAam&L~DVTY{uZYBI-L
z3v2F#IVbyh^tBDX)lHvMWeN@(F-NM$;l%-K+*(V|pmi^1Rh1XBYC-*8=avUP8SP%?
zZbx2_?}tv==EqQ;LxjaPw2Fb5rT&Cn6`Jy7|4%Y|rT4_wOL(={dG3><{hq}be?Q|0
zvEwZw<^>e^@dM;j+xnP%a$kD}Q%;qc*@*Aym{pRP2G8xd8mSJAN=EqS!Z9uD+O<b&
zZ%^mfm}Gj@O81xSgE<P#NRNvXFgxu!N_UViwVB;ru}b775qvOHn*?tdJtS4N$Fi-h
zMA!M^6LzjR&WiRAWA0GrEI8B*#s*3)o*LJ^Di;R^pG!L8JBXRC(1JH}<gRHqZE)3_
zDQ`3(5&1V`{qd{?x9kRfdJ63omrB@<c9N4^2QGTI{c-P<M-Tp6CuMVsOe?(7(+jZ?
zvx?<!wihNV=N{i>&WoMAvXnPdhcZ0JR~AjhKY~ZZJJ?BIyb^}qN-ZL2VmL1fR&z_G
z$<?$_-3;pEos_pE_xh|y$?#P};HhG=f7*-KO=$Ys@!?$uv86PE*ci0*twHDIyTI6P
z{8X@^N4{fUeMJO^-=amU3?G)-ml4;(QS=!ARyUO@x-WzQOQk#l29}-Ol*rIAU_+X;
zEICnmD|?@3@s{sA4v{=KJ52&79xbURp5>0~-fm7IL@CNNNUXQub&Ewn;tCXN79De5
z>OO&#Qh1}JL4TtK-|C*y({$xtynNY=d186V@%i}h8iu-wK(h3;PBsQN0qz3pKiJEi
zejRtX7lE5T4*R@9oS7Y^&hBGQ<?TF1KSR2cj|}xV|4!GDad@Yi9=335UmSS%@ezO?
zM_6o(2$bGa8Uk#^5xN?5q0&bq#J?Q!nJq$^`eW|1fg(a;?NgEDo^hnC+UeNyMh`?%
zjoD_;wJc?Pe@GCr;m;5(0r|w;&I25trgtr{Q#135&%cvMa>klZq}J~Uq4-($cC9#1
zM#RbH3Fky;{H4B#`1yIfIXRM-hsEHfVaa3t9)?_AZ|_RHN1rI6=sud}AbSdt*^ORX
zS3iYFZA7_fk}CMAFF|&&@FbXXJWCV^dgg(<)*gD?`%`eg=i&$1LtR5}KuB-Q0mJ>#
zCh2T~hb8rqdDP*AEY^d?UFIp}(0C3JKj)u%@HD_7<4g=o<da?*43S);!oD={`}@JW
zFO$lg24=Yc$M?6hq46Rm9u;AsW=A<?Vs!IT<@6;q{@6Bj&2bxPn%U6i*8g=IpP3~6
z$+LBUteGtYIAkZc!}n7NpATv<^_5WZq3l^N&hmDLZ(Yy%D`C+k()2~t2JWNF3w@MV
z?GC&=T3ZLR41S8h&oi)I-Y<83!6Fn78G3`25xovvsS&?*DqJmUM-f#QF?dI8{E7eU
zx0Rz<6zBlat+~k#yjb;HApTn7i`GYIo<FSN<L+`^Cepg?3ngsNPKaJ<+}-eX-I8CT
zI{dq?Ycv>^1u4HpI^OwZ!B3sXcRp&3Y&%a7(m3XwCC3Ju4FB*=(cT&@8D-(D){l7)
zC_WwhZn4!qe|C;bQwepHtclB>__Q(v^~ro@1=@$`q!vnW<jWmaxzvA_B%E)&=Eq`s
hhW-D87mttF@`M1_%1+P!bMg}bu(bqR)S3At{tq_oDg*!k

literal 0
HcmV?d00001

diff --git a/Chapter08/cases/case_6.png b/Chapter08/cases/case_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..34c744a3a1caf51295818628d1a0e0639e91cd07
GIT binary patch
literal 2374
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
R@gu))8>A1$yAgIS;~x;-mGJ-o

literal 0
HcmV?d00001

diff --git a/Chapter08/cases/case_7.png b/Chapter08/cases/case_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..08195150435c2127b3668d66ccb99a3e0542d935
GIT binary patch
literal 2626
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

literal 0
HcmV?d00001

diff --git a/Chapter08/make_data.py b/Chapter08/make_data.py
old mode 100755
new mode 100644
index 1a4419c..442ad69
--- a/Chapter08/make_data.py
+++ b/Chapter08/make_data.py
@@ -1,107 +1,86 @@
-#%%
 
 import numpy as np
+import matplotlib.pyplot as plt
+import skimage.io
+import os
 
-
-def make_data(example_nr, n = 200, noise = 1):
-    '''
-    Generate data for training a simple neural network.
-    
-        Arguments:
-            example_nr: a number 1 to 3 for each example.
-            n: number of points in each class set.
-            noise: noise level, best between 0.5 and 2.
-        Returns:
-            X: 2 x 2n array of points (there are n points in each class).
-            T: 2 x 2n target values.
-            x: grid points for testing the neural network.
-            dim: size of the area covered by the grid points.
-
-        Authors: Vedrana Andersen Dahl and Anders Bjorholm Dahl - 25/3-2020
-        vand@dtu.dk, abda@dtu.dk
-    '''
-
-    rg = np.random.default_rng()
-    
-    dim = (100, 100)
+def make_data(example_nr, n_pts = 200, noise = 1):
+    '''Make data for the neural network. The data is read from a png file in the 
+    cases folder, which must be placed together with your code.
     
-    QX, QY = np.meshgrid(range(0, dim[0]), range(0, dim[1]))
-    x_grid = np.c_[np.ravel(QX), np.ravel(QY)]
-    
-    #  Targets: first half class 0, second half class 1
-    T = np.vstack((np.tile([True, False], (n, 1)), 
-                   np.tile([False, True], (n, 1))))
-    
-    if example_nr == 1 :  # two separated clusters
-
-        X = np.vstack((np.tile([30., 30.], (n, 1)), 
-                       np.tile([70., 70.], (n, 1))))
-        X += rg.normal(size=X.shape, scale=10*noise)  # add noise
-
-    elif example_nr == 2 :  # concentric clusters
-
-        rand_ang = 2 * np.pi * rg.uniform(size=n)
-        X = np.vstack((30 * np.array([np.cos(rand_ang), np.sin(rand_ang)]).T, 
-                       np.tile([0., 0.], (n, 1))))
-        X += [50, 50]  # center
-        X += rg.normal(size=X.shape, scale=5*noise)# add noise
+    Parameters:
+    example_nr : int
+        1-7
+    n_pts : int
+        Number of points in each of the two classes
+    noise : float
+        Standard deviation of the Gaussian noise
+
+    Returns:
+    X : ndarray
+        2 x n_pts array of points
+    T : ndarray
+        2 x n_pts array of boolean values
+    x_grid : ndarray
+        2 x n_pts array of points in regular grid for visualization
+    dim : tuple of int
+        Dimensions of the grid
     
-    elif example_nr == 3 :  # 2x2 checkerboard 
-        n1 = n//2
-        n2 = n//2 + n%2  # if n is odd n2 will have 1 element more
-
-        X = np.vstack((np.tile([30., 30.], (n1, 1)), 
-                       np.tile([70., 70.], (n2, 1)),
-                       np.tile([30. ,70.], (n1, 1)),
-                       np.tile([70., 30.], (n2, 1))))
-        X += rg.normal(size=X.shape, scale=10*noise)  # add noise
-
-    else:
-        print('No data returned - example_nr must be 1, 2, or 3')
-    
-    o = rg.permutation(range(2*n))
-    
-    return X[o].T, T[o].T, x_grid.T, dim
+    Example:
+    example_nr = 1
+    n_pts = 2000
+    noise = 2
+    X, T, x_grid, dim = make_data(example_nr, n_pts, noise)
+
+    fig, ax = plt.subplots()
+    ax.plot(X[0,T[0]], X[1,T[0]], '.r', alpha=0.3)
+    ax.plot(X[0,T[1]], X[1,T[1]], '.g', alpha=0.3)
+    ax.set_xlim(0, 100)
+    ax.set_ylim(0, 100)
+    ax.set_box_aspect(1)
+
+    Authors: Vedrana Andersen Dahl and Anders Bjorholm Dahl - 20/3-2024
+    vand@dtu.dk, abda@dtu.dk
 
+    '''
 
-#%% Test of the data generation
-if __name__ == "__main__":
-    #%%
+    in_dir = 'cases/'
+    file_names = sorted(os.listdir(in_dir))
+    file_names = [f for f in file_names if f.endswith('.png')]
 
-    import matplotlib.pyplot as plt
-    
-    n = 1000
-    noise = 1
-    
-    fig, ax = plt.subplots(1, 3)
-    for i, a in enumerate(ax):
-        example_nr = i + 1
-        X, T, x_grid, dim = make_data(example_nr, n, noise)
-        a.scatter(X[0][T[0]], X[1][T[0]], c='r', alpha=0.3, s=15)
-        a.scatter(X[0][T[1]], X[1][T[1]], c='g', alpha=0.3, s=15)
-        a.set_aspect('equal', 'box')
-        a.set_title(f'Example {i} data')
-    
-    plt.show()
-    
+    im = skimage.io.imread(in_dir + file_names[example_nr-1])
     
-    #%% Before training, you should make data zero mean
-    
-    c = np.mean(X, axis=1, keepdims=True)
-    X_c = X - c
-    
-    fig, ax = plt.subplots(1,1)
-    ax.scatter(X_c[0][T[0]], X_c[1][T[0]], c='r', alpha=0.3, s=15)
-    ax.scatter(X_c[0][T[1]], X_c[1][T[1]], c='g', alpha=0.3, s=15)
-    ax.set_aspect('equal', 'box')
-    plt.title('Zero-mean data')
-    plt.show()
-
-
+    [r_white, c_white] = np.where(im == 255)
+    [r_gray, c_gray] = np.where(im == 127)
+    n_white = np.minimum(r_white.shape[0], n_pts)
+    n_gray = np.minimum(r_gray.shape[0], n_pts)
 
+    rid_white = np.random.permutation(r_white.shape[0])
+    rid_gray = np.random.permutation(r_gray.shape[0])
+    pts_white = np.array([c_white[rid_white[:n_white]], r_white[rid_white[:n_white]]])
+    pts_gray = np.array([c_gray[rid_gray[:n_gray]], r_gray[rid_gray[:n_gray]]])
 
+    X = np.hstack((pts_white, pts_gray))/5 + np.random.randn(2, n_white+n_gray)*noise
+    T = np.zeros((2, n_white+n_gray), dtype=bool)
+    T[0,:n_white] = True
+    T[1,n_white:] = True
 
+    dim = (100, 100)
+    QX, QY = np.meshgrid(range(0, dim[0]), range(0, dim[1]))
+    x_grid = np.vstack((np.ravel(QX), np.ravel(QY)))
 
+    return X, T, x_grid, dim
 
+if __name__ == "__main__":
+    example_nr = 1
+    n_pts = 2000
+    noise = 3
+    X, T, x_grid, dim = make_data(example_nr, n_pts, noise)
+
+    fig, ax = plt.subplots()
+    ax.plot(X[0,T[0]], X[1,T[0]], '.r', alpha=0.3)
+    ax.plot(X[0,T[1]], X[1,T[1]], '.g', alpha=0.3)
+    ax.set_xlim(0, 100)
+    ax.set_ylim(0, 100)
+    ax.set_box_aspect(1)
 
-# %%
diff --git a/Chapter08/make_data_simple.py b/Chapter08/make_data_simple.py
new file mode 100755
index 0000000..1a4419c
--- /dev/null
+++ b/Chapter08/make_data_simple.py
@@ -0,0 +1,107 @@
+#%%
+
+import numpy as np
+
+
+def make_data(example_nr, n = 200, noise = 1):
+    '''
+    Generate data for training a simple neural network.
+    
+        Arguments:
+            example_nr: a number 1 to 3 for each example.
+            n: number of points in each class set.
+            noise: noise level, best between 0.5 and 2.
+        Returns:
+            X: 2 x 2n array of points (there are n points in each class).
+            T: 2 x 2n target values.
+            x: grid points for testing the neural network.
+            dim: size of the area covered by the grid points.
+
+        Authors: Vedrana Andersen Dahl and Anders Bjorholm Dahl - 25/3-2020
+        vand@dtu.dk, abda@dtu.dk
+    '''
+
+    rg = np.random.default_rng()
+    
+    dim = (100, 100)
+    
+    QX, QY = np.meshgrid(range(0, dim[0]), range(0, dim[1]))
+    x_grid = np.c_[np.ravel(QX), np.ravel(QY)]
+    
+    #  Targets: first half class 0, second half class 1
+    T = np.vstack((np.tile([True, False], (n, 1)), 
+                   np.tile([False, True], (n, 1))))
+    
+    if example_nr == 1 :  # two separated clusters
+
+        X = np.vstack((np.tile([30., 30.], (n, 1)), 
+                       np.tile([70., 70.], (n, 1))))
+        X += rg.normal(size=X.shape, scale=10*noise)  # add noise
+
+    elif example_nr == 2 :  # concentric clusters
+
+        rand_ang = 2 * np.pi * rg.uniform(size=n)
+        X = np.vstack((30 * np.array([np.cos(rand_ang), np.sin(rand_ang)]).T, 
+                       np.tile([0., 0.], (n, 1))))
+        X += [50, 50]  # center
+        X += rg.normal(size=X.shape, scale=5*noise)# add noise
+    
+    elif example_nr == 3 :  # 2x2 checkerboard 
+        n1 = n//2
+        n2 = n//2 + n%2  # if n is odd n2 will have 1 element more
+
+        X = np.vstack((np.tile([30., 30.], (n1, 1)), 
+                       np.tile([70., 70.], (n2, 1)),
+                       np.tile([30. ,70.], (n1, 1)),
+                       np.tile([70., 30.], (n2, 1))))
+        X += rg.normal(size=X.shape, scale=10*noise)  # add noise
+
+    else:
+        print('No data returned - example_nr must be 1, 2, or 3')
+    
+    o = rg.permutation(range(2*n))
+    
+    return X[o].T, T[o].T, x_grid.T, dim
+
+
+#%% Test of the data generation
+if __name__ == "__main__":
+    #%%
+
+    import matplotlib.pyplot as plt
+    
+    n = 1000
+    noise = 1
+    
+    fig, ax = plt.subplots(1, 3)
+    for i, a in enumerate(ax):
+        example_nr = i + 1
+        X, T, x_grid, dim = make_data(example_nr, n, noise)
+        a.scatter(X[0][T[0]], X[1][T[0]], c='r', alpha=0.3, s=15)
+        a.scatter(X[0][T[1]], X[1][T[1]], c='g', alpha=0.3, s=15)
+        a.set_aspect('equal', 'box')
+        a.set_title(f'Example {i} data')
+    
+    plt.show()
+    
+    
+    #%% Before training, you should make data zero mean
+    
+    c = np.mean(X, axis=1, keepdims=True)
+    X_c = X - c
+    
+    fig, ax = plt.subplots(1,1)
+    ax.scatter(X_c[0][T[0]], X_c[1][T[0]], c='r', alpha=0.3, s=15)
+    ax.scatter(X_c[0][T[1]], X_c[1][T[1]], c='g', alpha=0.3, s=15)
+    ax.set_aspect('equal', 'box')
+    plt.title('Zero-mean data')
+    plt.show()
+
+
+
+
+
+
+
+
+# %%
-- 
GitLab