簡體   English   中英

使用梯度下降算法進行線性回歸,獲得意外結果

[英]Linear regression using gradient descent algorithm, getting unexpected results

我試圖創建返回的值的函數θ 0 θ 1線性回歸的假設的功能。 但我得到的不同的初始(隨機)的值不同的結果θ 0 θ 1

代碼有什么問題?

training_data_set = [[1, 1], [2, 3], [4, 3], [3, 2], [5, 5]]
initial_theta = [1, 0]


def gradient_descent(data, theta0, theta1):
    def h(x, theta0, theta1):
        return theta0 + theta1 * x

    m = len(data)
    alpha = 0.01

    for n in range(m):
        cost = 0
        for i in range(m):
            cost += (h(data[i][0], theta0, theta1) - data[i][1])**2

        cost = cost/(2*m)

        error = 0
        for i in range(m):
            error += h(data[i][0], theta0, theta1) - data[i][1]

        theta0 -= alpha*error/m
        theta1 -= alpha*error*data[n][0]/m

    return theta0, theta1


for i in range(5):
    initial_theta = gradient_descent(training_data_set, initial_theta[0], initial_theta[1])


final_theta0 = initial_theta[0]
final_theta1 = initial_theta[1]

print(f'theta0 = {final_theta0}\ntheta1 = {final_theta1}')

輸出:

When initial_theta = [0, 0]

theta0 = 0.27311526522692103
theta1 = 0.7771301328221445


When initial_theta = [1, 1]

theta0 = 0.8829506006170339
theta1 = 0.6669442287905096

收斂

您僅對5個訓練樣本進行了5次梯度下降的迭代,學習率(可能是合理的)為0.01。 這樣做不會給您帶來問題的“最終”答案-您需要像實施時一樣進行多次梯度下降迭代,重復此過程直到theta收斂到穩定值為止。 然后比較結果值是有意義的。

for i in range(5)的5 in替換for i in range(5) 5000,然后看看會發生什么。 繪制錯誤率/成本函數的降低,以查看流程收斂到解決方案的速度可能是說明性的。

這不是問題,而是很平常的事情。 為此,您需要了解漸變體面的工作原理。 每次您隨機初始化參數時,假設都會從一個隨機的地方開始。 每次迭代都會更新參數,從而使成本函數收斂。 在您的情況下,您僅運行了5次迭代就滿足了梯度要求,對於不同的初始化,最終會產生太多不同的結果。 嘗試更高的迭代,即使使用不同的初始化,您也會看到明顯的相似性。 如果我可以使用可視化功能,那將對您有所幫助。

這是我看到梯度下降的方式:想象您高高在霧蒙蒙的山腰上。 由於有霧,您看不到下山的最快路徑。 因此,您環顧四周,然后根據附近的視線向下走。 邁出一步之后,您再次環顧四周,然后邁出另一步。 有時,這會將您困在一個很小的低點,在那里您看不到任何下落(局部最小值),有時這會使您安全地到達山底(全局最小值)。 從有霧的山腰上的不同隨機位置開始可能會使您陷入不同的局部最小值,但是如果隨機起始位置很好,您可能會安全找到自己的路。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM