2013-07-16 56 views
3

道歉,如果我沒有得到這個正確的第一次,因爲我是新來都這個論壇和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:\用戶......「63行,在

print sigmoid(X) 

文件 「C:\用戶...」,線路59,在乙狀結腸

s = 1.0/(1.0 + np.exp**(-1.0 * z)) 

類型錯誤:不支持的操作數類型(一個或多個),用於*: '浮動' 和 'numpy.ndarray'

我試着將1.0切換到1,然後在錯誤中使用'int'而不是'float',並使用'.astype(np.float)'和其他嘗試。我已經看過類似的問題,並已經看過的文件,但一直無法找到一個解決方案(或理解,我確實讀的解決方案!): http://docs.scipy.org/doc/numpy/reference/generated/numpy.exp.html

How to calculate a logistic sigmoid function in Python?

我的理解是指數函數應該爲數組中的每個元素執行一個元素方式的求冪。

我錯過了什麼?

+2

EXP(-1.0內部的電源功能* Z )應該解決你的問題,(numpy.exp是指數函數,而不是歐拉數) – usethedeathstar

回答

1

取出**和這將是固定

np.exp有它,這就是爲什麼你會得到一個錯誤

1

numpy.exp是一個函數,而你試圖冪運算符適用於該功能。 Python顯然不知道你在說什麼。

你需要選擇要麼numpy的冪或Python冪,不能同時使用。查看鏈接到的文檔中的語法。

從語法錯誤
+0

啊,是的,我正在盯着解決方案。謝謝。 – pentandrous

0

除了指出的@roippi,您可以使用numpy I/O功能;不需要通過csv模塊。

的另一個問題是,csv模塊是給你的字符串,所以你train_data風漲不被使用float dtypendarray(行話爲被存儲在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.]]) 
+0

優秀,這是更簡單的I/O方法。這也是解決問題的必要條件,因爲我有一串字符串。謝謝。 – pentandrous