FUZZY Model

Load the modules


In [1]:
import sys
sys.path.append('../src')
import Pyfuzzy as Fuzz
import numpy as np
import pylab as plt
import pandas as pd
%matplotlib inline

Load the fuzzy model


In [2]:
f1=Fuzz.read_model('zr_simple.fis')      # 27 rules, 3*3*3 membership functions (soil, T, P))
# f1=Fuzz.read_model('zr_simple334.fis') # 36 rules, 3*4*3 membership functions
# f1=Fuzz.read_model('zr_simple344.fis') # 48 rules, 3*4*4 membership functions

Visualize the model


In [3]:
f1.show_model(tag1=0,default1=60)


('a0:', 50.0, 'b0:', 68.0)
('a1:', 50.0, 'b1:', 380.0)
('a:', 50.0, 'b:', 380.0, 'c:', 60.0)
Out[3]:
True

In [4]:
f1.show_model(tag1=1,default1=55)


('a0:', 20.0, 'b0:', 60.0)
('a1:', 50.0, 'b1:', 380.0)
('a:', 50.0, 'b:', 380.0, 'c:', 55.0)
Out[4]:
True

In [5]:
f1.show_model(tag1=2,default1=150)


('a0:', 20.0, 'b0:', 60.0)
('a1:', 50.0, 'b1:', 68.0)
('a:', 50.0, 'b:', 68.0, 'c:', 150.0)
Out[5]:
True

Generate samples from data

Read the data in


In [6]:
ZR=pd.ExcelFile('ZR_Daten_DDR_1976_1990.xlsx')
df=ZR.parse("Tabelle1")
df[(df['ERTRAG (dt/ha)']<600) & (df['ERTRAG (dt/ha)']>100)] # exclude outliers


Out[6]:
FRUCHTART ERNTEJAHR NATUERLICHE_STANDORTEINHEIT Mittlere Ackerzahl TAG_AUSSAAT TAG_AUFGANG Tage Aussaat bis Aufgang N_DUENGUNG TAG_ERNTEABSCHLUSS ERTRAG (dt/ha) ... NI_4 NI_5 NI_6 NI_7 NI_8 NI_9 NI_10 NI_11 NI_12 NI_4-10
0 Zuckerrüben zur Zuckergewinnun 1976 D5/N 48 116 134 18 200 311 275.0 ... 19.3 61.7 12.5 30.2 9.2 37.6 62.3 29.9 28.4 33.257143
1 Zuckerrüben zur Zuckergewinnun 1976 D5/N 48 112 132 20 250 308 342.0 ... 19.3 61.7 12.5 30.2 9.2 37.6 62.3 29.9 28.4 33.257143
2 Zuckerrüben zur Zuckergewinnun 1976 D4/N 36 118 137 19 185 306 279.0 ... 19.3 61.7 12.5 30.2 9.2 37.6 62.3 29.9 28.4 33.257143
3 Zuckerrüben zur Zuckergewinnun 1977 D5/N 48 119 134 15 233 308 320.0 ... 71.2 27.4 29.9 55.9 92.2 30.7 22.9 101.6 31.7 47.171429
4 Zuckerrüben zur Zuckergewinnun 1977 D4/N 36 128 142 14 185 301 285.0 ... 71.2 27.4 29.9 55.9 92.2 30.7 22.9 101.6 31.7 47.171429
5 Zuckerrüben zur Zuckergewinnun 1977 D4/N 36 134 144 10 262 305 325.0 ... 71.2 27.4 29.9 55.9 92.2 30.7 22.9 101.6 31.7 47.171429
6 Zuckerrüben zur Zuckergewinnun 1978 D5/N 48 110 136 26 240 307 264.0 ... 15.3 21.5 88.4 57.3 55.8 115.8 38.5 23.4 79.8 56.085714
7 Zuckerrüben zur Zuckergewinnun 1978 D5/N 48 105 135 30 240 293 320.0 ... 15.3 21.5 88.4 57.3 55.8 115.8 38.5 23.4 79.8 56.085714
8 Zuckerrüben zur Zuckergewinnun 1978 D5/N 48 118 137 19 220 306 259.0 ... 15.3 21.5 88.4 57.3 55.8 115.8 38.5 23.4 79.8 56.085714
9 Zuckerrüben zur Zuckergewinnun 1979 D5/N 48 134 140 6 257 283 247.0 ... 32.0 30.3 38.3 84.6 108.8 33.9 20.5 42.1 67.4 49.771429
10 Zuckerrüben zur Zuckergewinnun 1979 D4/N 36 110 128 18 226 319 286.0 ... 32.0 30.3 38.3 84.6 108.8 33.9 20.5 42.1 67.4 49.771429
11 Zuckerrüben zur Zuckergewinnun 1979 D4/N 36 131 139 8 322 298 302.0 ... 32.0 30.3 38.3 84.6 108.8 33.9 20.5 42.1 67.4 49.771429
12 Zuckerrüben zur Zuckergewinnun 1980 D5/N 48 125 139 14 150 287 280.0 ... 44.0 26.1 99.5 85.2 88.6 49.1 85.2 45.6 35.4 68.242857
13 Zuckerrüben zur Zuckergewinnun 1980 D4/N 36 113 135 22 159 314 240.0 ... 44.0 26.1 99.5 85.2 88.6 49.1 85.2 45.6 35.4 68.242857
14 Zuckerrüben zur Zuckergewinnun 1980 D5/N 48 126 138 12 235 340 180.0 ... 44.0 26.1 99.5 85.2 88.6 49.1 85.2 45.6 35.4 68.242857
15 Zuckerrüben zur Zuckergewinnun 1981 D5/N 48 105 129 24 223 300 335.0 ... 17.2 72.9 81.7 96.4 53.2 51.5 92.3 47.0 33.4 66.457143
16 Zuckerrüben zur Zuckergewinnun 1981 D4/N 36 114 132 18 232 318 303.7 ... 17.2 72.9 81.7 96.4 53.2 51.5 92.3 47.0 33.4 66.457143
17 Zuckerrüben zur Zuckergewinnun 1981 D5/N 48 114 131 17 218 289 335.0 ... 17.2 72.9 81.7 96.4 53.2 51.5 92.3 47.0 33.4 66.457143
18 Zuckerrüben zur Zuckergewinnun 1982 D5/N 48 109 129 20 180 274 225.0 ... 18.9 57.1 43.6 26.6 67.4 14.8 42.2 28.9 39.3 38.657143
19 Zuckerrüben zur Zuckergewinnun 1982 D4/N 36 105 129 24 277 301 350.0 ... 18.9 57.1 43.6 26.6 67.4 14.8 42.2 28.9 39.3 38.657143
20 Zuckerrüben zur Zuckergewinnun 1982 D5/N 48 106 129 23 226 293 230.0 ... 18.9 57.1 43.6 26.6 67.4 14.8 42.2 28.9 39.3 38.657143
21 Zuckerrüben zur Zuckergewinnun 1983 D4/N 36 143 154 11 121 293 228.0 ... 97.0 114.5 60.0 4.5 9.6 43.1 70.0 44.3 52.0 56.957143
22 Zuckerrüben zur Zuckergewinnun 1983 D5/N 48 127 138 11 177 302 194.1 ... 97.0 114.5 60.0 4.5 9.6 43.1 70.0 44.3 52.0 56.957143
23 Zuckerrüben zur Zuckergewinnun 1983 D5/N 48 159 171 12 100 297 108.4 ... 97.0 114.5 60.0 4.5 9.6 43.1 70.0 44.3 52.0 56.957143
24 Zuckerrüben zur Zuckergewinnun 1984 D4/N 36 103 123 20 150 282 350.0 ... 23.5 35.1 136.1 71.7 20.8 61.4 60.7 46.4 45.1 58.471429
25 Zuckerrüben zur Zuckergewinnun 1984 D5/N 48 105 125 20 182 298 265.9 ... 23.5 35.1 136.1 71.7 20.8 61.4 60.7 46.4 45.1 58.471429
26 Zuckerrüben zur Zuckergewinnun 1984 D5/N 48 105 125 20 194 326 280.0 ... 23.5 35.1 136.1 71.7 20.8 61.4 60.7 46.4 45.1 58.471429
27 Zuckerrüben zur Zuckergewinnun 1985 D5/N 48 128 140 12 97 298 380.0 ... 54.5 24.0 104.7 49.3 47.5 46.5 12.7 43.9 84.7 48.457143
28 Zuckerrüben zur Zuckergewinnun 1985 D5/N 48 129 141 12 97 298 325.0 ... 54.5 24.0 104.7 49.3 47.5 46.5 12.7 43.9 84.7 48.457143
29 Zuckerrüben zur Zuckergewinnun 1985 D5/N 48 127 140 13 174 304 330.0 ... 54.5 24.0 104.7 49.3 47.5 46.5 12.7 43.9 84.7 48.457143
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
4519 Zuckerrüben zur Zuckergewinnun 1988 Lö5 51 107 125 18 195 294 276.0 ... 21.4 37.4 58.4 71.1 52.1 55.0 25.0 83.7 121.3 45.771429
4520 Zuckerrüben zur Zuckergewinnun 1988 Lö6 46 106 126 20 191 306 285.0 ... 21.4 37.4 58.4 71.1 52.1 55.0 25.0 83.7 121.3 45.771429
4521 Zuckerrüben zur Zuckergewinnun 1988 Lö6 46 106 123 17 200 295 279.0 ... 21.4 37.4 58.4 71.1 52.1 55.0 25.0 83.7 121.3 45.771429
4522 Zuckerrüben zur Zuckergewinnun 1988 Lö4 56 98 120 22 200 293 280.0 ... 21.4 37.4 58.4 71.1 52.1 55.0 25.0 83.7 121.3 45.771429
4523 Zuckerrüben zur Zuckergewinnun 1989 Lö5 51 89 112 23 170 319 400.0 ... 66.2 31.8 48.7 72.6 73.2 50.3 32.8 79.5 40.9 53.657143
4524 Zuckerrüben zur Zuckergewinnun 1989 Lö6 46 95 116 21 170 309 386.0 ... 66.2 31.8 48.7 72.6 73.2 50.3 32.8 79.5 40.9 53.657143
4525 Zuckerrüben zur Zuckergewinnun 1976 V6 43 103 129 26 277 322 256.0 ... 21.9 46.0 52.3 36.0 22.9 36.7 29.8 52.2 23.8 35.085714
4526 Zuckerrüben zur Zuckergewinnun 1976 V6 43 107 130 23 210 319 130.0 ... 21.9 46.0 52.3 36.0 22.9 36.7 29.8 52.2 23.8 35.085714
4527 Zuckerrüben zur Zuckergewinnun 1977 Lö5 51 119 131 12 170 320 380.0 ... 68.6 36.6 170.7 102.7 131.9 77.6 35.8 97.7 29.8 89.128571
4528 Zuckerrüben zur Zuckergewinnun 1977 V6 43 119 131 12 124 316 300.0 ... 68.6 36.6 170.7 102.7 131.9 77.6 35.8 97.7 29.8 89.128571
4529 Zuckerrüben zur Zuckergewinnun 1978 V6 43 112 130 18 114 310 300.0 ... 22.8 165.0 111.0 65.6 136.5 92.2 64.0 15.9 63.2 93.871429
4530 Zuckerrüben zur Zuckergewinnun 1978 Lö6 46 107 128 21 84 321 310.0 ... 22.8 165.0 111.0 65.6 136.5 92.2 64.0 15.9 63.2 93.871429
4531 Zuckerrüben zur Zuckergewinnun 1979 Lö5 51 121 129 8 183 288 315.0 ... 50.2 28.9 81.2 76.9 38.9 106.4 15.7 53.7 75.8 56.885714
4532 Zuckerrüben zur Zuckergewinnun 1981 V6 43 100 117 17 105 331 350.0 ... 56.2 86.1 44.5 133.4 66.8 75.1 122.5 91.7 59.2 83.514286
4533 Zuckerrüben zur Zuckergewinnun 1981 V6 43 101 117 16 100 309 400.0 ... 56.2 86.1 44.5 133.4 66.8 75.1 122.5 91.7 59.2 83.514286
4534 Zuckerrüben zur Zuckergewinnun 1982 V6 43 105 130 25 219 294 260.0 ... 35.8 87.2 73.3 46.5 63.9 7.3 21.8 19.5 47.8 47.971429
4535 Zuckerrüben zur Zuckergewinnun 1983 Lö6 46 120 130 10 220 293 355.0 ... 96.5 56.0 72.0 25.1 198.6 34.2 11.1 35.0 26.1 70.500000
4536 Zuckerrüben zur Zuckergewinnun 1983 V6 43 117 130 13 220 303 300.0 ... 96.5 56.0 72.0 25.1 198.6 34.2 11.1 35.0 26.1 70.500000
4537 Zuckerrüben zur Zuckergewinnun 1987 Lö6 46 116 131 15 185 309 396.0 ... 73.1 83.4 96.1 79.6 63.9 76.2 12.7 61.7 71.9 69.285714
4539 Zuckerrüben zur Zuckergewinnun 1977 V6 43 128 141 13 115 316 540.0 ... 68.6 36.6 170.7 102.7 131.9 77.6 35.8 97.7 29.8 89.128571
4540 Zuckerrüben zur Zuckergewinnun 1978 Lö5 51 118 135 17 180 319 247.0 ... 22.8 165.0 111.0 65.6 136.5 92.2 64.0 15.9 63.2 93.871429
4541 Zuckerrüben zur Zuckergewinnun 1979 Lö5 51 124 136 12 190 334 320.0 ... 50.2 28.9 81.2 76.9 38.9 106.4 15.7 53.7 75.8 56.885714
4542 Zuckerrüben zur Zuckergewinnun 1979 V5 34 125 136 11 190 324 580.0 ... 50.2 28.9 81.2 76.9 38.9 106.4 15.7 53.7 75.8 56.885714
4544 Zuckerrüben zur Zuckergewinnun 1980 Lö5 51 134 144 10 200 332 290.0 ... 92.8 21.0 86.0 166.4 73.8 95.1 84.3 38.8 26.8 88.485714
4545 Zuckerrüben zur Zuckergewinnun 1980 Lö5 51 134 144 10 200 332 290.0 ... 92.8 21.0 86.0 166.4 73.8 95.1 84.3 38.8 26.8 88.485714
4546 Zuckerrüben zur Zuckergewinnun 1989 Lö5 51 94 110 16 180 307 395.0 ... 66.2 31.8 48.7 72.6 73.2 50.3 32.8 79.5 40.9 53.657143
4547 Zuckerrüben zur Zuckergewinnun 1989 Lö5 51 94 110 16 180 307 395.0 ... 66.2 31.8 48.7 72.6 73.2 50.3 32.8 79.5 40.9 53.657143
4548 Zuckerrüben zur Zuckergewinnun 1989 V6 43 81 114 33 230 299 345.0 ... 66.2 31.8 48.7 72.6 73.2 50.3 32.8 79.5 40.9 53.657143
4549 Zuckerrüben zur Zuckergewinnun 1989 V6 43 81 114 33 230 299 345.0 ... 66.2 31.8 48.7 72.6 73.2 50.3 32.8 79.5 40.9 53.657143
4550 Zuckerrüben zur Zuckergewinnun 1978 V6 43 118 135 17 180 318 247.0 ... 22.8 165.0 111.0 65.6 136.5 92.2 64.0 15.9 63.2 93.871429

4474 rows × 36 columns

Remove yield trend (optionally)


In [7]:
df['ERTRAG (dt/ha)']-=(2.867*(df['ERNTEJAHR']-1976))    # 2.867 with range correction
#df['ERTRAG (dt/ha)']-=(1.96*(df['ERNTEJAHR']-1976))    # 1.96 without range correction

In [8]:
# df['ERTRAG (dt/ha)']-=(0.752*(df['TAG_AUSSAAT']-75))    # remove the sowing date

Generate the training data TX, TY


In [9]:
Y=np.array(df['ERTRAG (dt/ha)'])
print np.mean(Y), np.std(Y)


286.104324105 92.0581543132

In [10]:
X=np.array([df['Mittlere Ackerzahl'],df['LT_6']+df['LT_7']+df['LT_8']+df['LT_9'],df['NI_6']+df['NI_7']+df['NI_8']+df['NI_9']])

In [11]:
X=X.T
print X.shape


(4551, 3)

In [12]:
index=np.arange(X.shape[0])
s=np.random.permutation(index)
sample=1000
TX=X[s[0:sample],:]
TY=Y[s[0:sample]]
print TX[0:10,:]
print TY[0:10]
print TX.shape


[[  48.    65.   205.5]
 [  59.    63.5  198.1]
 [  47.    65.3  226.5]
 [  51.    71.8  205. ]
 [  51.    70.7  225.5]
 [  36.    60.1  301.6]
 [  40.    67.5  212.9]
 [  75.    71.1  112. ]
 [  48.    57.8  273.1]
 [  48.    62.   207.9]]
[ 185.596  341.33   371.399  229.931  269.931  281.463  307.729  398.798
  182.763  241.33 ]
(1000, 3)


In [13]:
f1.set_trainX(TX)
f1.set_trainY(TY)

RSME before training


In [14]:
print f1.get_rmse(), f1.get_mae()


105.163314819 81.7564849854

Example before training


In [15]:
for i in range(10):
    print TX[i,:], TY[i],f1.calc3(TX[i,0],TX[i,1],TX[i,2])


[  48.    65.   205.5] 185.596 272.356445312
[  59.    63.5  198.1] 341.33 352.639312744
[  47.    65.3  226.5] 371.399 266.078857422
[  51.    71.8  205. ] 229.931 257.24331665
[  51.    70.7  225.5] 269.931 267.067199707
[  36.    60.1  301.6] 281.463 340.782867432
[  40.    67.5  212.9] 307.729 208.083587646
[  75.    71.1  112. ] 398.798 241.333328247
[  48.    57.8  273.1] 182.763 393.210083008
[  48.    62.   207.9] 241.33 319.429656982

Training


In [16]:
Fuzz.start_training(f1)


('minout:', [-100.0, 0.0, 100.0, 200.0, 300.0, 400.0, 500.0])
('maxout:', [100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 700.0])
('start:', [0.0, 100.0, 200.0, 300.0, 400.0, 500.0, 600.0])
 *************Result of Optimization*****************
('max:', 0.8820381164550781)
('parameter:', array([   0.        ,  166.66666667,  266.66666667,  300.        ,
        333.33333333,  433.33333333,  533.33333333]))

Example after training


In [17]:
for i in range(10):
    print TX[i,:], TY[i],f1.calc3(TX[i,0],TX[i,1],TX[i,2])


[  48.    65.   205.5] 185.596 291.189727783
[  59.    63.5  198.1] 341.33 317.52166748
[  47.    65.3  226.5] 371.399 290.390197754
[  51.    71.8  205. ] 229.931 285.747741699
[  51.    70.7  225.5] 269.931 289.022399902
[  36.    60.1  301.6] 281.463 313.511505127
[  40.    67.5  212.9] 307.729 269.361175537
[  75.    71.1  112. ] 398.798 280.44442749
[  48.    57.8  273.1] 182.763 355.124267578
[  48.    62.   207.9] 241.33 307.481262207

In [18]:
print f1.get_rmse(), f1.get_mae()


89.5490646362 66.2239379883

In [19]:
f1.store_model('zr_simple_t.fis')


Out[19]:
True

In [ ]: