最小平方法基本概念
最小平方法(least squares method)是一种数学优化的方法,主要是使用最小误差的概念寻找最佳函数。
假设有n个数据,如下 所示:
现在要找出下列线性函数:
让误差最小:
简单的企业实例
省略
机器学习建立含误差值的线性方程式
一元一次方程式:
可以为各个数据点建立下列一元一次方程式:
三项和的平方公式:
代码如下:
import matplotlib.pyplot as plt
x = [x for x in range(0, 11)]
y = [7.5*y - 3.33 for y in x]
plt.axis([0, 4, 0, 25])
plt.plot(x, y)
plt.plot(1, 5, '-o')
plt.plot(2, 10, '-o')
plt.plot(3, 20, '-o')
plt.xlabel('Times:unit=100')
plt.ylabel('Voucher:unit=100')
plt.grid() # 加网格线
plt.show()
运行结果如下:
numpy实践最小平方法
numpy有一个polyfit()函数,可以使用此函数计算回归直接的数据,此函数用法如下所示:
ployfit(x,y,deg)
上述deg是多项式的最高次方,如果是一次多项式此值是1。
使用上一个数据 和numpy模块的ployfit()函数计算回归直接y=ax+b的系数a和b。
代码如下:
import numpy as np
x = np.array([1, 2, 3]) # 拜访次数, 单位是100
y = np.array([5, 10, 20]) # 销售考卷数, 单位是100
a, b = np.polyfit(x, y, 1)
print('斜率 a = {0:5.2f}'.format(a))
print('截距 a = {0:5.2f}'.format(b))
运行结果如下:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
斜率 a = 7.50
截距 a = -3.33
[Done] exited with code=0 in 0.726 seconds
绘制回归直接与所有的点。
代码如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3]) # 拜访次数, 单位是100
y = np.array([5, 10, 20]) # 销售考卷数, 单位是100
a, b = np.polyfit(x, y, 1) # 回归直线
print('斜率 a = {0:5.2f}'.format(a))
print('截距 a = {0:5.2f}'.format(b))
y2 = a*x + b
plt.scatter(x, y) # 绘制散布图
plt.plot(x, y2) # 绘制回归直线
plt.show()
运行结果如下:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
斜率 a = 7.50
截距 a = -3.33
[Done] exited with code=0 in 18.874 seconds
线性回归
y=7.5x-3.33
x称自变量(independent variable),y因为会随x而改变,所以y称因变量(dependent variable)。然后又将这类关系称线性回归模型(linear regression model)。
假设要达到2500张考卷销售,计算需要拜访客户几次,同时用图表表达。
import matplotlib.pyplot as plt
x = [x for x in range(0, 11)]
y = [7.5*y - 3.33 for y in x]
voucher = 25 # unit = 100
ans_x = (25 + 3.33) / 7.5
print('拜访次数 = {}'.format(int(ans_x*100)))
plt.axis([0, 4, 0, 30])
plt.plot(x, y)
plt.plot(1, 5, '-x')
plt.plot(2, 10, '-x')
plt.plot(3, 20, '-x')
plt.plot(ans_x, 25, '-o')
plt.text(ans_x-0.6, 25+0.2, '('+str(int(ans_x*100))+','+str(2500)+')')
plt.xlabel('Times:unit=100')
plt.ylabel('Voucher:unit=100')
plt.grid() # 加网格线
plt.show()
运行结果:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
拜访次数 = 377
[Done] exited with code=0 in 15.969 seconds
实例应用
有一家便利商店记录了天气温度与饮料的销量,如下所示:
气温(单位:℃) | 22 | 26 | 23 | 28 | 27 | 32 | 30 |
销量(单位:杯) | 15 | 35 | 21 | 62 | 48 | 101 | 86 |
使用上述数据计算气温31℃时的饮料销量,同时标记此图表。
import matplotlib.pyplot as plt
import numpy as np
x = np.array([22, 26, 23, 28, 27, 32, 30]) # 温度
y = np.array([15, 35, 21, 62, 48, 101, 86]) # 饮料销售数量
a, b = np.polyfit(x, y, 1) # 回归直线
print('斜率 a = {0:5.2f}'.format(a))
print('截距 a = {0:5.2f}'.format(b))
y2 = a*x + b
plt.scatter(x, y) # 绘制散布图
plt.plot(x, y2) # 绘制回归直线
sold = a*31 + b
print('气温31度时的销量 = {}'.format(int(sold)))
plt.plot(31, int(sold), '-o')
plt.show()
运行结果如下:
[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
斜率 a = 8.89
截距 a = -186.30
气温31度时的销量 = 89
[Done] exited with code=0 in 12.715 seconds