梯度下降方法,求解问题 最入门思想

第一部分:求下面函数取得的最小值时,此时X的值是多少?

何为梯度下降,本质就是从该点切线方向,慢慢走下去。切线方向:就是给定一个很小的增量值,试探一下方向。

 1、方向的增量值:

2、不断迭代,当增量为很小时,意味着x应该是


#超参数
m=0.02
n=0.00000001
def fn(x):
    return 1/2*x*x-10*x

def getdivide(x):
    return (fn(x+0.00001)-fn(x))/0.00001


def getmixindex(x):
    a = x
    while True:
        y=a-m*getdivide(a)
        a=y
        if abs(m*getdivide(a))<n:break

    return a


print(getmixindex(100))






结果为:

  

 第二部分:使用pytorch 求f=ax+by 回归问题.

 数据存放为data.csv 使用pandas 读取,转为torch向量

1、处理好DataSet便以训练

2、构建模型

3、训练

import torch
from torch.utils.data import  Dataset,DataLoader
import pandas as pd


class MyDataSet(Dataset):
    def __init__(self,filename):
        datasource = pd.read_csv(filename, header=None)
        datasets = datasource.values
        x_source = torch.Tensor(datasets[:, :2])
        y_source = torch.Tensor(datasets[:, 3])


        self.x=x_source
        self.y=y_source
    def __getitem__(self, item):
        return self.x[item],self.y[item]
    def __len__(self):
        return len(self.x)



data=MyDataSet('data.csv')
dataloader=DataLoader(dataset=data,batch_size=4,shuffle=True)


class MyNet(torch.nn.Module):
    def __init__(self):
        super(MyNet,self).__init__()
        self.line=torch.nn.Linear(2,1,bias=False)

    def forward(self,x):
        return self.line(x)
    def getparam(self):
        for param in self.parameters():
            print(param)




mm=MyNet()


optim=torch.optim.Adam(params=mm.parameters(),lr=0.1)
lossfunction=torch.nn.MSELoss(reduction='sum')

print("前面结果")
mm.train()
print('参数',mm.getparam())
for j in range(1000):
    sum=0

    for i,data in enumerate(dataloader):

        x,y=data
        pred=mm(x)
        optim.zero_grad()
        loss=lossfunction(pred,torch.unsqueeze(y,1))
        loss.backward()
        print(optim.param_groups)
        optim.step()
        sum+=loss.item()
        break
    print(j+1,sum)



print("后面结果")
mm.eval()
print('参数',mm.getparam())







 最后显示出

 显然 a=3,b=-2可以满足,跟预先设置基本相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值