Ошибка простой линейной регрессии при обновлении функции стоимости и тета-параметров - PullRequest
0 голосов
/ 04 ноября 2018

Я написал фрагмент кода для создания простой модели линейной регрессии с использованием Python. Однако у меня возникают проблемы с получением правильной функции стоимости и, самое главное, с правильными тета-параметрами. Модель реализована с нуля и не использует модуль обучения Scikit. Я использовал заметки Эндрю Н.Г. из его курса ML Coursera для создания модели. Правильные значения тета: [[-3.630291] [1.166362]].

Был бы очень признателен, если бы кто-то мог предложить свою экспертизу и указать, что я делаю неправильно.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#Load The Dataset
dataset = pd.read_csv("Population vs Profit.txt",names=["Population" , 
"Profit"])
print (dataset.head())

col = len(dataset.columns)
x = dataset.iloc[:,:col-1].values
y = dataset.iloc[:,col-1].values

#Visualizing The Dataset
plt.scatter(x, y, color="red", marker="x", label="Profit")
plt.title("Population vs Profit")
plt.xlabel("Population")
plt.ylabel("Profit")
plt.legend()
plt.show()

#Preprocessing Data
dataset.insert(0,"x0",1)
col = len(dataset.columns)
x = dataset.iloc[:,:col-1].values
b = np.zeros(col-1)
m = len(y)
costlist = []
alpha = 0.001
iteration = 10000

#Defining Functions
def hypothesis(x,b,y):
    h = x.dot(b.T) - y
    return h

def cost(x,b,y,m):
    j = np.sum(hypothesis(x,b,y)**2)
    j = j/(2*m)
    return j

print (cost(x,b,y,m))

def gradient_descent(x,b,y,m,alpha):
    for i in range (iteration):
        h = hypothesis(x,b,y)
        product = np.sum(h.dot(x))
        b = b - ((alpha/m)*product)
        costlist.append(cost(x,b,y,m))

    return b,cost(x,b,y,m)

b , mincost = gradient_descent(x,b,y,m,alpha)
print (b , mincost)
print (cost(x,b,y,m))
plt.plot(b,color="green")
plt.show()

Набор данных, который я использую, представляет собой следующий текст.

6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233
8.3829,11.886
7.4764,4.3483
8.5781,12
6.4862,6.5987
5.0546,3.8166
5.7107,3.2522
14.164,15.505
5.734,3.1551
8.4084,7.2258
5.6407,0.71618
5.3794,3.5129
6.3654,5.3048
5.1301,0.56077
6.4296,3.6518
7.0708,5.3893
6.1891,3.1386
20.27,21.767
5.4901,4.263
6.3261,5.1875
5.5649,3.0825
18.945,22.638
12.828,13.501
10.957,7.0467
13.176,14.692
22.203,24.147
5.2524,-1.22
6.5894,5.9966
9.2482,12.134
5.8918,1.8495
8.2111,6.5426
7.9334,4.5623
8.0959,4.1164
5.6063,3.3928
12.836,10.117
6.3534,5.4974
5.4069,0.55657
6.8825,3.9115
11.708,5.3854
5.7737,2.4406
7.8247,6.7318
7.0931,1.0463
5.0702,5.1337
5.8014,1.844
11.7,8.0043
5.5416,1.0179
7.5402,6.7504
5.3077,1.8396
7.4239,4.2885
7.6031,4.9981
6.3328,1.4233
6.3589,-1.4211
6.2742,2.4756
5.6397,4.6042
9.3102,3.9624
9.4536,5.4141
8.8254,5.1694
5.1793,-0.74279
21.279,17.929
14.908,12.054
18.959,17.054
7.2182,4.8852
8.2951,5.7442
10.236,7.7754
5.4994,1.0173
20.341,20.992
10.136,6.6799
7.3345,4.0259
6.0062,1.2784
7.2259,3.3411
5.0269,-2.6807
6.5479,0.29678
7.5386,3.8845
5.0365,5.7014
10.274,6.7526
5.1077,2.0576
5.7292,0.47953
5.1884,0.20421
6.3557,0.67861
9.7687,7.5435
6.5159,5.3436
8.5172,4.2415
9.1802,6.7981
6.002,0.92695
5.5204,0.152
5.0594,2.8214
5.7077,1.8451
7.6366,4.2959
5.8707,7.2029
5.3054,1.9869
8.2934,0.14454
13.394,9.0551
5.4369,0.61705

1 Ответ

0 голосов
/ 04 ноября 2018

Одна проблема связана с вашим "продуктом". В настоящее время это число, когда оно должно быть вектором. Я смог получить значения [-3.24044334 1.12719788], перенаправив цикл for следующим образом:

def gradient_descent(x,b,y,m,alpha):
    for i in range (iteration):
        h = hypothesis(x,b,y)
        #product = np.sum(h.dot(x))
        xvalue = x[:,1]
        product = h.dot(xvalue)
        hsum = np.sum(h)
        b = b - ((alpha/m)* np.array([hsum , product]) )
        costlist.append(cost(x,b,y,m))

    return b,cost(x,b,y,m)

Возможно, есть и другая проблема, поскольку она не сходится с вашим ответом. Вы должны убедиться, что вы используете ту же самую альфа-версию.

...