机器学习作业1——单变量线性回归(含免费代码)

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个样本):

mpgcyldisphpwtaccyearorigname
218.08318.0150.03436.011.0701plymouth
2326.04121.0113.02234.012.5702bmw 2002
5626.0491.070.001955.020.5711plymouth cricket
10018.06250.088.003021.016.5731ford maverick
11219.04122.085.002310.018.5731ford pinto
16421.06231.0110.03039.015.0751buick skyhawk
19529.0485.052.002035.022.2761chevrolet chevette
25920.86200.085.003070.016.7781mercury zephyr
32132.24108.075.002265.015.2803toyota corolla
36224.26146.0120.02930.013.8813datsun 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、遇到问题以及解决办法

  1. 在使用markdown写文档时,在本地插入图片能够成功预览,但是转换pdf时,图片总是转换失败无法显示。最终通过上网查阅资料,在vscode下载插件markdown pdf解决。
  2. 算法的编程实现刚开始还是有些困难,通过图书馆查阅书籍,阅读他人的代码学习最终成功跑通。
  3. 最开始对于算法原理的理解还不够明白,通过反复复习教材最后看懂了。
  4. 对于python的tensorflow库、matplotlib画图工具等还不够熟练,比如多张子图存在时我的图总是长宽不一致,不好看。最后通过借阅书籍,上网查资料学习解决。

声明:学习记录仅供参考

资源链接: 单变量线性回归

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪仔蛋黄酥

如果对您有所帮助的话欢迎打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值