原理:
编程:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
#成本函数
def computeCost(X,y,theta):
cost=np.power((X*theta.T)-y,2)
return np.sum(cost)/(2*len(X)) #对应J
#梯度下降
def gradientDecent(X,y,theta,alpha,iters):
cost=np.zeros(iters)#初始化并存储J
temp=np.matrix(np.zeros(theta.shape))#初始化并作中间变量方便我们更新theta的时候传参
parameters=int(theta.shape[1])#参数的数目,因为要对theta0和theta1分别迭代
for i in range(iters):
error= (X * theta.T) - y
for j in range(parameters):
term=np.multiply(error,X[:,j])
d_theta=np.sum(term)/len(y)#写成向量的形式不就方便用np.sum函数求和了吗哈哈
temp[0,j]=temp[0,j]-alpha*d_theta#theta的更新
theta=temp#更新完传回给theta
cost[i]=computeCost(X,y,theta)
return theta,cost
if __name__=='__main__':
########导入数据集#############
data = pd.read_csv(
'D:\Pycharm\Project\deep_learning\Coursera-ML-AndrewNg-Notes-master\Coursera-ML-AndrewNg-Notes-master\code\ex1-linear regression\ex1data1.txt',
header=None, names=['Population', 'Profit'])
data.insert(0, 'ones', 1)#在第一列插入全1向量构造X矩阵
X = data.iloc[:, 0:(data.shape[1] - 1)]#分离第一列和第二列的元素
y = data.iloc[:, (data.shape[1] - 1):data.shape[1]]#分离第三列的元素
X = np.matrix(X.values)
y = np.matrix(y.values)
###########初始化参数###########
theta=np.ones((1,2));alpha=0.01;iters=1000
#梯度下降迭代拟合
g,cost=gradientDecent(X,y,theta,alpha,iters)
############作图################
#拟合的曲线
x=np.linspace(data.Population.min(),data.Population.max(),100)#抽样来画拟合后的曲线(原来997个输入数据,这里只画100个连成线)
f=(g[0,1]*x)+g[0,0]
#plt.figure()
#数据集的散点图
fig,ax=plt.subplots(figsize=(12,8))
ax.plot(x, f,'r',label='Prediction')
ax.scatter(data.Population,data.Profit,label='Training Data')
ax.legend(loc=4)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predict vs data')
#成本函数的迭代过程图
plt.figure()
plt.plot(np.arange(1000),cost)
plt.show()
我在编程时的一些思考:
导入数据集后由于pandas的缘故,数据集格式是Dataframe。而我想要的是矩阵或者向量,所以我开始想着
data=np.array(data)
来转换成数组形式。
以及插入1向量时,我开始想这么插:
data=np.append(data,np.ones((97,1)),axis=1)
但是这么是在最后插,不是插在第一列。
收获:
np.matrix()函数将输入的数组或者字符串形式转换成矩阵
np.multiply()函数将两个向量作哈达玛积
np.sum()对数组求和
pd.read_cv()后可使用insert函数插值
data.iloc()函数分离矩阵元素
X.values将Dataframe变成数组形式
总的来说,复现的时候,很多函数不清楚用法,得多积累咯!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)