Я пытаюсь реализовать линейную регрессию методом градиентного спуска в Python.В моих результатах есть ошибка
Это метод получения пространств признаков
def quadratic (arg_row) :
poly_arr = []
for i in range(len(arg_row)):
poly_arr.append([float(arg_row[i][0])])
poly_arr[i].append(float(arg_row[i][1]))
poly_arr[i].append(float(arg_row[i][3]))
poly_arr[i].append(float(arg_row[i][0])**2)
poly_arr[i].append(float(arg_row[i][1])**2)
poly_arr[i].append(float(arg_row[i][1])*float(arg_row[i][0]))
return poly_arr
Я просто делаю это для квадратичного пространства
Это мой метод расчета градиентного спуска
def descent(features,train) :
m_val_avg = []
m_val_arr = []
m_val_avg_arr = []
weights =[]
rate = 0.001
precision = 0.000001
previous_step_size = 1
max_iters = 1000
iters = 0
for i in range(len(features[0])) : #weights initalization
weights.append(1)
print(weights)
while iters < max_iters :
m_val_avg_arr = []
my_new_list = []
current_weights = list(weights)
error_result = error_cal(features,current_weights,train)
square_errored = square_error(features,current_weights,train)
#print(error_result)
for j in range(len(features[0])) :
for i in range(len(features)):
m_val = error_result[i]*(-features[i][j])
m_val_arr.append(m_val)
m_val_avg = sum(m_val_arr)/len(m_val_arr)
m_val = []
m_val_avg_arr.append(m_val_avg)
#print(m_val_avg_arr)
for i in range(len(features[0])):
my_new_list = np.array(m_val_avg_arr)
my_new_list = my_new_list*rate
#print(my_new_list)
m_grad = current_weights[i]-my_new_list[i]
weights[i] = m_grad
iters = iters+1
print(iters)
print(square_errored)
Это мой метод расчета улучшенной разности ошибок для каждой итерации
def error_cal(features, weights, train) :
arr_actcal = []
diff_cal_result =[]
for j in range(len(features)) :
for i in range(len(features[0])) :
act_cal = features[j][i]*weights[i]
arr_actcal.append(act_cal)
diff_cal = ((train[j][2])-sum(arr_actcal))
diff_cal_result.append(diff_cal)
arr_actcal =[]
return diff_cal_result
Это мой метод вычисления квадратов ошибок для каждой итерации.
def square_error (features, weights, train) :
arr_actcal_squ = []
diff_cal_result_squ =[]
for j in range(len(features)) :
for i in range(len(features[0])) :
act_cal_squ = features[j][i]*weights[i]
arr_actcal_squ.append(act_cal_squ)
diff_cal_squ = ((train[j][2])-sum(arr_actcal_squ))
diff_cal_result_squ.append(diff_cal_squ)
new_square_error = np.array(diff_cal_result_squ)**2
new_square_error_avg = sum(new_square_error/len(new_square_error))
arr_actcal_squ =[]
return new_square_error_avg
Я делаю градиентный спуск 1000 раз.И на каждой итерации я улучшаю свой расчет ошибок.Из этого результата я вычисляю среднеквадратичную ошибку для каждой итерации.В идеале квадратичная ошибка должна продолжать уменьшаться, но для меня ошибка увеличивается, а затем уменьшается.Я не знаю, где я ошибаюсь в своем коде.
Это данные, для которых я рассчитываю линейную регрессию
6.4432,9.6309,50.9155,1
3.7861,5.4681,29.9852,1
8.1158,5.2114,42.9626,1
5.3283,2.3159,24.7445,1
3.5073,4.8890,27.3704,1
9.3900,6.2406,51.1350,1
8.7594,6.7914,50.5774,1
5.5016,3.9552,30.5206,1
6.2248,3.6744,31.7380,1
5.8704,9.8798,49.6374,1
2.0774,0.3774,10.0634,1
3.0125,8.8517,38.0517,1
4.7092,9.1329,43.5320,1
2.3049,7.9618,33.2198,1
8.4431,0.9871,31.1220,1
1.9476,2.6187,16.2934,1
2.2592,3.3536,19.3899,1
1.7071,6.7973,28.4807,1
2.2766,1.3655,13.6945,1
4.3570,7.2123,36.9220,1
3.1110,1.0676,14.9160,1
9.2338,6.5376,51.2371,1
4.3021,4.9417,29.8112,1
1.8482,7.7905,32.0336,1
9.0488,7.1504,52.5188,1
9.7975,9.0372,61.6658,1
4.3887,8.9092,42.2733,1
1.1112,3.3416,16.5052,1
2.5806,6.9875,31.3369,1
4.0872,1.9781,19.9475,1
5.9490,0.3054,20.4239,1
2.6221,7.4407,32.6062,1
6.0284,5.0002,35.1676,1
7.1122,4.7992,38.2211,1
2.2175,9.0472,36.4109,1
1.1742,6.0987,25.0108,1
2.9668,6.1767,29.8861,1
3.1878,8.5944,37.9213,1
4.2417,8.0549,38.8327,1
5.0786,5.7672,34.4707,1
Этомоя программа драйвера
#driver
result_fea = quadratic(data_row_str)
result = descent(result_fea,data_row_str)
# print("-----------------------------------")
print(result)
Я знаю, что здесь много математики.Я могу дать все формулы, которые я использую, если что-то не имеет смысла.Заранее спасибо