Regresioni linear është ndoshta algoritmi ML më themelor, më i thjeshtë dhe i përdorur gjerësisht. Megjithëse nuk është një algoritëm i fuqishëm ose shprehës në asnjë mënyrë dhe është shumë i kufizuar në problemet që mund të modelojë, megjithatë është një pikënisje e mirë për shumicën e algoritmeve të mëvonshme ML që do të diskutohen. Si e tillë, duket e përshtatshme vetëm të fillohet me të.

Çfarë është regresioni linear mund të përmblidhet në një frazë: "Gjetja e linjës më të përshtatshme për të dhënat e dhëna". Në veçanti, regresioni linear është një algoritëm i përdorur për të trajtuar detyrat e të mësuarit të mbikëqyrura me vlera të vazhdueshme të prodhimit. Ai përfshin një kërkim (qoftë të qartë ose të nënkuptuar) për të gjetur vijën optimale (pjesën lineare) që përfaqëson marrëdhënien midis të dhënave hyrëse Xdhe të dhënat e synuara y, ku ymund të marrë një gamë të vazhdueshme vlerash (pjesa regresioni).

Përpara se të prezantojmë shënimin e saktë që do të përdorim dhe përpara se të zhvillojmë algoritmin hap pas hapi, fillimisht duhet të vërejmë disavantazhet e regresionit linear. Shënim për ta mbajtur shënimin të thjeshtë, ne do të supozojmë të dhëna me një veçori për momentin. Ka dy disavantazhe të dukshme me regresionin linear dhe të dyja janë në emër, por megjithatë duhet të vihen në dukje. Së pari, regresioni linear është një model me paragjykim të lartë që supozon se marrëdhënia midis X dhe y është lineare. Prandaj, regresioni linear është në gjendje të përafrojë në mënyrë adekuate një model për të dhënat nëse të dhënat e dhëna kanë një marrëdhënie y = mx + b. Ky është një kufizim i madh, por nëse të dhënat që ju interesojnë kanë këtë marrëdhënie, atëherë regresioni linear është një zgjedhje e shkëlqyer. Së dyti, regresioni linear ka të bëjë vetëm me problemet e regresionit. Kjo do të thotë, prodhimi i modelit merr një varg vlerash të vazhdueshme. Nëse detyra në fjalë merr vetëm një grup të vogël vlerash të mundshme të daljes, atëherë regresioni linear nuk do të ishte i përshtatshëm dhe në vend të kësaj do të kërkohet një model klasifikimi. Përveç këtyre dy disavantazheve të dukshme, regresioni linear është një model konceptualisht i thjeshtë dhe i lehtë për t'u përdorur që shërben si një bllok ndërtimi për modelet e tjera ML.

Tani mund të fillojmë të diskutojmë algoritmin. Për të kursyer kohë dhe hapësirë ​​dhe për të arritur më shpejt në një algoritëm funksional, ne do të hidhemi drejtpërdrejt në përdorimin e shënimeve të matricës në vend të përdorimit të përmbledhjeve eksplicite. Si i tillë ju duhet të ndiheni rehat me algjebrën lineare shumë themelore.

Le të supozojmë se detyrat tona mësimore të mbikëqyrura na janë dhënë në një matricë (X, y) ku X është një matricë (m, n) që korrespondon me të dhënat hyrëse dhe y është një matricë (n, 1) që korrespondon me të dhënat e synuara. Këtu, m është numri i veçorive që ka çdo xpikë e të dhënave dhe n është numri i pikave të të dhënave të mostrës të dhëna në detyrë. Le të jetë w një matricë (m, 1) që korrespondon me peshat e modelit dhe b të jetë një (1, 1 )-matricë (një skalar) që korrespondon me paragjykimin e modelit. Vini re se çdo matricë përbëhet nga numra realë.

Modeli i përdorur në regresionin linear përcaktohet si:

ku shënojmë modelin me h, që qëndron për "hipotezë". Vini re se h(X) nxjerr një matricë (n, 1).

Qëllimi është të gjenden parametrat (w, b)të tilla që humbja ndërmjet h(X)dhe < fortë>yështë minimale. Funksioni i saktë i humbjes është një zgjedhje e projektimit dhe teknikisht mund të shihet si një hiperparametër i problemit. Sidoqoftë, funksioni i humbjes që do të përdorim është humbja e gabimit mesatar në katror e dhënë nga:

Prandaj, qëllimi është të gjejmë parametrat që minimizojnë L:

Për të gjetur parametra të tillë, ne do të përdorim zbritjen gradient. Gradientët e (w, b) në lidhje me L janë:

Si një kontroll i shpejtë i arsyeshmërisë për matematikën e mësipërme, vini re se gradienti i w duhet të jetë një matricë (m,1) dhe gradienti i b fortë> duhet të jetë një matricë (1, 1). Gjithashtu, vini re se për gradientin e w, përmbledhja e të gjitha pikave të të dhënave bëhet në mënyrë implicite përmes shumëzimit të matricës ndërmjet matricës (m, n)-X dhe matrica (n, 1)- (h(X) - y).

Duke përdorur këto gradient, ne mund të përditësojmë parametrat duke përdorur rregullin e përditësimit të zbritjes së gradientit të vaniljes:

ku α është shkalla e të mësuarit zakonisht në intervalin (0, 1).

Me këtë, ne tani kemi të gjithë përbërësit e nevojshëm për të zbatuar dhe trajnuar një model funksional të regresionit linear. Më poshtë është një copë kodi në Python për një detyrë regresioni linear me një variacion (një veçori, m=1).

# Import libraries
import numpy as np
import matplotlib.pyplot as plt

# Set seed for reproducibility
np.random.seed(42)

# Set the number of data points
n = 10

# Generate data of the form y = m(x + e) + b
slope = np.random.randint(0, 5)
bias = np.random.randint(-10, 10)
noise = np.random.rand(n)

# Print the slope, bias, and noise used to generate data
print(f'slope: {slope}, bias: {bias}')
# >> slope: 3, bias: -9

x = np.arange(n)
y = slope * (x + noise) + bias

# Plot the data
plt.scatter(x, y)
plt.title('Randomly generated linear regression task')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

# Model function
def model(x, w, b):
    return w * x + b

# Mean-squared error loss function
def loss(hx, y):
    return np.sum((hx - y) ** 2) / (2 * n)

# Gradient of model parameters given loss function
def gradient(x, w, b, y):
    hx = model(x, w, b)
    dw = np.dot(x, hx - y) / n
    db = np.sum(hx - y) / n
    return dw, db

# Utility function to plot model
def plot_model(x, w, b, y):
    plt.scatter(x, y)
    plt.plot(x, model(x, w, b))
    plt.title('Plot of linear regression line given parameters (w, b).')
    plt.xlabel('x')
    plt.ylabel('y')
    plt.show()

# Set hyperparameters
LEARNING_RATE = 0.01
EPOCHS = 1000

# Initialize weights and biases
w = np.random.randn(1)
b = np.random.rand(1)

# Initial random parameters
print(f'Initial random parameters: w = {w}, b = {b}')
# >> w = [0.02222183], b = [0.39986097]

# Plot initial model.
plot_model(x, w, b, y)
print(f'Initial loss: {loss(model(x, w, b), y)}.')
# >> Initial loss: 52.26399596665648.

for e in range(EPOCHS):
    # forward pass
    hx = model(x, w, b)
    # compute loss
    l = loss(hx, y)
    # print loss every 100 epochs
    if e % 100 == 0:
        print(f'Epoch {e} loss: {l}')
    # compute gradient
    dw, db = gradient(x, w, b, y)
    # update weight and bias
    w = w - LEARNING_RATE * dw
    b = b - LEARNING_RATE * db

# Plot final learned model.
plot_model(x, w, b, y)
print(f'Final loss: {loss(model(x, w, b), y)}.')
# >> Final loss: 0.4368929979980659.

# Final learned parameters
print(f'Learned parameters: w = {w}, b = {b}')
# >> Learned paramters: w = [2.91661742], b = [-6.92948815]

Disa kontrolle të arsyeshme që algoritmi funksionon siç pritej përpara se të mbarojmë. Së pari, vini re se humbja fillestare me parametra të inicializuar rastësisht ishte ~52.26, ndërsa humbja përfundimtare me parametrat e mësuar ishte ~0.44. Kjo tregon se modeli mësoi parametra më të mirë sipas funksionit të humbjes, sipas dëshirës. Së dyti, pjerrësia dhe paragjykimi që gjeneruan vlerat e objektivit të së vërtetës tokësore ishin përkatësisht 3 dhe -9, ndërsa parametrat përfundimtarë të mësuar ishin w≈ 2.92 dhe b -6,93. Meqenëse zhurma u shtua në të dhënat e krijuara, asnjë vijë e drejtë nuk mund t'i përshtatet në mënyrë të përsosur të dhënave, kështu që parametrat e mësuar përputhen aq mirë sa priten. Së fundi, humbja u ul në mënyrë monotone gjatë stërvitjes, që është një tjetër tregues i fortë se algoritmi nuk ka gabime.

Ja ku e keni, një hyrje shumë të butë dhe të thjeshtë në regresionin linear. Një shënim i fundit, ne kemi shkruar vetëm kodin për rastin m=1, por është një ushtrim i thjeshtë për ta shtrirë atë në një vlerë arbitrare për m. Si të tillë, do ta lë kështu, një ushtrim për lexuesin kureshtar.

Shpresoj që këtë artikull ta keni gjetur të dobishëm dhe të dobishëm. Nëse keni ndonjë koment, shënim ose sugjerim, ju lutemi lini ato më poshtë. Sapo kam filluar të shkruaj dhe e di se kam shumë për të mësuar se si të shkruaj dhe shpjegoj në mënyrë efektive, kështu që çdo reagim vlerësohet shumë. Deri neser!

Ju mund ta gjeni kodin për këtë postim dhe projektet e mia të tjera në github.com/tarickali