Не можете отличить массивы от dtype int64? - PullRequest
0 голосов
/ 20 октября 2018

Я новичок в NumPy.Сегодня, когда я использую его для работы с линейной регрессией, он показывает следующее:

KeyError                                  Traceback (most recent call 
last)
~/anaconda3/lib/python3.6/site-packages/autograd/numpy/numpy_extra.py 
in new_array_node(value, tapes)
     84     try:
---> 85         return array_dtype_mappings[value.dtype](value, tapes)
     86     except KeyError:

KeyError: dtype('int64')

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call 
last)
<ipython-input-4-aebe8f7987b0> in <module>()
     24     return cost/float(np.size(y))
     25 
---> 26 weight_h, cost_h = gradient_descent(least_squares, alpha, 
max_its, w)
     27 
     28 # a)

<ipython-input-2-1b74c4f818f4> in gradient_descent(g, alpha, max_its, 
w)
     12     for k in range(max_its):
     13         # evaluate the gradient
---> 14         grad_eval = gradient(w)
     15 
     16         # take gradient descent step

~/anaconda3/lib/python3.6/site-packages/autograd/core.py in 
gradfun(*args, **kwargs)
     19     @attach_name_and_doc(fun, argnum, 'Gradient')
     20     def gradfun(*args,**kwargs):
---> 21         return 
backward_pass(*forward_pass(fun,args,kwargs,argnum))
     22     return gradfun
     23 

~/anaconda3/lib/python3.6/site-packages/autograd/core.py in 
forward_pass(fun, args, kwargs, argnum)
     57         tape = CalculationTape()
     58         arg_wrt = args[argnum]
---> 59         start_node = new_node(safe_type(getval(arg_wrt)), 
[tape])
     60         args = list(args)
     61         args[argnum] = merge_tapes(start_node, arg_wrt)

~/anaconda3/lib/python3.6/site-packages/autograd/core.py in 
new_node(value, tapes)
    185 def new_node(value, tapes=[]):
    186     try:
--> 187         return Node.type_mappings[type(value)](value, tapes)
    188     except KeyError:
    189         return NoDerivativeNode(value, tapes)

 ~/anaconda3/lib/python3.6/site-packages/autograd/numpy/numpy_extra.py 
in new_array_node(value, tapes)
     85         return array_dtype_mappings[value.dtype](value, tapes)
     86     except KeyError:
---> 87         raise TypeError("Can't differentiate wrt numpy arrays 
of dtype {0}".format(value.dtype))
     88 Node.type_mappings[anp.ndarray] = new_array_node
     89 

TypeError: Can't differentiate wrt numpy arrays of dtype int64 

Я действительно понятия не имею о том, что произошло.Я думаю, это может быть связано со структурой массива в NumPy.Или я забыл скачать какие-нибудь пакеты?Ниже приведены мои оригинальные коды.

# import statements
datapath = 'datasets/'
from autograd import numpy as np

# import automatic differentiator to compute gradient module
from autograd import grad 

# gradient descent function 
def gradient_descent(g,alpha,max_its,w):
    # compute gradient module using autograd
    gradient = grad(g)

    # run the gradient descent loop
    weight_history = [w] # weight history container
    cost_history = [g(w)] # cost function history container
    for k in range(max_its):
        # evaluate the gradient
        grad_eval = gradient(w)

        # take gradient descent step
        w = w - alpha*grad_eval

        # record weight and cost
        weight_history.append(w)
        cost_history.append(g(w))
    return weight_history,cost_history

# load in dataset
csvname = datapath + 'kleibers_law_data.csv'
data = np.loadtxt(csvname,delimiter=',')

# get input and output of dataset
x = data[:-1,:]
y = data[-1:,:] 

x = np.log(x)
y = np.log(y)

#Data Initiation
alpha = 0.01
max_its = 1000
w = np.array([0,0])

#linear model
def model(x, w):
    a = w[0] + np.dot(x.T, w[1:])
    return a.T

def least_squares(w):
    cost = np.sum((model(x,w)-y)**2)
    return cost/float(np.size(y))

weight_h, cost_h = gradient_descent(least_squares, alpha, max_its, w)

# a)
k = np.linspace(-5.5, 7.5, 250)
y = weight_h[max_its][0] + k*weight_h[max_its][1]
plt.figure()
plt.plot(x, y, label='Linear Line', color='g')
plt.xlabel('log of mass')
plt.ylabel('log of metabolic rate')
plt.title("Answer Of a")
plt.legend()
plt.show()

# b)
w0 = weight_h[max_its][0]
w1 = weight_h[max_its][1]

print("Nonlinear relationship between the body mass x and the metabolic 
rate y is " /
      + str(w0) + " + " + "log(xp)" + str(w1) + " = " + "log(yp)")

# c)
x2 = np.log(10)
Kj = np.exp(w0 + w1*x2)*1000/4.18
print("It needs " + str(Kj) + " calories")

Может кто-нибудь помочь мне разобраться?Большое спасибо.

1 Ответ

0 голосов
/ 20 октября 2018

Вот важные части вашей ошибки:

---> 14         grad_eval = gradient(w)
...    
Type Error: Can't differentiate wrt numpy arrays of dtype int64 

Ваша функция градиента говорит, что не любит дифференцировать массивы целых, что имеет некоторый смысл, поскольку, вероятно, она требует большей точности, чем intможет дать.Вам, вероятно, нужно, чтобы они были двойными или плавающими.Для простого решения этой проблемы, я полагаю, вы можете просто изменить свой инициализатор с:

w = np.array([0,0])

, который автоматически преобразует эти 0 в целые, на:

w = np.array([0.0,0.0])

Эти десятичные дробипосле 0 сообщу, что вы хотите плавать.Есть другие способы сообщить ему, какой тип массива вы хотите (https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.array.html),, но это простой способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...