Бесконечный цикл или медленный компьютер - PullRequest
0 голосов
/ 06 апреля 2019

У меня проблема с линейной регрессией на python, и мой код, к сожалению, не показывает никакого результата.Он не показывает никаких проблем во время компиляции, но и не дает никаких ответов.Не знаю, слишком ли медленен мой компьютер, слишком много итераций или что-то еще.

Ожидаемое выходное значение theta Получил бесконечный цикл

Код:

import pandas as p
# Using pandas to read features from our training set
dinit = p.read_csv('train.csv')
df = p.read_csv('train.csv')

b = list([df['crim'],df['zn'],df['indus'],df['chas'],df['nox'],df['rm'],df['age'],df['dis'],df['rad'],df['tax'],df['ptratio'],df['black'],df['lstat'],df['medv']])

bmean = [0,0,0,0,0,0,0,0,0,0,0,0,0,0]
# Calculating mean
for i in range(14):
    for j in range(333):
        bmean[i] += b[i][j]
for i in range(14):
    bmean[i] /= 333
bsigma = [0,0,0,0,0,0,0,0,0,0,0,0,0,0]
# Calculating standard deviation
for i in range(14):
    for j in range(333):
        bsigma[i] += (b[i][j]-bmean[i])**2
for i in range(14):
    bsigma[i] = (bsigma[i]/333)**0.5

# NOTE :- Replace 13 and 333 with dimensions of list+1
# Normalising data
for i in range(14):
    for j in range(333):
        b[i][j] = (b[i][j]-bmean[i])/bsigma[i]

theta = [0,0,0,0,0,0,0,0,0,0,0,0,0]


def costfun(theta ,b ):
    hypo = 0
    cost = 0
    y = 0
    for j in range(332):
        for i in range(13):
           hypo+=(theta[i]*b[i][j])
           y += b[13][j]
        cost+=(hypo-y)**2
        hypo = 0
        y = 0
    cost/=333
    return cost

print(b)
def GradientDescent(theta, b):
    alpha = 0.1
    hypo = 0
    cost = 0
    y = 0
    while (costfun(theta, b) > 1):
        for j in range(332):
            for i in range(13):
                hypo += (theta[i] * b[i][j])
                y += b[13][j]
            for i in range(13):
                theta[i] = theta[i]-((hypo-y)*b[i][j]*alpha/333)
    return theta
print(bmean)

print(GradientDescent(theta,b))

1 Ответ

0 голосов
/ 06 апреля 2019

Ух ты так много можешь сказать об этом фрагменте кода, поэтому начнем с самого начала:

0) Существует множество реализаций линейной регрессии. Чтобы привести только несколько:

  • sklearn.linear_model.LinearRegression
  • scipy.stats.linregress
  • вероятно, многие другие, но кого это волнует, те самые лучшие

1) Если вы занимаетесь математикой, используйте numpy ... Встроенные векторизованные операции позволят вам избежать многих ошибок. Например, вот первые 30 строк вашего кода:

import numpy as np

# Generate toy data, mu=10, sigma=5
M, N = 1000, 14
features = np.random.normal(10, 5, size=(M,N))

# Normalise
norm = (features - features.mean(axis=0)) / features.std(axis=0)

# Initialise theta
theta = np.zeros(N)

(Кроме того, я должен сказать, что те же самые операции можно выполнять почти одинаково с пандами, так зачем использовать списки?)

2) То же самое относится и к вашей функции стоимости. Линейная регрессия должна быть такой же простой, как Y = aX + b

3) Ваш цикл while не имеет других критериев остановки, кроме проверки стоимости. Другими словами, если ваш алгоритм не сходится (что весьма вероятно, если вы спросите меня), он никогда не останавливается ...

Вот пример того, как реализовать линейную регрессию в Python: https://www.cs.toronto.edu/~frossard/post/linear_regression/

...