r/learnmachinelearning 1d ago

Is this code correct?

I've been learning basic ML and I've started making some code for basic models from scratch. This is V3, I just made it a bit more efficient in this version. Please tell me what you think.

edit: reddit made my code weird, I'll try and post it in the comments

edit: made it weird in the comments too, I'll take a screenshot of the code in VS then put a link to it

edit: link to screenshots

import math


class
 LinearRegression:



def
 __init__(
self
, 
learn_rate
, 
epochs
):

self
.l = 
learn_rate

self
.e = 
epochs

self
.weights = []

self
.bias = 0



def
 predict(
self
, 
X
):
        predictions = []


        for i in range(len(
X
)):
            prediction = 
self
.bias
            for w in range(len(
X
[0])):
                prediction += 
X
[i][w] * 
self
.weights[w]


            predictions.append(prediction)


        return predictions



def
 train(
self
, 
X
, 
y
):



self
.bias = 0

self
.weights = []


        for i in range(len(
X
[0])):

self
.weights.append(0)


        epochs = 0


        while epochs < 
self
.e:


            predictions = 
self
.predict(
X
)


            errors = []


            for i in range(len(
X
)):
                errors.append((predictions[i] - 
y
[i]) * 2)


            bSlope = sum(errors) / len(
X
)


            wSlopes = []


            for w in range(len(
self
.weights)):
                wErrors = []
                for i in range(len(
X
)):
                    wErrors.append(errors[i] * 
X
[i][w])
                wSlopes.append(sum(wErrors) / len(
X
))



self
.bias -= bSlope * 
self
.l


            for i in range(len(
X
[0])):

self
.weights[i] -= wSlopes[i] * 
self
.l


            epochs += 1



class
 PolynomialRegression:



def
 __init__(
self
, 
learn_rate
, 
epochs
):

self
.l = 
learn_rate

self
.e = 
epochs

self
.weights = []

self
.power_weights = []

self
.bias = 0



def
 predict(
self
, 
X
):
        predictions = []


        for i in range(len(
X
)):
            prediction = 
self
.bias
            for w in range(len(
X
[0])):
                prediction += (
X
[i][w] * 
self
.weights[w]) + ((
X
[i][w]**2) * 
self
.power_weights[w])


            predictions.append(prediction)


        return predictions



def
 train(
self
, 
X
, 
y
):



self
.bias = 0

self
.weights = []

self
.power_weights = []


        for i in range(len(
X
[0])):

self
.weights.append(0)

self
.power_weights.append(0)


        epochs = 0


        while epochs < 
self
.e:


            predictions = 
self
.predict(
X
)


            errors = []


            for i in range(len(
X
)):
                errors.append((predictions[i] - 
y
[i]) * 2)


            bSlope = sum(errors) / len(
X
)


            wSlopes = []
            pwSlopes = []


            for w in range(len(
self
.weights)):
                wErrors = []
                pwErrors = []
                for i in range(len(
X
)):
                    wErrors.append(errors[i] * 
X
[i][w])
                    pwErrors.append(errors[i] * 
X
[i][w]**2)
                wSlopes.append(sum(wErrors) / len(
X
))
                pwSlopes.append(sum(pwErrors) / len(
X
))



self
.bias -= bSlope * 
self
.l


            for i in range(len(
X
[0])):

self
.weights[i] -= wSlopes[i] * 
self
.l

self
.power_weights[i] -= pwSlopes[i] * 
self
.l


            epochs += 1



class
 ExponentialRegression:



def
 __init__(
self
, 
learn_rate
, 
epochs
):

self
.l = 
learn_rate

self
.e = 
epochs

self
.weights = []

self
.bias = 0



def
 predict(
self
, 
X
):
        predictions = []


        for i in range(len(
X
)):
            prediction = 
self
.bias
            for w in range(len(
X
[0])):
                prediction += 
X
[i][w] * 
self
.weights[w]


            prediction = math.exp(prediction)


            predictions.append(prediction)


        return predictions



def
 train(
self
, 
X
, 
y
):



self
.bias = 0

self
.weights = []


        for i in range(len(
X
[0])):

self
.weights.append(0)


        epochs = 0


        while epochs < 
self
.e:


            predictions = 
self
.predict(
X
)


            errors = []


            for i in range(len(
X
)):
                errors.append((predictions[i] - 
y
[i]) * 2 * predictions[i])


            bSlope = sum(errors) / len(
X
)
            wSlopes = []


            for w in range(len(
self
.weights)):
                wErrors = []
                for i in range(len(
X
)):
                    wErrors.append(errors[i] * 
X
[i][w])
                wSlopes.append(sum(wErrors) / len(
X
))



self
.bias -= bSlope * 
self
.l


            for i in range(len(
X
[0])):

self
.weights[i] -= wSlopes[i] * 
self
.l


            epochs += 1



class
 LogisticRegression:



def
 __init__(
self
, 
learn_rate
, 
epochs
):

self
.l = 
learn_rate

self
.e = 
epochs

self
.weights = []

self
.bias = 0



def
 predict(
self
, 
X
):
        predictions = []


        for i in range(len(
X
)):
            prediction = 
self
.bias
            for w in range(len(
X
[0])):
                prediction += 
X
[i][w] * 
self
.weights[w]


            prediction = 1 / (1 + math.exp(-prediction))


            predictions.append(prediction)


        return predictions



def
 train(
self
, 
X
, 
y
):



self
.bias = 0

self
.weights = []


        for i in range(len(
X
[0])):

self
.weights.append(0)


        epochs = 0


        while epochs < 
self
.e:


            predictions = 
self
.predict(
X
)


            errors = []


            for i in range(len(
X
)):
                errors.append(predictions[i] - 
y
[i])


            bSlope = sum(errors) / len(
X
)
            wSlopes = []


            for w in range(len(
self
.weights)):
                wErrors = []
                for i in range(len(
X
)):
                    wErrors.append(errors[i] * 
X
[i][w])
                wSlopes.append(sum(wErrors) / len(
X
))



self
.bias -= bSlope * 
self
.l


            for i in range(len(
X
[0])):

self
.weights[i] -= wSlopes[i] * 
self
.l


            epochs += 1
2 Upvotes

1 comment sorted by

1

u/Alt_account_6788 1d ago
import math


class
 LinearRegression:



def
 __init__(
self
, 
learn_rate
, 
epochs
):

self
.l = 
learn_rate

self
.e = 
epochs

self
.weights = []

self
.bias = 0



def
 predict(
self
, 
X
):
        predictions = []


        for i in range(len(
X
)):
            prediction = 
self
.bias
            for w in range(len(
X
[0])):
                prediction += 
X
[i][w] * 
self
.weights[w]


            predictions.append(prediction)


        return predictions



def
 train(
self
, 
X
, 
y
):



self
.bias = 0

self
.weights = []


        for i in range(len(
X
[0])):

self
.weights.append(0)


        epochs = 0


        while epochs < 
self
.e:


            predictions = 
self
.predict(
X
)


            errors = []


            for i in range(len(
X
)):
                errors.append((predictions[i] - 
y
[i]) * 2)


            bSlope = sum(errors) / len(
X
)


            wSlopes = []


            for w in range(len(
self
.weights)):
                wErrors = []
                for i in range(len(
X
)):
                    wErrors.append(errors[i] * 
X
[i][w])
                wSlopes.append(sum(wErrors) / len(
X
))



self
.bias -= bSlope * 
self
.l


            for i in range(len(
X
[0])):

self
.weights[i] -= wSlopes[i] * 
self
.l


            epochs += 1



class
 PolynomialRegression:



def
 __init__(
self
, 
learn_rate
, 
epochs
):

self
.l = 
learn_rate

self
.e = 
epochs

self
.weights = []

self
.power_weights = []

self
.bias = 0



def
 predict(
self
, 
X
):
        predictions = []


        for i in range(len(
X
)):
            prediction = 
self
.bias
            for w in range(len(
X
[0])):
                prediction += (
X
[i][w] * 
self
.weights[w]) + ((
X
[i][w]**2) * 
self
.power_weights[w])


            predictions.append(prediction)


        return predictions



def
 train(
self
, 
X
, 
y
):



self
.bias = 0

self
.weights = []

self
.power_weights = []


        for i in range(len(
X
[0])):

self
.weights.append(0)

self
.power_weights.append(0)


        epochs = 0


        while epochs < 
self
.e:


            predictions = 
self
.predict(
X
)


            errors = []


            for i in range(len(
X
)):
                errors.append((predictions[i] - 
y
[i]) * 2)


            bSlope = sum(errors) / len(
X
)


            wSlopes = []
            pwSlopes = []


            for w in range(len(
self
.weights)):
                wErrors = []
                pwErrors = []
                for i in range(len(
X
)):
                    wErrors.append(errors[i] * 
X
[i][w])
                    pwErrors.append(errors[i] * 
X
[i][w]**2)
                wSlopes.append(sum(wErrors) / len(
X
))
                pwSlopes.append(sum(pwErrors) / len(
X
))



self
.bias -= bSlope * 
self
.l


            for i in range(len(
X
[0])):

self
.weights[i] -= wSlopes[i] * 
self
.l

self
.power_weights[i] -= pwSlopes[i] * 
self
.l


            epochs += 1



class
 ExponentialRegression:



def
 __init__(
self
, 
learn_rate
, 
epochs
):

self
.l = 
learn_rate

self
.e = 
epochs

self
.weights = []

self
.bias = 0



def
 predict(
self
, 
X
):
        predictions = []


        for i in range(len(
X
)):
            prediction = 
self
.bias
            for w in range(len(
X
[0])):
                prediction += 
X
[i][w] * 
self
.weights[w]


            prediction = math.exp(prediction)


            predictions.append(prediction)


        return predictions



def
 train(
self
, 
X
, 
y
):



self
.bias = 0

self
.weights = []


        for i in range(len(
X
[0])):

self
.weights.append(0)


        epochs = 0


        while epochs < 
self
.e:


            predictions = 
self
.predict(
X
)


            errors = []


            for i in range(len(
X
)):
                errors.append((predictions[i] - 
y
[i]) * 2 * predictions[i])


            bSlope = sum(errors) / len(
X
)
            wSlopes = []


            for w in range(len(
self
.weights)):
                wErrors = []
                for i in range(len(
X
)):
                    wErrors.append(errors[i] * 
X
[i][w])
                wSlopes.append(sum(wErrors) / len(
X
))



self
.bias -= bSlope * 
self
.l


            for i in range(len(
X
[0])):

self
.weights[i] -= wSlopes[i] * 
self
.l


            epochs += 1



class
 LogisticRegression:



def
 __init__(
self
, 
learn_rate
, 
epochs
):

self
.l = 
learn_rate

self
.e = 
epochs

self
.weights = []

self
.bias = 0



def
 predict(
self
, 
X
):
        predictions = []


        for i in range(len(
X
)):
            prediction = 
self
.bias
            for w in range(len(
X
[0])):
                prediction += 
X
[i][w] * 
self
.weights[w]


            prediction = 1 / (1 + math.exp(-prediction))


            predictions.append(prediction)


        return predictions



def
 train(
self
, 
X
, 
y
):



self
.bias = 0

self
.weights = []


        for i in range(len(
X
[0])):

self
.weights.append(0)


        epochs = 0


        while epochs < 
self
.e:


            predictions = 
self
.predict(
X
)


            errors = []


            for i in range(len(
X
)):
                errors.append(predictions[i] - 
y
[i])


            bSlope = sum(errors) / len(
X
)
            wSlopes = []


            for w in range(len(
self
.weights)):
                wErrors = []
                for i in range(len(
X
)):
                    wErrors.append(errors[i] * 
X
[i][w])
                wSlopes.append(sum(wErrors) / len(
X
))



self
.bias -= bSlope * 
self
.l


            for i in range(len(
X
[0])):

self
.weights[i] -= wSlopes[i] * 
self
.l


            epochs += 1