机器学习的最小平方法

最小平方法基本概念

最小平方法(least squares method)是一种数学优化的方法,主要是使用最小误差的概念寻找最佳函数。

假设有n个数据,如下 所示:

(x1,y1),(x2,y2),...(xn,yn)

现在要找出下列线性函数:

y=f(x)=ax+b

让误差最小:

\varepsilon =(f(x1)-y1)^{2}+(f(x2)-y2)^{2}...(f(xn)-yn)^{2}

简单的企业实例

省略

机器学习建立含误差值的线性方程式

一元一次方程式:

y=ax+b

可以为各个数据点建立下列一元一次方程式:

y=ax+b+\varepsilon

三项和的平方公式:

(a+b+c)^{2}=a^{2}+b^{2}+c^{2}+2ab+2bc+2ac

代码如下:

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

实例应用

有一家便利商店记录了天气温度与饮料的销量,如下所示:

气温(单位:℃)22262328273230
销量(单位:杯)153521624810186

使用上述数据计算气温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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值