在python中实现次梯度随机下降

在python中实现次梯度随机下降,python,machine-learning,gradient-descent,Python,Machine Learning,Gradient Descent,我想用一个代价函数实现次梯度和随机下降,计算为数据找到一个完美分类器所需的迭代次数,以及权重(w)和偏差(b)。 数据集是四维的 这是我的成本函数 我得到了成本函数的导数,这里是: 当我运行我的代码时,我会遇到很多错误,请有人帮忙 这是我用python编写的代码 import numpy as np learn_rate = 1 w = np.zeros((4,1)) b = 0 M = 1000 data = '/Users/labuew/Desktop/dataset.data' #

我想用一个代价函数实现次梯度和随机下降,计算为数据找到一个完美分类器所需的迭代次数,以及权重(w)和偏差(b)。 数据集是四维的

这是我的成本函数

我得到了成本函数的导数,这里是:

当我运行我的代码时,我会遇到很多错误,请有人帮忙

这是我用python编写的代码

import numpy as np

learn_rate = 1
w = np.zeros((4,1))
b = 0
M = 1000

data = '/Users/labuew/Desktop/dataset.data'

#calculating the gradient

def cal_grad_w(data, w, b):
    for i in range (M):
        sample = data[i,:]
        Ym = sample[-1]
        Xm = sample[0:4]
        if -Ym[i]*(w*Xm+b) >= 0:
            tmp = 1.0
        else:
            tmp = 0
        value = Ym[i]*Xm*tmp
        sum = sum +value
    return sum
def cal_grad_b(data, w, b):
    for i in range (M):
        sample = data[i,:]
        Ym = sample[-1]
        Xm = sample[0:4]
        if -Ym*(w*Xm+b) >= 0:
            tmp = 1.0
        else:
            tmp = 0
        value = Ym[i]*x*tmp
        sum = sum +value
    return sum

if __name__ == '__main__':
    counter = 0
    while 1:
        counter +=1
        dw = cal_grad_w(data, w, b)
        db = cal_grad_b(data, w, b)
        if dw == 0 and db == 0:
            break
        w = w - learn_rate*dw
        b = b - learn_rate *dw
    print(counter,w,b)


是否缺少numpy加载功能

data=np.load('/Users/labuew/Desktop/dataset.data')

看起来你在做字符串上的数字运算

还有4个维度意味着Ym=Xm[3]?您的数据是否为2级,第二级为维度5?[0:4]包括第四维度,即

z = [1,2,3,4]
z[0:4] = [1,2,3,4]
这是我最好的猜测。我对您的数据格式进行了一些有根据的猜测

import numpy as np

learn_rate = 1
w = np.zeros((1,4))
b = 0
M = 1000

#Possible format
#data = np.load('/Users/labuew/Desktop/dataset.data')

#Assumed format
data = np.ones((1000,5))

#calculating the gradient

def cal_grad_w(data, w, b):
    sum = 0
    for i in range (M):
        sample = data[i,:]
        Ym = sample[-1]
        Xm = sample[0:4]
        if -1*Ym*(np.matmul(w,Xm.reshape(4,1))+b) >= 0:
            tmp = 1.0
        else:
            tmp = 0
        value = Ym*Xm*tmp
        sum = sum +value
    return sum.reshape(1,4)
def cal_grad_b(data, w, b):
    sum = 0 
    for i in range (M):
        sample = data[i,:]
        Ym = sample[-1]
        Xm = sample[0:4]
        if -1*Ym*(np.matmul(w,Xm.reshape(4,1))+b) >= 0:
            tmp = 1.0
        else:
            tmp = 0
        value = Ym*tmp
        sum = sum +value
    return sum

if __name__ == '__main__':
    counter = 0
    while 1:
        counter +=1
        dw = cal_grad_w(data, w, b)
        db = cal_grad_b(data, w, b)
        if dw.all() == 0 and db == 0:
            break
        w = w - learn_rate*dw
        b = b - learn_rate*db
        print([counter,w,b])


输入虚拟数据,因为我不知道格式。

当我运行代码时,我得到了这个错误;TypeError:字符串索引必须是整数,而不是元组数据是这种形式的我的数据是这种形式的,大约2000行-4.617544237,-2.469679381,-1.967660787,1.813355506,-1-1-1.110968984,-2.592819511,1.149164575,0.572509318,-1。好的,那么你需要做一些字符串解析,然后可能data=np.array(data.split())?
import numpy as np

learn_rate = 1
w = np.zeros((1,4))
b = 0
M = 1000

#Possible format
#data = np.load('/Users/labuew/Desktop/dataset.data')

#Assumed format
data = np.ones((1000,5))

#calculating the gradient

def cal_grad_w(data, w, b):
    sum = 0
    for i in range (M):
        sample = data[i,:]
        Ym = sample[-1]
        Xm = sample[0:4]
        if -1*Ym*(np.matmul(w,Xm.reshape(4,1))+b) >= 0:
            tmp = 1.0
        else:
            tmp = 0
        value = Ym*Xm*tmp
        sum = sum +value
    return sum.reshape(1,4)
def cal_grad_b(data, w, b):
    sum = 0 
    for i in range (M):
        sample = data[i,:]
        Ym = sample[-1]
        Xm = sample[0:4]
        if -1*Ym*(np.matmul(w,Xm.reshape(4,1))+b) >= 0:
            tmp = 1.0
        else:
            tmp = 0
        value = Ym*tmp
        sum = sum +value
    return sum

if __name__ == '__main__':
    counter = 0
    while 1:
        counter +=1
        dw = cal_grad_w(data, w, b)
        db = cal_grad_b(data, w, b)
        if dw.all() == 0 and db == 0:
            break
        w = w - learn_rate*dw
        b = b - learn_rate*db
        print([counter,w,b])