(Прилагане на алгоритъм на най-малките квадрати в затворена форма)

Предговор

Проявявали ли сте някога любопитство относно скритото внедряване на алгоритъма за линейна регресия в scikit-learn ? Ако отговорът ви е да, значи сте на правилното място. В тази история ще ви преведа през разопакованетоналинейната регресияспоредразработката и внедряването в sklearn.

Относно линейната регресия

Това е линеен подход за моделиране на връзката между скаларна реакция и една или повече обяснителни променливи (известни също като зависими и независими променливи). Когато имате само единствена обяснителна променлива, съответстваща на целевата променлива, това се нарича Проста линейна регресия. Когато обяснителните променливи надвишават едно, това се нарича Множествена линейна регресия. Ние се опитваме да моделираме връзките, използвайки линейни предикторни функции, чиито параметри са неизвестни, като използваме данните.

Можем да използваме линейната регресия за две цели:

  • Функция за изготвяне на прогнозии оценка на грешката
  • За обяснениена вариациятав целевата функция с помощта на функции

Как е внедрен в Sklearn?

Ако вече сте прегледали предишната ми история, има големи шансове вече да знаете отговора. Ако обаче не, отговорът е ясен. Основното изпълнение на алгоритъма на най-малките квадрати е решение в затворена форма (директно решение). С други думи, те са използвали обратна инверсия на Мур-Пенроуз (трансформация на SVD) и с помощта на която можем да получим коефициентите на модела ( параметри), без да отделяте твърде много време за учене на данни за обучение.

Ръчна оценка на линейната регресия

Да кажем, че имаме следната входна матрица с размер 4 X 2и целеви вектор с форма 4 X 1 и искаме да изчислим коефициенти на уравнението на линейната регресия. Моля, имайте предвид, че в реалния свят A е нашият набор от независими функции, докато b е нашата целева функция на което искаме да регресира връзката.

След това трябва да изчислитеобратната част на Мур-Пенроуз на входната матрица A и след това да извършите точково произведение с целеви вектор b. Той ще ви даде коефициентите на уравнението на линейната регресия. Лесно, нали?

В моята предишна история изчислих обратното на Мур-Пенроуз на входната матрица A. Ако не сте прегледали по-ранната ми история, използвайте следната връзка, за да разберете работата на обратното на Мур-Пенроуз.



Ще продължа и ще използвам същите резултати, с изключение на това, че все още трябва да изпълним точковото произведение на това решение с нашия целеви вектор b.

Използвайки следното уравнение:

Получаваме,

които са нашите коефициенти. Но какво ще кажете за стойността на прихващане (отклонение) ?

За да намерим пресечната точка, можем да използваме математическата формула, дадена по-долу:

След изчисляване на средната стойност на A и b, получаваме

Сега, като използваме формулата за прихващане, получаваме

Лесно, нали? Сега внедряванетона линейната регресия е малко различноза разлика от нашите очаквания в Sklearn. В алгоритъма за линейна регресия имаме няколко параметъра, с които можем да си поиграем. Един от основните параметри е fit_intercept. Това означава дали искаме да генерираме стойността на прихващане, докато тренираме нашия модел. Ако коригирате стойността му на Истина, ще имате коефициентите плюс члена на отклонениеслед обучение на модела. Ако зададете стойността на False, вие няма да получите никакъв термин за прихващане. Освен това и в двата случая коефициентите ще бъдат различни, ако данните не са мащабираникъм центъра. Да видим какво имам предвид с това.

Сравнение на псевдокод на най-малките квадрати

Ако ви е трудно да разберете, моля, използвайте следното сравнение на псевдокода на най-малките квадрати, когато прихващането е True или False.

Моля, обърнете внимание, че в горния псевдокод, когато Intercept е False, ако входната матрицаи целевият векторне са мащабирани до център Преди следващите стъпки, стойностите на коефициентаще се различатв крайния резултат.

Внедряване на Python на линейна регресия

Линейна регресия без пресичане (пресичане=фалшиво)

Първо, нека да видим прилагането на линейна регресия без прихващане и да я сравним с версията на sklearn.

Input:
A = np.array([[2, 4], [1, 3], [0, 0], [0, 0]])
b = np.array([4, 5, 6, 7])
print('Matrix A:\n', A)
print('\nVector b:\n', b)
Output:
Matrix A:
[[2  4]  
 [1  3]  
 [0  0]  
 [0  0]]
Vector b: [4 5  6  7]

След това трябва да центрираме входните и целевите стойности според изискванията на алгоритъма.

Input:
A_offset = np.average(A, axis=0)
b_offset = np.average(b, axis=0)
A = A - A_offset
b = b - b_offset
print('Matrix A:\n', A)
print('\nVector b:\n', b)
Output:
Matrix A:
[[ 1.25  2.25]  
 [ 0.25  1.25]  
 [-0.75 -1.75]  
 [-0.75 -1.75]]
Vector b: [-1.5 -0.5  0.5  1.5]

След това ще оценим псевдообратно и ще изпълним точково произведение с целевия вектор, за да получим стойностите на коефициента. В NumPy можем директно да оценим псевдообратно, използвайки библиотека за линейна алгебра, както е показано по-долу.

Input:
# Estimate pseudo-inverse
Aplus = np.linalg.pinv(a=A)
# Estimate linear regression coefficients
coef = Aplus.dot(b)
print('Coefficients:', coef)
Output:
Coefficients: [-0.75 -0.25]

Нека да видим какво ще се случи, ако използваме метода LinearRegression() на библиотеката sklearn с fit_intercept=False. Моля, обърнете внимание, че трябва да мащабирате стойностите на A и b до центърапреди да разработите модела. Това е съществена част от внедряванетов библиотеката sklearn. Ако не ги центрирате, стойностите на коефициента ще бъдат различни от би трябвало. Освен това нарушавапредположението за нормалносткоето гласи, че данните трябва да имат нормално разпределение.

Input:
model = LinearRegression(fit_intercept=False)
model.fit(A, b)
print("Coefficients:", model.coef_)
print("Intercept:", model.intercept_)
Output:
Coefficients: [-0.75 -0.25] 
Intercept: 0.0

Сега, ако наблюдаваме модела и равнината на прогнозиране, ще изглежда нещо подобно на показаното по-долу:

Линейна регресия с пресичане (пресичане=вярно)

Сега нека видим изпълнението на линейна регресия с прихващане и да го сравним с версията на sklearn.

Input:
A = np.array([[2, 4], [1, 3], [0, 0], [0, 0]])
b = np.array([4, 5, 6, 7])
print('Matrix A:\n', A)
print('\nVector b:\n', b)
Output:
Matrix A:
[[2  4]  
 [1  3]  
 [0  0]  
 [0  0]]
Vector b: [4 5  6  7]

След това трябва да центрираме входните и целевите стойности според изискванията на алгоритъма.

Input:
A_offset = np.average(A, axis=0)
b_offset = np.average(b, axis=0)
A = A - A_offset
b = b - b_offset
print('Matrix A:\n', A)
print('\nVector b:\n', b)
Output:
Matrix A:
[[ 1.25  2.25]  
 [ 0.25  1.25]  
 [-0.75 -1.75]  
 [-0.75 -1.75]]
Vector b: [-1.5 -0.5  0.5  1.5]

След това ще оценим псевдообратно и ще изпълним точково произведение с целевия вектор, за да получим стойностите на коефициента. Освен това ще изчислим и стойността на прихващане (отклонение).

Input:
# Estimate pseudo-inverse
Aplus = np.linalg.pinv(a=A)
# Estimate linear regression coefficients
coef = Aplus.dot(b)
print('Coefficients:', coef)
# Estimate intercept value of the model
intercept = b_offset - np.dot(A_offset, sol)
print("Intercept:", intercept)
Output:
Coefficients: [-0.75 -0.25]
Intercept: 6.5

Нека да видим какво ще се случи, ако използваме метода LinearRegression() на библиотеката sklearn с fit_intercept=True. Моля, имайте предвид, че стойноститеще се центрират имплицитно и не е необходимо да ги мащабираме, когато ги предаваме на модела.

Input:
model = LinearRegression(fit_intercept=True)
model.fit(A, b)
print("Coefficients:", model.coef_)
print("Intercept:", model.intercept_)
Output:
Coefficients: [-0.75 -0.25] 
Intercept: 6.5

Сега, ако наблюдаваме модела и равнината на прогнозиране, ще изглежда нещо като показаното по-долу:

Ако наблюдавате, ще разберете, че в модела без пресичане имаме мащабирани стойности по оста X и Y, докато в модела с пресичане нямаме мащабирани стойности по оста X и Y. Както споменах по-рано, ако изберете да продължите с линейна регресия с пресичане, тя ще мащабира стойностите имплицитно вместо вас.

И накрая, ако интервюиращ ви зададевъпросза Линейна регресия, препоръчвам да не посочвате Gradient Descentкато скрито прилаганена линейна регресия в библиотеката Sklearn. В крайна сметка това е вариантът на техниката SVD и ние използваме решение със затворена форма за разработване на модел на линейна регресия, който е правилен отговор. Ние никога не започваме с техника за оптимизация, за да разрешим бизнес проблем. Започваме с основно решение и след това оптимизираме върху тях.

Заключителни мисли и заключителни коментари

Има някои жизненоважни точки, които много хората не успяват да разберат, докато преследват своето пътешествие в областта на Data Scienceили AI. Ако сте един от тях и търсите начин да неутрализирате тези недостатъци, разгледайте програмите за сертифициране, предоставени от INSAID на техния уебсайт. Ако сте харесали тази статия, бих препоръчал да отидете с Глобален сертификат за наука за даннизащото този ще покрие вашите основи плюс алгоритми замашинно обучение (основни за напреднали).

& Това е. Надявам се, че сте харесали обяснението за изчисляване на обратното на Мур-Пенроуз и сте научили нещо ценно.

Последвайте ме за още предстоящи статии, базирани на Python, R, Data Science, Machine Learning и Artificial Intelligence.

Ако намирате това четиво за полезно, натиснете Пляскайте👏. Вашето насърчение ще катализира вдъхновение, за да продължа и да разработя по-ценно съдържание.