梯度下降法实现单变量线性回归拟合

梯度下降法实现单变量线性回归拟合,第1张

原理:

 编程:

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变成数组形式


总的来说,复现的时候,很多函数不清楚用法,得多积累咯!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/874806.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存