-
Notifications
You must be signed in to change notification settings - Fork 0
/
grey_model.py
71 lines (53 loc) · 2.26 KB
/
grey_model.py
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
from typing import Tuple, List
import numpy as np
def fit(real_data: List[float]) -> List[float]:
a, b = _get_coefficient(real_data)
output_list = []
for i in range(len(real_data)): # X(1)(k) = (X(0)(1) - b/a) * e^(-a(k-1)) + (b/a)
output_list.append((real_data[0] - b / a) * np.exp(-a * i) + b / a)
output_list = [el - output_list[i - 1] if i > 0 else el for i, el in enumerate(output_list)] # inverse of cumulative sum
return output_list
def _get_coefficient(real_data: List[float]) -> Tuple[float, float]:
"""
Get coefficient a, b for the function of the model.
"""
y_cum_sum = np.cumsum(real_data)
b = []
for i in range(len(real_data) - 1): # (-1/2)(X(1)(n-1) + X(1)(n))
b.append([-0.5 * (y_cum_sum[i] + y_cum_sum[i + 1]), 1])
# ((B^T)B)^(-1) * (B^T) * y
b = np.array(b)
b_t = np.transpose(b)
output = np.linalg.inv(np.dot(b_t, b))
output = np.dot(output, b_t)
y = np.transpose(real_data[1:])
output = np.dot(output, y)
output = np.transpose(output)
return output[0], output[1]
def get_precision(real_data: List[float], pred_data: List[float]) -> float:
real_corr = 0
for i in range(1, len(real_data) - 1):
real_corr += real_data[i] - real_data[0]
real_corr += (real_data[-1] - real_data[0]) / 2
real_corr = np.abs(real_corr)
pred_corr = 0
for i in range(1, len(pred_data) - 1, 1):
pred_corr += pred_data[i] - pred_data[0]
pred_corr += (pred_data[-1] - pred_data[0]) / 2
pred_corr = np.abs(pred_corr)
sub_corr = 0
for i in range(1, len(pred_data) - 1, 1):
sub_corr += (real_data[i] - real_data[0]) - (pred_data[i] - pred_data[0])
sub_corr += ((real_data[-1] - real_data[0]) - (pred_data[-1] - pred_data[0])) / 2
sub_corr = np.abs(sub_corr)
return (1 + real_corr + pred_corr) / (1 + real_corr + pred_corr + sub_corr)
def main():
try:
real_data = list(map(float, input("Enter the real data separated by space: ").strip().split()))
predict_data = fit(real_data)
print("Predict data: " + str(predict_data))
print("Precision: " + str(get_precision(real_data, predict_data)))
except ValueError:
print("Please input the right format!")
if __name__ == "__main__":
main()