吴恩达机器学习第一章作业:线性回归,TASK1单变量线性回归(python实现)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
吴恩达机器学习第⼀章作业:线性回归,TASK1单变量线性回归
(python实现)
TASK1:单变量线性回归
data1表⽰的是⼈⼝的利润的关系,第⼀列表⽰的是⼈⼝(population),第⼆列表⽰的是利润(profit)。
我们要根据⼈⼝来预测利润,所以确定好了⼈⼝(population)是x,利润(profit)是y。
类似于:
x——(f) ——y
这种映射。
1、ploting the data
这个就不⽤多说了,直接有代码:
path = 'D:\python学习\吴恩达机器学习\ex1data1.txt'
data = pd.read_csv(path,names = ['population','profit'])
data.plot (kind='scatter',color = 'red',x = 'population',y = 'profit')#这⾥解释⼀下kind = ‘scatter’就是散点图的意思
plt.show()
实现的效果如图:
2、gradient descent 梯度下降
这⾥是实现优化的第⼀个难点,运⽤梯度下降来跟新theta
公式就如上图所写,接下来就是要⽤代码实现这个公式。
定义函数computecost 来计算cost的值
def computecost(x,y,theta):
h_x = x*theta.T #x经过处理之后是97⾏2列的向量,theta是x的权重,根据x的⼤⼩在变化
temp = np.power((h_x-y),2)
J_theta = np.sum(temp)/(2*len(x))
return J_theta
#不能直接计算J_theta,要⽤temp做中间变量,这⼀点⽼师在课中讲过了,现在不赘述
定义函数gradientdiscent,跟新theta的值(discent 定义函数的时候打错了,⼲脆将错就错)
def gradientdiscent(x, y, theta ,epoch, alpha):
temp = np.matrix(np.zeros(theta.shape))#临时变量,盛放之后的theta⽤的
cost = np.zeros(epoch)#为下⾯的cost【i】做准备⽤的
for i in range (epoch):
temp = theta-(alpha/len(x))*(x*theta.T-y).T*x
theta = temp
cost[i] = computecost(x,y,theta)
return theta,cost
#epoch是跟新的此数,每⼀次跟新都会遍历整个x的值,然后跟新⼀次theta
现在就知道了最好的theta 和最⼩的cost了。
3、算⼀下初始的cost有多少:(也就是theta=【0,0】时的cost值)
data.insert(0,'ones',1)
col = data.shape[1]#列数,同理data.shape[0]为⾏数
x = data.iloc[:,0:col-1]
y = data.iloc[:,col-1:col]
x = np.matrix(x.values)#这个操作是为了把x作为97⾏2列的⼤矩阵,拆分成97个1⾏2列的⼩矩阵,便于计算
y = np.matrix(y.values)#同理
theta = np.matrix([0,0])
print(computecost(x,y,theta))
计算出来的cost = 32.072733877455676
4、计算⼀下跟新theta之后的cost的值
alpha = 0.01
epoch = 1000
theta,cost = gradientdiscent(x,y,theta,epoch,alpha)
print(computecost(x,y,theta))
学习率alpha = 0.01
跟新次数epoch先设定成1000次,然后会酌情增加或者减少此数,这些都是根据cost⼤⼩来定的。
输出的最⼩cost = 4.515955503078914,应该是最⼩的cost值了,我们可以绘制predicted曲线了
5、绘制预测曲线
跟新之后的theta是⼀个⼀⾏两列的向量,theta的第⼀个元素是偏置b,theta的第⼆个元素是斜率k,根据这个我们可以得出预测曲线可以这么写:y = theta【0,0】+theta【0,1】*x
然后把图像表⽰出来就⾏了:
x= np.linspace(data.population.min(),data.population.max(),10) #先定下来x轴的坐标,x轴坐标定下来了y轴坐标也就⾃动定下来了function = theta[0,0]+theta[0,1]*x
fig,m =plt.subplots(figsize = (6,6))
m.plot(x,function,color='red',label = 'prediction') ##这是给图像设定⼀些参数
m.scatter(data['population'], data['profit'], label='Traning Data')
m.set_xlabel('population')
m.set_ylabel('profit')
plt.show()
得到的图线如下图;
6、绘制cost曲线,看跟新多少次之后cost变得最⼩了
fig,m = plt.subplots(figsize = (8,4))
m.plot(np.arange(epoch),cost,'r')##这⼀步是关键,内容变成了cost
m.set_xlabel('iter')
m.set_ylabel('cost')
plt.show()
结果如下图所⽰
TASK1结束
整段代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path = 'D:\python学习\吴恩达机器学习\ex1data1.txt'
data = pd.read_csv(path,names = ['population','profit'])
data.plot (kind='scatter',color = 'red',x = 'population',y = 'profit')
#plt.show()
def computecost(x,y,theta):
h_x = x*theta.T
temp = np.power((h_x-y),2)
J_theta = np.sum(temp)/(2*len(x))
return J_theta
data.insert(0,'ones',1)
col = data.shape[1]#列数
x = data.iloc[:,0:col-1]
y = data.iloc[:,col-1:col]
x = np.matrix(x.values)
y = np.matrix(y.values)
theta = np.matrix([0,0])
print(computecost(x,y,theta))
##上⾯都是完成了初始设置,得到初始的costfunction的结果是32左右,下⾯进⾏梯度下降def gradientdiscent(x, y, theta ,epoch, alpha):
temp = np.matrix(np.zeros(theta.shape))
cost = np.zeros(epoch)
for i in range (epoch):
temp = theta-(alpha/len(x))*(x*theta.T-y).T*x
theta = temp
cost[i] = computecost(x,y,theta)
return theta,cost
alpha = 0.01
epoch = 1000
theta,cost = gradientdiscent(x,y,theta,epoch,alpha)
print(computecost(x,y,theta))
##输出的costfunction为4.51,差不多是最⼩的cost值了
##接下来就是绘制拟合图线了
##theta[0,0]表⽰的是theta的第零⾏,第零列,为⼀个数字
x= np.linspace(data.population.min(),data.population.max(),10)
function = theta[0,0]+theta[0,1]*x
fig,m =plt.subplots(figsize = (6,6))
m.plot(x,function,color='red',label = 'prediction')
m.scatter(data['population'], data['profit'], label='Traning Data')
m.set_xlabel('population')
m.set_ylabel('profit')
plt.show()
##绘制epoch和cost关系
fig,m = plt.subplots(figsize = (8,4)) m.plot(np.arange(epoch),cost,'r') m.set_xlabel('iter')
m.set_ylabel('cost')
plt.show()。