赞
踩
该数据集比较简单,但是数据相当的大。保留他原始形式是有必要的。我们通过数据标准化处理对他做简单的处理以降低问题的复杂度
标准化的数学公式为:
数据规范化详见这个博主的:https://blog.csdn.net/weixin_38706928/article/details/80329563
我使用的jupyter notebook编译器(数据导入jupyter notebook有两种方法,一种是直接在notebook就新建一个txt文本直接复制粘贴就好,第二种是通过本地文档上传文件详见:http://www.cnblogs.com/annage/p/9430394.html
代码实现:
- import numpy as np
- import matplotlib.pyplot as plt
- x,y=[], []
- for sample in open('prices.txt','r'):
- _x,_y=sample.split(',')#由于文件是用逗号个开的,所以调用split方法并将逗号作为参数传入。
- x.append(float(_x))
- y.append(float(_y))
- x,y=np.array(x),np.array(y)
- x=(x-x.mean())/x.std()
- plt.figure()
- plt.scatter(x,y,c='g',s=6)
- plt.show()
split用法详见:https://blog.csdn.net/meccaendless/article/details/78027012
运行结果为:
这就是第一步:数据预处理
通过目测,我们选择线性回归方程中的多项式拟合来得到结果,模型数序表达式如下:
其中
这里我做一个改进将损失函数改为常用均方误差的损失函数
对于大多数的机器学习算法,所谓的训练就是使得某个损失函数最小的过程。
- #在(-2,4,)这个区间上取100个点作为画图基础
- #deg参数代表着模型参数中的n,即返回模型中的多项式的次数
- #返回的模型能够输入根据输入的x0,返回预测相对应的预测的y
- x0=np.linspace(-2,4,10)
- def get_model(deg):
- return lambda input_x=x0:np.polyval(np.polyfit(x,y,deg),input_x)
polyfit(x,y,deg)就是多项式的拟合函数,返回最小参数的p,即多项式的各项系数
polyval(p,x):就是返回多项式y的值
为了简单,采用n=1,4,10进行估计,要想得到一个较好的模型,原理就是使得损失函数最小。
- #根据参数n,输入的x、y返回相对应的损失
- def get_cost(deg,input_x,input_y):
- return 1/input_x.size*((get_model(deg)(input_x)-input_y)**2).sum()
- test_set=(1,4,10)
- for d in test_set:
- #输出相应的损失
- print(get_cost(d,x,y))
结果是:
n=1: 4116265480.8660836 n=4: 4004783261.3479757 n=10: 3228716880.003951
可以看出n=10优于其他参数。
- #画出相应的图像
- plt.scatter(x,y,c='g',s=20)
- for d in test_set:
- plt.plot(x0,get_model(d)(),label="degree={}".format(d))
- #将坐标轴限制在一定的范围内
- plt.xlim(-2,4)
- plt.ylim(15,8e5)
- plt.legend()
- plt.show()
但我们可以从图中看出n=4时已经出现过拟合的现象。n=10就非常不合理了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。