Machine_Learning_homework1
作业:编程实现单变量线性回归(不是调用模型),包括解析解和梯度下降算法,要求画出E(w,b),Δw,Δb随着迭代次数的变化曲线。
编程完成后,提交文档报告到老师的QQ邮箱,报告包括但不限于:数据集,编程语言,基本原理,实现了哪些功能,相关曲线及说明,调试过程中遇到了哪些问题,是否解决以及怎样解决的。
独自完成,数据集不限,编程语言不限
目录
1、数据集
作业数据集使用的是美国加州大学机器学习数据集中的一个关于汽车油耗数据集来进行油耗分析,从UIC网站获取。
(1)数据处理
import pandas as pd
data=pd.read_csv('auto-mpg.data',sep='\s+',header=None)
print(data.shape)
data.columns=['mpg','cyl','disp','hp','wt','acc','year','orig','name']
df=data[data['hp']!='?']
print(df.sample(10).sort_index())
exportDF=df[['disp','mpg']]
exportDF.to_excel('mpg.xlsx',index=False)
通过简单的数据处理得到了数据集的可用数据如下(10个样本):
mpg | cyl | disp | hp | wt | acc | year | orig | name | |
---|---|---|---|---|---|---|---|---|---|
2 | 18.0 | 8 | 318.0 | 150.0 | 3436.0 | 11.0 | 70 | 1 | plymouth |
23 | 26.0 | 4 | 121.0 | 113.0 | 2234.0 | 12.5 | 70 | 2 | bmw 2002 |
56 | 26.0 | 4 | 91.0 | 70.00 | 1955.0 | 20.5 | 71 | 1 | plymouth cricket |
100 | 18.0 | 6 | 250.0 | 88.00 | 3021.0 | 16.5 | 73 | 1 | ford maverick |
112 | 19.0 | 4 | 122.0 | 85.00 | 2310.0 | 18.5 | 73 | 1 | ford pinto |
164 | 21.0 | 6 | 231.0 | 110.0 | 3039.0 | 15.0 | 75 | 1 | buick skyhawk |
195 | 29.0 | 4 | 85.0 | 52.00 | 2035.0 | 22.2 | 76 | 1 | chevrolet chevette |
259 | 20.8 | 6 | 200.0 | 85.00 | 3070.0 | 16.7 | 78 | 1 | mercury zephyr |
321 | 32.2 | 4 | 108.0 | 75.00 | 2265.0 | 15.2 | 80 | 3 | toyota corolla |
362 | 24.2 | 6 | 146.0 | 120.0 | 2930.0 | 13.8 | 81 | 3 | datsun 810 maxima |
(2)Excel简单的回归预测
本次作业主要对MPG(油耗1加仑汽油可行驶英里数)与disp(汽车发动机排量)数据进行线性回归分析
运用pyhton生成Excel文件对数据提前进行线性回归预测结果如下:
可以看出线性回归w=-0.0601,b=35.121,这个数据可以方便我们后面与自己的线性回归算法结果作比较。
2、算法以及实现过程
(1)最优闭式解
(2)数据处理
编程采用python语言3.9.12版本,使用anaconda、vscode集成开发环境。
源代码如下:
from mimetypes import init
import tensorflow as tf2
tf = tf2.compat.v1
tf.disable_v2_behavior()
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('auto-mpg.data',sep='\s+',header=None)
print(data.shape)
data.columns=['mpg','cyl','disp','hp','wt','acc','year','orig','name']
df=data[data['hp']!='?']
#小数定标归一化
x_data=data['disp'].values/1000
y_data=data['mpg'].values/100
data_count=len(x_data)
X=tf.placeholder(tf.float32, [data_count])
Y=tf.placeholder(tf.float32, [data_count])
#y=wx+b
w=tf.Variable(tf.random_uniform([1],-1.0,1.0)) #[-1,1]随机数
b=tf.Variable(tf.zeros([1])) #b=0
Y_pred=w*X+b
loss=tf.reduce_mean((Y_pred-Y)**2)
grad_w,grad_b=tf.gradients(ys=loss,xs=[w,b])
learning_rate=tf.constant(0.5) #学习率
update_w=tf.assign(w,w-learning_rate*grad_w)
update_b=tf.assign(b,b-learning_rate*grad_b)
init=tf.global_variables_initializer()
train_cycles=500 #迭代次数
print_cycles=50 #打印间隔
saved_data=[]
sess=tf.Session()
sess.run(init)
print('cycle w b loss')
print('============================')
#训练
for step in range(1,train_cycles+1):
new_w,new_b=sess.run([update_w,update_b],feed_dict={X:x_data,Y:y_data})
if step%print_cycles==0:
l=sess.run(loss,feed_dict={X:x_data,Y:y_data})
saved_data.append([step,l,new_w[0],new_b[0]])
print('{:5d},{:8.4f},{:8.4f},{:8.4f}'.format(step,new_w[0],new_b[0],l))
sess.close
#画图
df=pd.DataFrame(saved_data,columns=['cycle','loss','w','b'])
df.cycle=df.cycle.map(lambda i:str(int(i)))
df.set_index('cycle',inplace=True)
df.w=df.w*100/1000
df.b*=100
plt.figure()
plt.plot(df.loss)
plt.title('loss')
plt.savefig('./loss.jpg')
plt.figure(figsize=(10,5))
plt.subplot(1,2,1)
plt.title('w')
plt.plot(df.w)
plt.subplot(1,2,2)
plt.title('b')
plt.plot(df.b)
plt.savefig('./w_and_b.jpg')
def graph(formula,x_range):
x=np.array(x_range)
y=eval(formula)
plt.plot(x,y,color='r')
plt.figure(figsize=(12,12))
for i in range(9):
plt.subplot(3,3,i+1)
f='{:.4f}*x+{:.4f}'.format(df.w[i],df.b[i])
plt.plot(data['disp'],data['mpg'],'b.')
graph(f,range(70,450))
plt.text(200,30,f,fontdict={'size':12})
plt.xlabel('step='+df.index[i])
plt.savefig('./gradient_descent.jpg')
plt.show()
(3)相关曲线及说明
loss函数E(w,b)
- 由图可见随着迭代次数的增加,损失函数(未乘以1/2m)数值越变越小,当迭代次数达到300次以上后(学习率r=0.5),损失函数基本不再变化。
w and b 函数图像
- 随着迭代次数的增加,deta_w与deta_b越来越小,最终接近于0,w和b逐渐接近某一个值然后趋于稳定。
线性回归迭代过程函数
- 随着迭代次数增加,Y_pred函数的斜率也逐渐发生变化,最终经过500次迭代后w=-0.0590;b=34.9156这与Excel结果w=-0.0601,b=35.121相接近,说明此次线性回归算法较为成功。
这些数据分析也说明,对于大部分汽车而言,汽车排量越小,越省油,汽车油耗数据与汽车排量数据是有较强的线性关系的。
3、遇到问题以及解决办法
- 在使用markdown写文档时,在本地插入图片能够成功预览,但是转换pdf时,图片总是转换失败无法显示。最终通过上网查阅资料,在vscode下载插件markdown pdf解决。
- 算法的编程实现刚开始还是有些困难,通过图书馆查阅书籍,阅读他人的代码学习最终成功跑通。
- 最开始对于算法原理的理解还不够明白,通过反复复习教材最后看懂了。
- 对于python的tensorflow库、matplotlib画图工具等还不够熟练,比如多张子图存在时我的图总是长宽不一致,不好看。最后通过借阅书籍,上网查资料学习解决。
声明:学习记录仅供参考
资源链接: 单变量线性回归