1- from lpython import dataclass , i32 , f64 , TypeVar
2- from numpy import empty , float64
1+ from lpython import dataclass , i32 , f64
32from sys import exit
43
5- # from utils import init_zeros, dot_product
6-
74@dataclass
85class Perceptron :
96 no_of_inputs : i32
@@ -14,19 +11,43 @@ class Perceptron:
1411 cur_accuracy : f64
1512 epochs_cnt : i32
1613
17- def dot_product (a : list [f64 ], b : list [i32 ]) -> f64 :
18- result : f64 = 0.0
19- i : i32 = 0
20- for i in range (len (a )):
21- result = result + a [i ] * f64 (b [i ])
22- return result
14+ def normalize (value : f64 , leftMin : f64 , leftMax : f64 , rightMin : f64 , rightMax : f64 ) -> f64 :
15+ # Figure out how 'wide' each range is
16+ leftSpan : f64 = leftMax - leftMin
17+ rightSpan : f64 = rightMax - rightMin
18+
19+ # Convert the left range into a 0-1 range (float)
20+ valueScaled : f64 = (value - leftMin ) / leftSpan
21+
22+ # Convert the 0-1 range into a value in the right range.
23+ return rightMin + (valueScaled * rightSpan )
24+
25+ def normalize_input_vectors (input_vectors : list [list [f64 ]]):
26+ rows : i32 = len (input_vectors )
27+ cols : i32 = len (input_vectors [0 ])
2328
24- def get_inp_vec_with_bias (a : list [i32 ]) -> list [i32 ]:
25- b : list [i32 ]
29+ j : i32
30+ for j in range (cols ):
31+ colMinVal : f64 = input_vectors [0 ][j ]
32+ colMaxVal : f64 = input_vectors [0 ][j ]
33+ i : i32
34+ for i in range (rows ):
35+ if input_vectors [i ][j ] > colMaxVal :
36+ colMaxVal = input_vectors [i ][j ]
37+ if input_vectors [i ][j ] < colMinVal :
38+ colMinVal = input_vectors [i ][j ]
39+
40+ for i in range (rows ):
41+ input_vectors [i ][j ] = normalize (input_vectors [i ][j ], colMinVal , colMaxVal , - 1.0 , 1.0 )
42+
43+
44+
45+ def get_inp_vec_with_bias (a : list [f64 ]) -> list [f64 ]:
46+ b : list [f64 ]
2647 i : i32
2748 for i in range (len (a )):
2849 b .append (a [i ])
29- b .append (1 )
50+ b .append (1.0 )
3051 return b
3152
3253def init_weights (size : i32 ) -> list [f64 ]:
@@ -49,42 +70,45 @@ def init_perceptron(p: Perceptron, n: i32, rate: f64, iterations_limit: i32, des
4970 p .cur_accuracy = 0.0
5071 p .epochs_cnt = 0
5172
52- def train_perceptron (p : Perceptron , input_vector : list [i32 ], actual_output : i32 ):
73+ def train_perceptron (p : Perceptron , input_vector : list [f64 ], actual_output : i32 ):
5374 predicted_output : i32 = predict_perceptron (p , input_vector )
5475 error : i32 = actual_output - predicted_output
5576 i : i32
5677 for i in range (len (input_vector )):
5778 p .weights [i ] += p .learn_rate * f64 (error ) * f64 (input_vector [i ])
5879
59- def predict_perceptron (p : Perceptron , input_vector : list [i32 ]) -> i32 :
60- weighted_sum : f64 = dot_product (p .weights , input_vector )
80+ def predict_perceptron (p : Perceptron , input_vector : list [f64 ]) -> i32 :
81+ weighted_sum : f64 = 0.0
82+ i : i32 = 0
83+ for i in range (len (input_vector )):
84+ weighted_sum = weighted_sum + p .weights [i ] * f64 (input_vector [i ])
6185 return activation_function (weighted_sum )
6286
6387def activation_function (value : f64 ) -> i32 :
6488 if value >= 0.0 :
6589 return 1
6690 return - 1
6791
68- def train_epoch (p : Perceptron , input_vectors : list [list [i32 ]], outputs : list [i32 ]):
92+ def train_epoch (p : Perceptron , input_vectors : list [list [f64 ]], outputs : list [i32 ]):
6993 i : i32
7094 for i in range (len (input_vectors )):
71- input_vector : list [i32 ] = get_inp_vec_with_bias (input_vectors [i ])
95+ input_vector : list [f64 ] = get_inp_vec_with_bias (input_vectors [i ])
7296 if predict_perceptron (p , input_vector ) != outputs [i ]:
7397 train_perceptron (p , input_vector , outputs [i ])
7498
75- def train_dataset (p : Perceptron , input_vectors : list [list [i32 ]], outputs : list [i32 ]):
99+ def train_dataset (p : Perceptron , input_vectors : list [list [f64 ]], outputs : list [i32 ]):
76100 p .cur_accuracy = 0.0
77101 p .epochs_cnt = 0
78102 while p .cur_accuracy < p .des_accuracy and p .epochs_cnt < p .iterations_limit :
79103 p .epochs_cnt += 1
80104 train_epoch (p , input_vectors , outputs )
81105 p .cur_accuracy = test_perceptron (p , input_vectors , outputs )
82106
83- def test_perceptron (p : Perceptron , input_vectors : list [list [i32 ]], outputs : list [i32 ]) -> f64 :
107+ def test_perceptron (p : Perceptron , input_vectors : list [list [f64 ]], outputs : list [i32 ]) -> f64 :
84108 correctly_classified_cnt : i32 = 0
85109 i : i32
86110 for i in range (len (input_vectors )):
87- input_vector : list [i32 ] = get_inp_vec_with_bias (input_vectors [i ])
111+ input_vector : list [f64 ] = get_inp_vec_with_bias (input_vectors [i ])
88112 if predict_perceptron (p , input_vector ) == outputs [i ]:
89113 correctly_classified_cnt += 1
90114 return (correctly_classified_cnt / len (input_vectors )) * 100.0
0 commit comments