您的位置:首页 > 编程语言 > Python开发

python用最小二乘法分析数据趋势以及做数据预测

2017-11-08 11:36 1246 查看

1. 背景

目前有某个产品每天的销量数据,想通过这些数据看这个产品的销量趋势。

2. 原理

参考文章:

最小二乘法

http://blog.csdn.net/yang6464158/article/details/24477547

机器学习经典算法之—–最小二乘法

http://www.cnblogs.com/iamccme/archive/2013/05/15/3080737.html

最小二乘法的本质是什么?

https://www.zhihu.com/question/37031188

3. 代码

import numpy
from scipy.optimize import leastsq
import pylab

def zuixiaoerchen(arrayY, picTitle):
print(f"arrayY: {arrayY}")
print(f"picTitle: {picTitle}")

if len(arrayY) == 0:
return [0, 0, 0]

# 取得最大销量,作为纵坐标的峰值标准
maxValue = max(arrayY)

# 设置横坐标和纵坐标的值
# def arange(start=None, stop=None, step=None, dtype=None)
x = numpy.arange(1, len(arrayY) + 1, 1)

# def array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
y = numpy.array(arrayY)

# 第1個拟合,设置自由度為1 : (y = ax + b)
z = numpy.polyfit(x, y, 1)
# z: [  0.46428571  13.35238095]
print(f"z: {z}")

# 生成的多項式對象(y = ax + b)
p = numpy.poly1d(z)
# p: -0.1448x + 13.23
print(f"p: {p}")

if z[0] > 0:

# 绘制原曲线及 拟合后的曲线

# 原曲线 , 设置颜色(蓝色)和标签
pylab.plot(x, y, 'b^-', label='original sales growth')

# 自由度为1的趋势曲线, 设置颜色(蓝色)和标签
pylab.plot(x, p(x), 'gv--', label=f'y = {z[0]}x + {z[1]}')

# 设置图表的title
pylab.title(f"picTitle: {picTitle}")

# 设置横坐标,纵坐标的范围 [xmin=0, xmax=16, ymin=0, ymax=30]
pylab.axis([0, len(arrayY) + 1, 0, maxValue + 1])
pylab.legend()

# 保存成图片,需要提前创建文件夹 Growth,程序不会自动创建
pylab.savefig(f"Growth/{picTitle}.png", dpi=96)

# 清除图表设置,以防止曲线多次累计
# 如果不清除,那么在这个程序运行起见,多次调用这个函数时,会不断将之前的曲线累计到新图片中
pylab.clf()

return [z[0], z[1], maxValue]

if __name__ == '__main__':

# 用最小二乘法,生成销量趋势
sales = [10, 15, 8, 20, 16, 19, 11, 30, 21, 15, 19, 17, 16, 22, 17]
a, b, maxSale = zuixiaoerchen(sales, "sales Growth")
growth = a
maxSale = maxSale

print(f"growth = {growth}, maxSale = {maxSale}")

# 输出结果
arrayY: [10, 15, 8, 20, 16, 19, 11, 30, 21, 15, 19, 17, 16, 22, 17]
picTitle: sales Growth
z: [  0.46428571  13.35238095]
p:
0.4643 x + 13.35
growth = 0.4642857142857137, maxSale = 30


生成结果



4. 拓展

上例中,为了查看趋势采用的是一次方程,只需要看直线斜率判断趋势。 如果是要预测数据的话,那么模拟出来的曲线应该是越接近数据本身为好。而最小二乘法模拟的是一个多项式函数,理论上来讲,多项式指数越高(上面提到的自由度越大),越接近数据本身。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: