在python中实现次梯度随机下降
我想用一个代价函数实现次梯度和随机下降,计算为数据找到一个完美分类器所需的迭代次数,以及权重(w)和偏差(b)。 数据集是四维的 这是我的成本函数 我得到了成本函数的导数,这里是: 当我运行我的代码时,我会遇到很多错误,请有人帮忙 这是我用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' #
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])