Python 3.x 线性回归的mxnet梯度下降,变量类型错误

Python 3.x 线性回归的mxnet梯度下降,变量类型错误,python-3.x,gradient-descent,mxnet,Python 3.x,Gradient Descent,Mxnet,我正在尝试为线性回归实现一个简单的梯度下降 如果我手动计算梯度(通过使用解析表达式),它可以正常工作,但现在我尝试使用mxnet模块中的autograd来实现它 这是密码 从mxnet导入autograd、np、npx npx.set_np() def main(): #学习算法参数 nr_时代=1000 α=0.01 #读取数据,插入一列(包括与其他参数的偏差) data=pd.read\u csv(“dataset.txt”,header=0,index\u col=None,sep=“\

我正在尝试为线性回归实现一个简单的梯度下降

如果我手动计算梯度(通过使用解析表达式),它可以正常工作,但现在我尝试使用mxnet模块中的autograd来实现它

这是密码


从mxnet导入autograd、np、npx
npx.set_np()
def main():
#学习算法参数
nr_时代=1000
α=0.01
#读取数据,插入一列(包括与其他参数的偏差)
data=pd.read\u csv(“dataset.txt”,header=0,index\u col=None,sep=“\s+”)
数据。插入(0,“x_0”,1,True)#将“1”的列作为x_0插入
m=数据。形状[0]#样本数
n=数据。形状[1]-1#特征数
X=data.iloc[:,0:n].values#带有X个值的数组
Y=data.iloc[:,-1]。值#带有Y值的数组
θ=np.零(n)#初始参数数组
θ.附加_梯度()
θ,J=梯度下降(X,Y,θ,α,nr_时代)
#-------------------#
#损失函数#
#-------------------#
def丢失功能(X,Y,θ):
m=X.shape[0]#训练样本数
损失=0
对于范围内的i(X.shape[0]):
损耗=损耗+(1/(2*m))*(H(X[i,:],θ)-Y[i])**2
回波损耗
#----------------#
#假设#
#----------------#
def H(x,θ):
返回np.dot(x,θ)
#----------------------#
#梯度下降#
#----------------------#
def梯度下降(X、Y、θ、α、nr_历元):
m=X.shape[0]
n=X.形状[1]
梯度=np.零(n)
损失=np.零(nr_时代)
对于范围内的历元(nr_历元):
使用autograd.record():
损耗[历元]=损耗函数(X,Y,θ)
损失[历元]。向后()
对于范围(n)内的j:
θ[j]=θ[j]-α*θ梯度[j]
返回θ,损失
如果名称=“\uuuuu main\uuuuuuuu”:
main()
问题是,当代码计算假设时,在X和θ之间的点积中,我得到了一个错误

return np.dot(x, theta)
错误消息显示: 参数a必须具有NDArray类型,但得到[1.-5.05358]

所以,我假设x和θ的类型之间一定存在一些不兼容。 我检查了一下,发现:

X -> <class 'numpy.ndarray'>
theta -> <class 'mxnet.numpy.ndarray'>
X->
θ->
θ是用np.zero创建的,因此它是一个mxnet数组,而X是用.values方法从数据集转换而来的……这是问题的根源吗?
谢谢

MXNet不使用Numpy NDArray,但它的功能和API非常相似,但后端不同;mxnet NDArray是用C++编写的,使用异步执行,是GPU兼容和支持的。它也可以在CPU上工作,通常比默认的(支持OpenBLAS的)Numpy更快

因此,为了修复您的错误,我建议您确保在代码中不使用numpy,而是在所有地方使用mxnet-NDArray。其实很容易改变,因为。如果需要,您可以在numpy之间进行转换,例如:

from mxnet import nd

# Assuming A is an numpy ndarray and B an mxnet ndarray

# from numpy to mxnet
mxnet_array = nd.array(A)


# from mxnet to numpy
np_array = B.asnumpy()
关于您对线性回归的具体兴趣,请参见这里的2个python mxnet演示:

  • (gluon是python命令式前端的名称,有点像keras对TF的定义)
使用这些Ndarray是MXNet如此快速的原因之一,因为它使代码完全异步,并让引擎找到优化。
这些Ndarray是让MXNet如此棒的东西之一,尝试一下,你会喜欢它们:)

谢谢。我在想象这样的事情。问题是,我不明白在我的代码中,我在哪里创建了numpy数组而不是NDArray。开始时,我使用了“from mxnet import autograd,np,npx”,所以我假设当我创建“theta=np.zeros(n)”时,我得到了一个数组。另一个关键点是,当我使用例如“X=data.iloc[:,0:n]”值从pandas数据集转换时,对象是以numpy或mxnet数组的方式创建的吗?我应该使用什么语法来确保它们是Ndarray?不客气!使用“从mxnet导入nd”,然后使用nd,就像我答案中链接的演示一样。同样,尽量不要使用pandas,这将导致效率低下,因为GPU不兼容,不异步,也没有专门为深度学习而构建的。您仍然可以从pandas中完美地读取csv或数据,但需要将它们转换为NDArray(使用nd.array()),并使用内置抽象(例如ArrayDataset)或您自己的自定义数据集类将它们作为数据集对象公开。此演示演示如何使用pandas df作为MXNet模型的训练数据