Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

nn.py 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import numpy as np
  2. import tensorflow as tf
  3. import pandas as pd
  4. import matplotlib.pyplot as plt
  5. import wilshire
  6. import tensorflow_addons as tfa
  7. from statsmodels.tsa.arima.model import ARIMA
  8. def snake(x):
  9. return(x+(tf.math.sin(50*x)**2)/50)
  10. def sinus(x):
  11. return(tf.math.sin(x))
  12. def sinus_cosinus(x):
  13. return(tf.math.sin(x)+tf.math.cos(x))
  14. def swish(x):
  15. return(x*tf.math.sigmoid(x))
  16. def arima_pred(y_train,y_test,orders=[[2,1,1],[2,2,1],[3,1,1],[2,1,2]],n=5):
  17. mse=[]
  18. for order in orders :
  19. mean_err=np.array()
  20. for k in range(n):
  21. train = y_train
  22. preds = []
  23. for test in range(len(y_test)):
  24. model = ARIMA(train, order=(order[0],order[1],order[2]))
  25. model = model.fit()
  26. output = model.forecast()
  27. preds.append(output[0])
  28. #train.append(y_test[te
  29. mean_err.append((np.square(np.array(preds) - np.array(y_test))).mean())
  30. mse.append(mean_err.mean())
  31. return(mse)
  32. #activations = [tf.keras.activations.relu,swish,sinus_cosinus,sinus,snake]
  33. activations = [snake]
  34. def prepare_data(filename="WILL5000INDFC2.csv"):
  35. df_train,df_test,index = wilshire.preprocess(filename)
  36. x_train = np.arange(df_train.shape[0])
  37. maximum = np.max(x_train)
  38. x_train = x_train / maximum
  39. y_train=df_train["WILL5000INDFC"]
  40. y_train.to_numpy()
  41. x_test = np.arange(df_train.shape[0]+1,df_train.shape[0]+df_test.shape[0]+1)
  42. y_test = df_test["WILL5000INDFC"]
  43. y_test.to_numpy()
  44. x_test=x_test / maximum
  45. return x_train,x_test,y_train,y_test
  46. def create_model(activation):
  47. model = tf.keras.Sequential()
  48. model.add(tf.keras.layers.Dense(1,input_shape=[1,],activation=activation))
  49. model.add(tf.keras.layers.Dense(64,activation=activation))
  50. model.add(tf.keras.layers.Dense(64,activation=activation))
  51. model.add(tf.keras.layers.Dense(1))
  52. opt = tf.keras.optimizers.SGD(learning_rate=0.01,momentum=0.9)
  53. model.compile(optimizer=opt, loss='mse')
  54. model.build()
  55. model.summary()
  56. return model
  57. def training_testing(n,activations):
  58. models = []
  59. errors_train,errors_test = [],[]
  60. mean_y_train,mean_y_test,std_y_test=[],[],[]
  61. for activation in activations :
  62. y_train_5=[]
  63. y_test_5=[]
  64. errors_train_5=[]
  65. errors_test_5=[]
  66. for k in range(n):
  67. model = create_model(activations)
  68. model.fit(x_train,y_train, batch_size=1, epochs=1)
  69. y_pred_test = model.predict(x_test)
  70. y_pred_train = model.predict(x_train)
  71. y_train_5.append(y_pred_train)
  72. y_test_5.append(y_pred_test)
  73. errors_test_5.append(model.evaluate(x_test,y_test))
  74. errors_train_5.append(model.evaluate(x_train,y_train))
  75. models.append(model)
  76. mean_y_train.append(np.mean(y_train_5,axis=0))
  77. mean_y_test.append(np.mean(y_test_5,axis=0))
  78. std_y_test.append(np.std(y_test_5,axis=0))
  79. errors_train.append([np.mean(errors_train_5),np.std(errors_train_5)])
  80. errors_test.append([np.mean(errors_test_5),np.std(errors_test_5)])
  81. # y_preds_train.append(y_pred_train)
  82. # y_preds_test.append(y_pred_test)
  83. return models,errors_train,errors_test
  84. def final_plot():
  85. x = np.arange(9000)
  86. x_n = x / maximum
  87. future_preds = model.predict(x_n) ## Calculated with a website the number of working days between 01-06-2020 and 01-01-2024
  88. #x=np.arange(df_train.shape[0]+df_test.shape[0]+908)
  89. y_true = np.concatenate((y_train,y_test))
  90. x_cut = np.arange(df_train.shape[0]+df_test.shape[0])
  91. plt.figure()
  92. plt.plot(x_cut,y_true,label="True data")
  93. plt.plot(x,future_preds,label="Predictions")
  94. plt.xticks(range(0, 9000, 250), range(1995, 2031, 1))
  95. plt.xlabel("Années")
  96. plt.ylabel("Index Willshire5000 normalisé")
  97. plt.vlines([index,index+85],ymin=0,ymax=1,colors="r",label="Test Samples")
  98. plt.legend()
  99. plt.show()