机器学习,通俗简单来说,就是用某些算法指导计算机模拟或实现人类的学习行为从已有的数据总结规律获得“经验”并不断改善自身性能的一个过程。由此可见,算法和数据是计算机学习到“新知识”或“新技能”的关键所在。
1.谈谈“回归”一词的起源
十九世纪八十年代,高尔顿和他的学生、现代统计学奠基人之一的皮尔逊(Pearson)收集了1078对父亲及其1个成年儿子的身高数据,根据调查数据作出散点图后发现,个子高的父亲确有生出个子高的儿子的倾向;同样个子矮的父亲也有生出个子矮的儿子的倾向。高尔顿研究后还发现,这1078个父亲的身高平均值为68英寸,1078个儿子的身高平均值是69英寸。一种自然的想法是:如果父亲的身高是x英寸,那么他儿子的身高平均来说大致是x+1英寸。但高尔顿在研究时发现,当父亲的身高是72英寸时,他们的儿子的平均身高仅为71英寸,并没有达到73英寸。他同时还发现,身高只有64英寸的父亲其儿子的平均身高为67英寸,竟然比预期的65英寸高了2英寸。由此他得出结论:尽管高父亲往往生出高儿子,矮父亲大多生出爱矮儿子,但”儿子们“的身高有向全体男子身高的平均值靠近的趋势,即子代身高有向平均值”回归“的倾向。高尔顿的解释是:大自然具有一种约束力,使得人类身高的分布在一定时期内相对稳定而不产生两极分化,这就是所谓的”回归“效应。通过这一例子,高尔顿引入了”回归“(reversion,后来慢慢演变成regression)一词。
2.机器学习中的回归
在统计学中,回归分析是确定两种或两种以上的变量间相互依赖的定量关系的一种统计分析方法。在机器学习中,回归用于预测输入变量和输出变量之间的关系,特别是当输入变量的值发生变化时,输出变量的值随之发生的变化。回归模型正是表示从输入变量到输出变量之间映射的函数,回归问题等价于函数拟合:选择一条函数曲线使其很好地拟合已知数据且很好地预测未知数据。回归问题常用于预测连续的值,如预测房价、未来的天气情况等等。
3.回归算法入门之学习参数
给出一个数组x,然后基于表达式 y = 2x^2+3x+10,加上一些噪音数据到达另一组数据y。然后,构建一个机器学习模型,利用数组x,y 的数据为训练数据,学习表达式y = w0*x^2+w1*x+b的三个参数w0、w1、b。
代码如下:
from matplotlib import pyplot as plt import torch # 拟合 y = 2x^2+3x+10 x = torch.linspace(-1, 1, 100).reshape(100, 1) y = 2 * torch.pow(x, 2) + 3 * x + 10 + 0.2 * torch.rand(x.size()).reshape(100, 1) w0 = torch.randn(1, 1, requires_grad=True) w1 = torch.randn(1, 1, requires_grad=True) b = torch.randn(1, 1, requires_grad=True) lr = 0.005 #学习率 for i in range(1000): # 前向传播 y_pred = w0 * torch.pow(x, 2) + w1 * x + b + 0.2 * torch.rand(x.size()).reshape(100, 1) # 反向传播 loss_arr = 0.5 * (y - y_pred) ** 2 loss = loss_arr.sum() # 损失 loss.backward()# 反向传播求w0,w1,b梯度 with torch.no_grad(): w0 -= lr * w0.grad w1 -= lr * w1.grad b -= lr * b.grad w0.grad.zero_()#每训练一次,梯度要清0 w1.grad.zero_() b.grad.zero_() print("w0 is {},w1 is {},b is {}".format(w0, w1, b)) plt.scatter(x, y, c='b', marker='o', label='True') plt.plot(x, y_pred.detach().numpy(), 'r-', label='Pred') plt.legend() plt.show()
运行结果:
(1)学习到的参数很接近表达式的参数
(2)模型很好的拟合了基于表达式产生的数据点