吴恩达机器学习作业(单变量线性回归)---macxhet

对NG-单变量线性回归算法的代码重写

以下是一名课少闲的来学吴恩达的机器学习的大三菜鸡,对于第二章单变量线性回归部分作业的代码重现,如果您是初学者想理解机器学习课程的作业,这里可以给您一些启发理解
当然本人能力有限,代码肯定存在不完善,日后一定会继续改善更新

题目描述:在本部分的练习中,您将使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑不同的城市开设一个新的分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据。
您希望使用这些数据来帮助您选择将哪个城市扩展到下一个城市。
数据集链接(数据在第一个文件内,需要自己查找):ex1data.txt

第一步:导入相应库

import pandas as pd                    #导入pandas,numpy库
import numpy as ny
import matplotlib.pyplot as plt  
import seaborn as sns              #seaborn就是在matplotlib基础上面的封装,方便直接传参数调用

第二步:读取数据

df = pd.read_csv('D:\machine learning\Linear learing\data1\ex1data1.csv',names=['人口','利润'])
# pd.read_csv的作用是将csv文件读入并转化为数据框形式,有非常多的参数,用到时可查阅文档

这一步遇到的问题,首先read_csv读取的是csv文件,需要将txt类型转换为csv,其次,文件夹尽量保持英文习惯,否则中文也会报错

df.head()     #默认读取前五行,在这里查看一下自己读取的数据集

output:
人口 利润
0 6.1101 17.5920
1 5.5277 9.1302
2 8.5186 13.6620
3 7.0032 11.8540
4 5.8598 6.8233

df.info()      #查看索引等信息

output:
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 97 entries, 0 to 96
Data columns (total 2 columns):
人口 97 non-null float64
利润 97 non-null float64
dtypes: float64(2)
memory usage: 1.6 KB

第三步:数据可视化,绘制散点图观察原始数据

sns.lmplot('人口','利润',data=df,size=6,fit_reg = False)
#fit_reg:拟合回归参数,如果fit_reg=True则散点图中则出现拟合直线
plt.show()


第四步:计算代价函数(二重点之一,有小细节)
需要用到课程中的假设函数和代价函数公式

def computecost(X,y,theta):
    h = np.power((X*theta.T) - y,2)
    J = np.sum(h)/(2*len(X))             #分母记得加括号!!!否则,因为这个,计算顺序错误,代价函数无比大hhhh
    
    return J

提示:在写算法的过程中,括号的使用对算法执行顺序很重要,本人便因为括号的缺失导致代价函数的诡异庞大hh

以下一步同样重要,只有添加了这一列1,才能够让X与theta能够通过矩阵来进行运算

df.insert(0,'ONE',1)  #在第0列插入表头为“ONE”的列,数值为1

接下来是从数据集df中得到想要的X,y

X=df.iloc[:,0:2]    #2是取不到的
y = df.iloc[:,2:3]   #看提示

提示:y = df.iloc[:,2:3]而不是y = df.iloc[:,2],虽然看起来取得一样,但后者得到的是一行数据

X.head()

OUTPUT:
ONE 人口
0 1 6.1101
1 1 5.5277
2 1 8.5186
3 1 7.0032
4 1 5.8598

y.head()

OUTPUT:
利润
0 17.5920
1 9.1302
2 13.6620
3 11.8540
4 6.8233

接下来这一步很重要,本人经常遗漏并且不熟练

#代价函数是应该是numpy矩阵,所以我们需要转换X和Y,然后才能使用它们。 我们还需要初始化theta。
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))
computecost(X,y,theta)

OUTPUT:
32.072733877455676

第五步:梯度下降(来确定合适的theta)

1.梯度下降算法(最大的重点!)

def gradient_descent(X,y,theta,alpha,alters):
    temp=np.matrix(np.zeros(theta.shape))          #一开始没写,没初始化这两个,马上报错
    cost=np.zeros(alters)  ##初始化代价函数值为0数组,元素个数为迭代次数
    
    for i in range(alters):
        error = (X*theta.T) - y
        
        for j in range(2):
            term = np.multiply(error, X[:,j])
            #temp[0,j] = theta[0,j] - ((alpha * np.sum(term))/len(X))
            temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))  #!!导致最终结果千差万别的根源!!一定要按照顺序!!!
        
    theta = temp
    cost[i] = computecost(X,y,theta)
    
    return theta,cost

2.初始化变量

alpha=0.01
iters=1500

3.运行梯度下降算法 得到合适的theta

g,cost = gradientDescent(X,y,theta,alpha,,iters)  #让g,coat分别等于函数两个返回值
g

output:matrix([[-3.78806857, 1.18221277]])

cost

outputLarray([ 6.73719046, 5.93159357, 5.90115471, …, 4.47803526,
4.47803143, 4.47802761])

computecost(X, y, g) 

4.4780276098799705

第六步:绘制线性模型

x = np.linspace(df.人口.min(),df.人口.max(),100)#以人口最小值为起点,最大值为终点,创建元素个数为100的等差数列
f = g[0,0] + (g[0,1] * x) #f是假设函数H

fig, ax = plt.subplots(figsize=(12,8))#以其他关键字参数**fig_kw来创建图
#figsize=(a,b):figsize 设置图形的大小,b为图形的宽,b为图形的高,单位为英寸
ax.plot(x, f, 'r', label='Prediction')   #设置点的横坐标,纵坐标,用红色线,并且设置Prediction为关键字参数
ax.scatter(df.人口, df.利润, label='Traning Data')  #以人口为横坐标,利润为纵坐标并且设置Traning Data为关键字参数
ax.legend(loc=2)  #legend为显示图例函数,loc为设置图例显示的位置,loc=2即在左上方
ax.set_xlabel('Population')  #设置x轴变量
ax.set_ylabel('Profit')  #设置x轴变量
ax.set_title('Predicted Profit vs. Population Size') #设置表头
plt.show()

output:
在这里插入图片描述

第七步:代价数据可视化

ax=sns.tsplot(data=cost,err_style='ci_band',interpolate=False,ci=[10,50,90],n_boot=iters)  #函数参数解释见笔记
ax.set_xlabel("inters")
ax.set_ylabel("cost")
plt.show()

在这里插入图片描述

总结:线性回归算法是ML算法中的基础,代价函数和梯度下降算法是本篇的重点。
作为一名ML菜鸟,本人深刻感受到随着时间推移对于算法的进步理解,这也是令人喜悦吧,希望继续,go on




  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

maxchet

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值