作为一个文科生,想学点数学学点编程学点算法真的太不容易了,线性回归是什么鬼??最小二乘法是什么鬼??看了一些课程之后竟然觉得更不懂了,网上的资料越看越晕。。所以我尽量用最简单易懂的方法来讲解。
一、简单线性回归
想象一个简化的场景:
小花想在一家商场开一家咖啡店,那她首先需要预测一下:开一家咖啡店可以赚钱吗?
于是小花开始计算收入和成本。
成本=房租+设备费+装修费+人工费+...
成本是可以量化的,但是收入要怎么算?
这个时候小花找到了一份数据,这是一份各个商场“日均人流量”和商场里同类型的”咖啡店日均销售收入”之间的关系的数据。(如下图)
各个商场“日均人流量”和商场里同类型的”咖啡店日均销售收入”之间的关系
但是这份数据还是不够直观,于是小花就把人流量和销售收入之间的关系,以散点图的形式画了出来。(如下图)
各个商场“日均人流量”和商场里同类型的”咖啡店日均销售收入”之间的关系
这下清楚了,这个散点图看起来就像是在画一条直线,在告诉我们,人流量每增加 1(千人),那么咖啡店的收入就会增加 几(千元)。
于是小花想到了线性回归。
线性回归:通俗的来讲就是,用一条直线来表示两个变量之间的关系。当有了这个关系,我们就能在知道某一个变量的情况下,能容易地推断出另一个变量的数值了。
在这个场景里,这两个变量就是“日均人流量”和“日均销售收入”。
这里就涉及到几个概念:
自变量:商场的日均人流量,一般用x来表示。
因变量:被预测的变量被称为因变量,就是咖啡店的日均销售收入,一般用y表示。
线性方程:y=kx+b,这些散点所描绘的这条近似的直线就是这个线性方程。
所以,【简单的线性回归】就是:
一个自变量和一个因变量,两者之间的关系可以用一条直线近似表示,这种回归被称为简单线性回归。
在这里先讲简单线性回归,不进行扩展,以免引入太多名词和概念增加难度。
二、最小二乘法
那么问题是,如何得到这条直线?
小花凭感觉随意画了几条线,到底哪条线才能准确体现自变量和因变量之间的关系呢?
这个时候就引入了最小二乘法。
我们通过线性回归可以估计出一个值,在这个场景里估计出来的值是“日均销售收入”,用^y(打不出这个符号,见下图),相应的实际销售收入用y表示。
我们希望^y 和y越相近越好,代表着我们估计的值越准确。
那我们就用实际值y减去估计值^y,再一个平方,再带队所有的样本求和。
(就是下图的公式)
我们希望这个值算出来越小越好(min)。
这就是所谓的最小二乘法。
最小二乘法
这个平方和越大,表示估计值和实际值差距越大;
这个平方和越小,表示估计值和实际值差距越小;
当平方和=0时,表示估计值和实际值完全相同。
所以,【最小二乘法】就是:
一种求解线性回归的方法。它是使得估计值和实际值之间的差的平方和最小的一种方法。
补充知识点:为什么要加平方?
平方误差,是因为预测值可能大于也可能小于实际值,从而分别产生负或正的误差。如果没有平方误差值,误差的数值可能会因为正负误差相消而变小,而并非因为模型拟合好。此外,平方误差会加大误差值,所以最小化平方误差可以保证模型更好。
三、用Python求解
问题又来了,怎么求解最小二乘法?
方法一:利用伟大的数学家们推导出来的公式。
详细的推导公式可以在网上搜一下,小花觉得太麻烦了,毕竟现在计算机技术如此发达。
方法二:利用工具。比如Python。
利用Python编程有一个好处,就是它可以提供多个库的渠道,使得我们可以快速读取数据、绘制数据和执行线性回归。
1. 导入库
首先导入必要的库。我们引入pandas库:
import pandas as pd
2. 读取数据
这个数据就是商场的日均人流量(Daily_flow_of_people(k))和咖啡店的日均销售收入(Daily_sales_revenue(k_yuan))的关系数据:
data = pd.read_excel("/Users/caiying/desktop/CAFE.xlsx")
3. 建模
在正式建模之前,首先查看一下数据。
可以利用 matplotlib(一个常用的Python绘制库)来画一个散点图。
import matplotlib.pyplot as plt
data.plot.scatter(x="Daily_flow_of_people(k)", y="Daily_sales_revenue(k_yuan)")
plt.show()
然后引入线性回归的库,在sklearn里:
from sklearn.linear_model import LinearRegression
定义我们的x值和y值:
x = data["Daily_flow_of_people(k)"].values.reshape(-1,1)
y = data[“Daily_sales_revenue(k_yuan)”].values.reshape(-1,1)
建立Regression的模型:
reg = LinearRegression()
model = reg.fit(x, y)
然后就可以查看这个线性方程y=ax+b的系数和截距值了。
查看截距(intercept是截距的意思,也就是b):
model.intercept_
查看系数(coefficient是系数的意思,也就是a):
model.coef_
所以,这个线性方程是:y=6.28763667x-1.19680404
那么,当我们知道一个 x 值,就能预测出相应的 y 值了。
比如,当商场的日均人流量(x)为10k时,我们可以输入:
model.predict([[10]])
当商场的日均人流量(x)为10k时,咖啡店的日均销售收入(y)为61k元。
其实到这边已经把简单线性回归和最小二乘法讲完了。
为了看起来更方便,也可以将数据拟合线可视化,在刚刚散点图的代码上加上预测出来的这根线:
predictions = model.predict(x)
plt.plot(x,predictions)
好了,讲完了。
希望一切复杂的知识都能以简单的形式传播。
感谢阅读,与君共勉。