假定数据符合的方程为y=ax+b,通过若干组[y, x]的值,设置参数取值范围。利用双层for循环,获取a和b的所有取值可能性,通过y的误差计算,来得到最优参数取值。
代码如下:
import numpy as np
class Exercise:
def __init__(self):
# 初始化参数
self.a = 0
self.b = 0
def cal(self, x_list):
# 计算y
y_cal = []
for x in x_list:
y = self.a * x + self.b
y_cal.append(y)
return y_cal
def check(self, y_true, x_list, min_error, range_1, range_2, step):
# 迭代参数取值,输出最小误差结果
a_list = []
b_list = []
best_ab_list = []
best_parameter = []
# 遍历a,b取值
for self.a in np.arange(range_1,range_2,step).round(1):
for self.b in np.arange(range_1,range_2,step).round(1):
# 计算y值
y_cal = self.cal(x_list)
# 计算误差
error_num = sum(list(map(lambda x, y: abs(x-y), y_true, y_cal)))
# 保存结果,将结果保存在字典中并存入列表
if error_num <= min_error:
dic = {
'a': self.a,
'b': self.b,
'error': error_num
}
best_ab_list.append(dic)
# 对结果排序
best_parameter = sorted(best_ab_list, key=lambda x: x['error'], reverse=False)
a_list.append(self.a)
b_list.append(self.b)
# 输出最优情况下参数取值和误差
print(best_parameter[0])
# 返回最优参数取值
return best_parameter[0]['a'], best_parameter[0]['b']
if __name__ == '__main__':
# 实例化
e1 = Exercise()
# 数据输入
y_true = [10, 15.6, 19.8, 24.9, 33.1, 56.7]
x_list = [3.4, 7.9, 8.2, 10.2, 14.2, 19.0]
# 误差定义
min_error = 100
a, b = e1.check(y_true, x_list, min_error, 0, 200, 0.1)
# 格式化输出结果
print('预测a,b值:[{},{}]'.format(a, b))
y_eval = []
for x in x_list:
y = a*x+b
y_eval.append(y)
print('计算y值:{}\n实际y值:{}'.format(y_eval, y_true))
代码中,min_erro要尽量取的大一点,若此值太小,可能导致无结果输出。参数a和b的取值范围根据实际数据假定,若范围过大,计算时间会略长。
此程序为python算法学习中的一个练习项目,如有错误,还望指正。