数据拟合实际应用

之前我们已经学习了很多关于监督学习的算法,但是最近博主在看有关于数据分析的书籍的时候,忽然觉得在实际应用中,我们很少会用得到机器学习,数据挖掘方面的东西。我们所需要做的就是得到实际生活中的数据,并找出数据之间的关系,然后再根据这个关系去做一些运营,决策等行为,仅此而已。所以这篇我要说一下关于数据拟合的一些东西。(其实与监督学习的那些算法相比,数据拟合可以说是非常简单了。)

简介

数据拟合又称曲线拟合,俗称拉曲线,是一种把现有数据透过数学方法来代入一条数式的表示方式。科学和工程问题可以通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,我们往往希望得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合,这过程就叫做**拟合(fitting)**。

PS:上面的解释是从百度上抄的。

用通俗一点的话来说,就是我们通过某种方法得到了一些未知关系的数据,然后找到一条函数曲线,来表达数据之间的关系,并保证大部分的数据点可以落在曲线上。

这里我说一下用python来实现多项式拟合数据的方法。网上还有用最小二乘法和高斯算法来进行数据拟合的方法,但是实际工作中并不需要这么复杂的应用,所以这里就不再赘述了,感兴趣的朋友可以自行学习。

数据拟合

而我之所以要说多项式拟合数据,最重要的原因便是数学上可以证明,任意函数都可以表示为多项式形式

接下来,我们将数据拟合成2次多项式,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
x=[10,20,30,40,50,60,70,80]#定义x、y散点坐标
x=np.array(x)
print('自变量x :\n',x)
y=np.sin(x)+np.tan(x)#三角函数任意加减
print('因变量y :\n',y)
f=np.polyfit(x,y,2)# 用2次多项式拟合,可改变多项式阶数
print('多项式系数:\n',f)
p=np.poly1d(f)#得到多项式系数,按照阶数从高到低排列
print('多项式表达式:\n',p)
#也可使用yvals=np.polyval(f1, x)
yvals = p(x) #求对应x的各项拟合函数值
print('函数拟合出来的数值:\n',yvals)

在这里插入图片描述

我们将拟合出来的函数用图像表示出来:

1
2
3
4
5
6
7
8
9
10
11
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']###防止中文显示不出来
plt.rcParams['axes.unicode_minus'] = False###防止坐标轴符号显示不出来
plt.figure(figsize=(10,8))
plot1=plt.plot(x,y,'s',label='原对应值')
plot2=plt.plot(x,yvals,'r',label='拟合函数')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('数据拟合')
plt.show()

在这里插入图片描述

之前我有提到,任意函数都可以表示为多项式形式。而如果拟合效果不理想,那只能说明多项式的次数不够,接下来我们试试拟合成7次多项式:

1
2
3
4
5
6
7
8
9
10
11
f=np.polyfit(x,y,7)
p=np.poly1d(f)
yvals = p(x)
plt.figure(figsize=(10,8))
plot1=plt.plot(x,y,'s',label='原对应值')
plot2=plt.plot(x,yvals,'r',label='拟合函数')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('数据拟合')
plt.show()

在这里插入图片描述

可以看出结果较之前好了不少。

实际应用

其实我之所以写下这篇文章便是因为最近看书的时候,看到了一个星巴克关于咖啡市场的A/B实验。这个实验是想要验证某富人区,咖啡价格对于新客户转化率的影响,并根据影响执行相应的运营决策。在这个实验中,我们只知道咖啡价格以及该区域门店的客户转化率:

咖啡单价—10,20,30,40,50,60,70,80

客户转化率—2.30258509, 2.99573227, 3.40119738, 3.68887945, 3.91202301,4.09434456, 4.24849524, 4.38202663

看到这个实验,我的第一反应就是用监督学习里面的逻辑回归去进行拟合建模。可是转念一想,貌似并没有必要搞的这么复杂,我只需要将这两个数据之间的关系用一个多项式函数表示出来就可以了。

PS:或许这个函数的次数会非常高,系数也会非常复杂,但是那有怎么样,反正也不是人工手算,有什么头痛难解的计算统统丢给电脑就可以了,不然的话我学编程干什么。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
log_y=np.array([2.30258509, 2.99573227, 3.40119738, 3.68887945, 3.91202301,4.09434456, 4.24849524, 4.38202663])
f=np.polyfit(x,log_y,2)# 用6次多项式拟合,可改变多项式阶数
p=np.poly1d(f)#得到多项式系数,按照阶数从高到低排列
#也可使用yvals=np.polyval(f1, x)
yvals = p(x) #求对应x的各项拟合函数值
plt.figure(figsize=(10,8))
plot1=plt.plot(x,log_y,'s',label='原对应值')
plot2=plt.plot(x,yvals,'r',label='拟合函数')
plt.xlabel('价格提高')
plt.ylabel('客户转化率')
plt.legend(loc=4) #指定legend的位置右下角
plt.title('A/B测试')
plt.show()

在这里插入图片描述

结果如上所示,可以看出随着价格的提高,新客户转化率是逐渐提高的(该说真不愧是有钱人),但是转化率的增长速度是逐渐降低的

也就是说,当咖啡价格提高到一定程度的时候,富人们便不会再倾心于昂贵的咖啡。而星巴克所需要做的便是要找出这个价格的临界值,并在该区域根据这个价格展开一些运营手段。这样做既可以最高限度地提高新客户转化率,同时也能将销售利润最大化。

PS:这就是数据分析的魅力所在。

总结

数据拟合是用来观察某一自变量归对因变量造成的影响,或者是二者之间的关系,适用于x与y的这种一对一关系:

y=ax^n+bx^(n-1)+…+mx^2+n*x+d

x-自变量 y-因变量

而在数据挖掘/机器学习中,我们往往探讨多个特征值对目标值的共同作用,单独的去研究每个特征值的影响是非常麻烦的,而且用数据拟合去处理是非常片面的,因为有些特征值之间也会相互作用:

y=w[0]x[0]+w[1]x[1]+w[2]x[2]+…+w[p]x[p]+b

这里x[0]到x[p]表示耽搁数据点的特征(本例中特征个数为p+1),w和b是学习模型的参数,y是预测结果

有很多地方做的不是很好,欢迎网友来提出建议,也希望可以遇到些朋友来一起交流讨论。