2017-07-26 74 views
0

我目前正在寫一元線性迴歸的Python的實現:單變量線性迴歸輸出的NaN

# implementation of univariate linear regression 
import numpy as np 


def cost_function(hypothesis, y, m): 
    return (1/(2 * m)) * ((hypothesis - y) ** 2).sum() 


def hypothesis(X, theta): 
    return X.dot(theta) 


def gradient_descent(X, y, theta, m, alpha): 
    for i in range(1500): 
    temp1 = theta[0][0] - alpha * (1/m) * (hypothesis(X, theta) - y).sum() 
    temp2 = theta[1][0] - alpha * (1/m) * ((hypothesis(X, theta) - y) * X[:, 1]).sum() 
    theta[0][0] = temp1 
    theta[1][0] = temp2 

    return theta 

if __name__ == '__main__': 
    data = np.loadtxt('data.txt', delimiter=',') 

    y = data[:, 1] 
    m = y.size 
    X = np.ones(shape=(m, 2)) 
    X[:, 1] = data[:, 0] 
    theta = np.zeros(shape=(2, 1)) 
    alpha = 0.01 

    print(gradient_descent(X, y, theta, m, alpha)) 

此代碼將輸出爲NaN爲θ表示將無限後 - 我無法弄清楚是怎麼回事錯誤,但這肯定與我在梯度下降函數中改變theta有關。

我正在使用的數據是一個簡單的線性迴歸對數據集我上網 - 並加載正確。

任何人都可以指向正確的方向嗎?

回答

0

你看到的問題是,當你做X[:,1]data[:,1]時,你會得到形狀(m,)的對象。當用形狀的矩陣相乘形狀(M)的目的(M,1),將得到大小的矩陣(M,M)

a = np.array([1,2,3]) 
b = np.array([[4],[5],[6]]) 
(a*b).shape #prints (3,3) 

如果這樣做 Y = y.reshape( (M,1))在if __name__塊和你gradient_descent函數內部 你做

X_1 = X[:,1].reshape((m,1)) 

應該解決的問題。眼下發生的事情是,當你做

((hypothesis(X, theta) - y) * X[:, 1]) 

你得到一個100×100矩陣,這是不是你想要的。

我用於測試的完整代碼:

# implementation of univariate linear regression 
import numpy as np 


def cost_function(hypothesis, y, m): 
    return (1/(2 * m)) * ((hypothesis - y) ** 2).sum() 


def hypothesis(X, theta): 
    return X.dot(theta) 


def gradient_descent(X, y, theta, m, alpha): 
    X_1 = X[:,1] 
    X_1 = X_1.reshape((m,1)) 
    for i in range(1500): 
    temp1 = theta[0][0] - alpha * (1/m) * (hypothesis(X, theta) - y).sum() 
    temp2 = theta[1][0] - alpha * (1/m) * ((hypothesis(X, theta) - y) * X_1).sum() 
    theta[0][0] = temp1 
    theta[1][0] = temp2 

    return theta 

if __name__ == '__main__': 
    data= np.random.normal(size=(100,2)) 

    y = 30*data[:,0] + data[:, 1] 
    m = y.size 
    X = np.ones(shape=(m, 2)) 
    y = y.reshape((m,1)) 
    X[:, 1] = data[:, 0] 
    theta = np.zeros(shape=(2, 1)) 
    alpha = 0.01 

    print(gradient_descent(X, y, theta, m, alpha)) 
+0

不幸的是,這似乎並沒有解決這個問題 - 像以前相同的輸出。 – bag

+0

您還需要重塑X [:,1]。我會編輯 –

+0

仍然沒有運氣!與以前相同的輸出。我已經在if __name__塊中聲明瞭m之後直接插入了y = y.reshape((m,1)),並且x1 = X [:,1] .reshape((m,1))梯度下降。 – bag