道歉,如果我第一次没有做到这一点,因为我不熟悉这个论坛和Python。我正在尝试进行逻辑回归,并希望计算sigmoid函数。
代码:
import numpy as np
csv_file_object = csv.reader(open('train.csv', 'rb'))
header = csv_file_object.next()
train_data=[]
for row in csv_file_object:
train_data.append(row[1:])
train_data = np.array(train_data)
X = train_data
X = np.c_[ np.ones(N), X ] # print type(X) gives <type 'numpy.ndarray'>
def sigmoid(z):
s = 1.0 / (1.0 + np.exp**(-1.0 * z))
return s
print sigmoid(X)
错误
当我运行时,我收到以下错误:
追踪(最近一次通话): 文件“C:\ Users ...”,第63行,
print sigmoid(X)
文件“C:\ Users ...”,第59行,sigmoid
s = 1.0 / (1.0 + np.exp**(-1.0 * z))
TypeError:*不支持的操作数类型*:'float'和'numpy.ndarray'
我已经尝试将1.0转换为1然后在错误中使用'。'来代替'float'并使用'.astype(np.float)'和其他尝试。我已经查找了类似的问题并查看了文档,但一直无法找到解决方案(或者理解我确实在阅读解决方案!): http://docs.scipy.org/doc/numpy/reference/generated/numpy.exp.html
How to calculate a logistic sigmoid function in Python?
我的理解是指数函数应该对数组中的每个元素执行逐元素取幂。
我错过了什么?
答案 0 :(得分:1)
numpy.exp是一个函数,您正在尝试将指数运算符应用于该函数。 Python显然不知道你在说什么。
您需要选择numpy取幂或Python取幂,而不是两者。查看链接到的文档中的语法。
答案 1 :(得分:1)
删除**并将修复
np.exp
内置了幂函数,这就是您收到错误的原因
答案 2 :(得分:0)
除了@roippi指出的语法错误之外,您还可以使用numpy
I / O函数;没有必要通过csv模块。
另一个问题是,csv
模块会为您提供字符串,因此您的train_data
不会成为ndarray
浮动dtype
(行话为什么样的行话)对象存储在一个numpy数组中)。
例如,这样的事情应该有效:
>>> !cat train.csv
a,b,c
1,2,3
2,3,4
4,5,6
>>> train_data = np.loadtxt("train.csv", skiprows=1, delimiter=",")
>>> train_data
array([[ 1., 2., 3.],
[ 2., 3., 4.],
[ 4., 5., 6.]])
>>> np.exp(train_data)
array([[ 2.71828183, 7.3890561 , 20.08553692],
[ 7.3890561 , 20.08553692, 54.59815003],
[ 54.59815003, 148.4131591 , 403.42879349]])
或者,您可以简单地强制转换。从你拥有的东西开始,可能是这样的:
>>> train_data
array([['2', '3'],
['3', '4'],
['5', '6']],
dtype='|S1')
(请注意此处的dtype
。)您可以指定类型:
>>> train_data.astype(float)
array([[ 2., 3.],
[ 3., 4.],
[ 5., 6.]])
>>> np.array(train_data, dtype=float)
array([[ 2., 3.],
[ 3., 4.],
[ 5., 6.]])