РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ рассматриваСтся нСсколько способов опрСдСлСния матСматичСского уравнСния Π»ΠΈΠ½ΠΈΠΈ простой (ΠΏΠ°Ρ€Π½ΠΎΠΉ) рСгрСссии.

ВсС рассматриваСмыС здСсь способы Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ уравнСния основаны Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ². ΠžΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ способы ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

  • АналитичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅
  • Π“Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск
  • БтохастичСский Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· способов Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ уравнСния прямой, Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² основном дСлятся Π½Π° Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ написаны Π±Π΅Π· использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy ΠΈ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ для провСдСния расчСтов ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ NumPy. БчитаСтся, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π»ΠΎΠ΅ использованиС NumPy ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° вычислСния.

Π’Π΅ΡΡŒ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, написан Π½Π° языкС python 2.7 с использованиСм Jupyter Notebook. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Ρ„Π°ΠΉΠ» с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π²Ρ‹Π»ΠΎΠΆΠ΅Π½ Π½Π° Π“ΠΈΡ‚Ρ…Π°Π±Π΅

Π‘Ρ‚Π°Ρ‚ΡŒΡ Π² большСй стСпСни ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ Π½Π° Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…, Ρ‚Π°ΠΊ ΠΈ Π½Π° Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΡƒΠΆΠ΅ ΠΏΠΎΠ½Π΅ΠΌΠ½ΠΎΠ³Ρƒ Π½Π°Ρ‡Π°Π» ΠΎΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ вСсьма ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° Π² искусствСнном ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚Π΅ β€” машинного обучСния.

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΡ‡Π΅Π½ΡŒ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

Условия ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

Π£ нас Π΅ΡΡ‚ΡŒ ΠΏΡΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΡŽΡ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Y ΠΎΡ‚ X (Π’Π°Π±Π»ΠΈΡ†Π° β„–1):

Π’Π°Π±Π»ΠΈΡ†Π° β„–1 «Условия ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Β»

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ значСния РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии β€” это мСсяц Π³ΠΎΠ΄Π°, Π° РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии β€” Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ° Π² этом мСсяцС. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ° зависит ΠΎΡ‚ мСсяца Π³ΠΎΠ΄Π°, Π° РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии β€” СдинствСнный ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ зависит Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊ сСбС, ΠΊΠ°ΠΊ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния условной зависимости Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ ΠΎΡ‚ мСсяца Π³ΠΎΠ΄Π°, Ρ‚Π°ΠΊ ΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния количСства Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ β€” ΠΈΡ… ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ. Однако Ρ‚Π°ΠΊΠΎΠ΅ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚, Ρ‡Ρ‚ΠΎ называСтся Π½Π° ΠΏΠ°Π»ΡŒΡ†Π°Ρ…, ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, Π½Π΅ всСгда с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ, усваиваСмый Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π». А Ρ‚Π°ΠΊΠΆΠ΅ простота чисСл ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π±Π΅Π· вСсомых Ρ‚Ρ€ΡƒΠ΄ΠΎΠ·Π°Ρ‚Ρ€Π°Ρ‚, ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠΌ, ΠΏΠΎΡ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Β«Π±ΡƒΠΌΠ°Π³Π΅Β».

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ привСдСнная Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ достаточно Ρ…ΠΎΡ€ΠΎΡˆΠΎ аппроксимирована матСматичСским ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ΠΌ Π»ΠΈΠ½ΠΈΠΈ простой (ΠΏΠ°Ρ€Π½ΠΎΠΉ) рСгрСссии Π²ΠΈΠ΄Π°:

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π³Π΄Π΅ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии β€” это мСсяц, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π»Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ°, РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии β€” Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ мСсяцу, РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии β€” коэффициСнты рСгрСссии ΠΎΡ†Π΅Π½Π΅Π½Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ коэффициСнт РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии часто Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΡƒΠ³Π»ΠΎΠ²Ρ‹ΠΌ коэффициСнтом ΠΈΠ»ΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΎΡ†Π΅Π½Π΅Π½Π½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ; прСдставляСт собой Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ измСнится РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии.

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ наша Π·Π°Π΄Π°Ρ‡Π° Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ β€” ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π² ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΈ Ρ‚Π°ΠΊΠΈΠ΅ коэффициСнты РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… отклонСния Π½Π°ΡˆΠΈΡ… расчСтных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ ΠΏΠΎ мСсяцам ΠΎΡ‚ истинных ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ², Ρ‚.Π΅. Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, прСдставлСнных Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅, Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹.

ΠœΠ΅Ρ‚ΠΎΠ΄ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ²

Π’ соотвСтствии с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ², ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ стоит Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, возводя Π΅Π³ΠΎ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ погашСния ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ, Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ. НапримСр, Ссли Π² ΠΎΠ΄Π½ΠΎΠΌ случаС, ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ составляСт +5 (плюс ΠΏΡΡ‚ΡŒ), Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ -5 (минус ΠΏΡΡ‚ΡŒ), Ρ‚ΠΎ сумма ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π²Π·Π°ΠΈΠΌΠ½ΠΎ погасится ΠΈ составит 0 (ноль). МоТно ΠΈ Π½Π΅ Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Π° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ свойством модуля ΠΈ Ρ‚ΠΎΠ³Π΄Π° Ρƒ нас всС отклонСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Ρ‚ΡŒΡΡ. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° этом ΠΌΠΎΠΌΠ΅Π½Ρ‚Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, Π° просто ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ, Ρ‡Ρ‚ΠΎ для удобства расчСтов, принято Π²ΠΎΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ Π² ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.

Π’ΠΎΡ‚ Ρ‚Π°ΠΊ выглядит Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ сумму ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ (ошибки):

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π³Π΄Π΅ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии β€” это функция аппроксимации истинных ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ посчитанная Π½Π°ΠΌΠΈ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ°),

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии β€” это истинныС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ (прСдоставлСнная Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ°),

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии β€” это индСкс Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ (Π½ΠΎΠΌΠ΅Ρ€ мСсяца, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ происходит ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ отклонСния)

ΠŸΡ€ΠΎΠ΄ΠΈΡ„Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ уравнСния частных ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ аналитичСскому Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ. Но для Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ нСбольшой экскурс ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΈΡ„Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ вспомним гСомСтричСский смысл ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ.

Π”ΠΈΡ„Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

Π”ΠΈΡ„Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ называСтся опСрация ΠΏΠΎ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Для Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ½Π° производная? ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅Ρ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ измСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°ΠΌ Π΅Π΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. Если производная Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Π°, Ρ‚ΠΎ функция возрастаСт, Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ случаС β€” функция ΡƒΠ±Ρ‹Π²Π°Π΅Ρ‚. И Ρ‡Π΅ΠΌ большС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ, Ρ‚Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ измСнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΡ€ΡƒΡ‡Π΅ ΡƒΠ³ΠΎΠ» Π½Π°ΠΊΠ»ΠΎΠ½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

НапримСр, Π² условиях Π΄Π΅ΠΊΠ°Ρ€Ρ‚ΠΎΠ²ΠΎΠΉ систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ M(0,0) Ρ€Π°Π²Π½ΠΎΠ΅ +25 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ΅, ΠΏΡ€ΠΈ смСщСнии значСния РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии Π²ΠΏΡ€Π°Π²ΠΎ Π½Π° ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии возрастаСт Π½Π° 25 условных Π΅Π΄ΠΈΠ½ΠΈΡ†. На Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ это выглядит, ΠΊΠ°ΠΊ достаточно ΠΊΡ€ΡƒΡ‚ΠΎΠΉ ΡƒΠ³ΠΎΠ» подъСма Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ.

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Ρ€Π°Π²Π½ΠΎΠ΅ -0,1 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ смСщСнии РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии Π½Π° ΠΎΠ΄Π½Ρƒ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΡƒΠ±Ρ‹Π²Π°Π΅Ρ‚ всСго лишь Π½Π° 0,1 ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. ΠŸΡ€ΠΈ этом, Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π΅Π΄Π²Π° Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ Π½Π°ΠΊΠ»ΠΎΠ½ Π²Π½ΠΈΠ·. ΠŸΡ€ΠΎΠ²ΠΎΠ΄Ρ аналогию с Π³ΠΎΡ€ΠΎΠΉ, Ρ‚ΠΎ ΠΌΡ‹ ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ спускаСмся ΠΏΠΎ ΠΏΠΎΠ»ΠΎΠ³ΠΎΠΌΡƒ склону с Π³ΠΎΡ€Ρ‹, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π³Π΄Π΅ Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π±Ρ€Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΊΡ€ΡƒΡ‚Ρ‹Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹:)

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, провСдя Π΄ΠΈΡ„Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΏΠΎ коэффициСнтам РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ уравнСния частных ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… 1-Π³ΠΎ порядка. ПослС опрСдСлСния ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ систСму ΠΈΠ· Π΄Π²ΡƒΡ… ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ, Ρ€Π΅ΡˆΠΈΠ² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ смоТСм ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ значСния коэффициСнтов РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… значСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Π² Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π½Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΡƒΡŽ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ, Π° Π² случаС с аналитичСским Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ вовсС. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, функция ошибки ΠΏΡ€ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… коэффициСнтах достигнСт ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ значСния частных ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… Π² этих Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ.

Π˜Ρ‚Π°ΠΊ, ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ диффСрСнцирования ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ частной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ 1-Π³ΠΎ порядка ΠΏΠΎ коэффициСнту РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π²ΠΈΠ΄:

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ частной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ 1-Π³ΠΎ порядка ΠΏΠΎ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Π²ΠΈΠ΄:

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ систСму ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ, которая ΠΈΠΌΠ΅Π΅Ρ‚ достаточно простоС аналитичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅:

begin{equation*}
begin{cases}
na + bsumlimits_{i=1}^nx_i β€” sumlimits_{i=1}^ny_i = 0

sumlimits_{i=1}^nx_i(a +bsumlimits_{i=1}^nx_i β€” sumlimits_{i=1}^ny_i) = 0
end{cases}
end{equation*}

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅.

Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…

НСобходимо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² связи с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ для аналитичСского Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π° Π² дальнСйшСм для Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ ΠΈ стохастичСского Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ Π² Π΄Π²ΡƒΡ… вариациях: с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy ΠΈ Π±Π΅Π· Π΅Ρ‘ использования, Ρ‚ΠΎ Π½Π°ΠΌ потрСбуСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… (см. ΠΊΠΎΠ΄).

Код Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

# ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ всС Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
import pylab as pl
import random

# Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠΌ Π² Jupyter
%matplotlib inline

# ΡƒΠΊΠ°ΠΆΠ΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ²
from pylab import rcParams
rcParams['figure.figsize'] = 12, 6

# ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠΌ прСдупрСТдСния Anaconda
import warnings
warnings.simplefilter('ignore')

# Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠΌ значСния
table_zero = pd.read_csv('data_example.txt', header=0, sep='t')

# посмотрим ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈ Π½Π° саму Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ
print table_zero.info()
print '********************************************'
print table_zero
print '********************************************'

# ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ Π±Π΅Π· использования NumPy

x_us = []
[x_us.append(float(i)) for i in table_zero['x']]
print x_us
print type(x_us)
print '********************************************'

y_us = []
[y_us.append(float(i)) for i in table_zero['y']]
print y_us
print type(y_us)
print '********************************************'

# ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠΌ Π΄Π°Π½Π½Ρ‹Π΅ с использованиСм NumPy

x_np = table_zero[['x']].values
print x_np
print type(x_np)
print x_np.shape
print '********************************************'

y_np = table_zero[['y']].values
print y_np
print type(y_np)
print y_np.shape
print '********************************************'

Визуализация

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹, Π²ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»ΠΈ Π΄Π°Π½Π½Ρ‹Π΅, Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ† ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ. Часто для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ pairplot Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Seaborn. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, Π²Π²ΠΈΠ΄Ρƒ ограничСнности Ρ†ΠΈΡ„Ρ€ Π½Π΅Ρ‚ смысла ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Seaborn. ΠœΡ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Matplotlib ΠΈ посмотрим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ рассСяния.

Код Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ рассСяния

print 'Π“Ρ€Π°Ρ„ΠΈΠΊ β„–1 "Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ ΠΎΡ‚ мСсяца Π³ΠΎΠ΄Π°"'

plt.plot(x_us,y_us,'o',color='green',markersize=16)
plt.xlabel('$Months$', size=16)
plt.ylabel('$Sales$', size=16)
plt.show()

Π“Ρ€Π°Ρ„ΠΈΠΊ β„–1 Β«Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ ΠΎΡ‚ мСсяца Π³ΠΎΠ΄Π°Β»

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

АналитичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ самыми ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ инструмСнтами Π² python ΠΈ Ρ€Π΅ΡˆΠΈΠΌ систСму ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ:

begin{equation*}
begin{cases}
na + bsumlimits_{i=1}^nx_i β€” sumlimits_{i=1}^ny_i = 0

sumlimits_{i=1}^nx_i(a +bsumlimits_{i=1}^nx_i β€” sumlimits_{i=1}^ny_i) = 0
end{cases}
end{equation*}

По ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ ΠšΡ€Π°ΠΌΠ΅Ρ€Π° Π½Π°ΠΉΠ΄Π΅ΠΌ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ ΠΏΠΎ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ ΠΏΠΎ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, послС Ρ‡Π΅Π³ΠΎ, Ρ€Π°Π·Π΄Π΅Π»ΠΈΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии Π½Π° ΠΎΠ±Ρ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ β€” Π½Π°ΠΉΠ΄Π΅ΠΌ коэффициСнт РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π½Π°ΠΉΠ΄Π΅ΠΌ коэффициСнт РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии.

Код аналитичСского Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для расчСта коэффициСнтов a ΠΈ b ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Ρƒ ΠšΡ€Π°ΠΌΠ΅Ρ€Π°
def Kramer_method (x,y):
        # сумма Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (всС мСсяца)
    sx = sum(x)
        # сумма истинных ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² (Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ° Π·Π° вСсь ΠΏΠ΅Ρ€ΠΈΠΎΠ΄)
    sy = sum(y)
        # сумма произвСдСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° истинныС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹
    list_xy = []
    [list_xy.append(x[i]*y[i]) for i in range(len(x))]
    sxy = sum(list_xy)
        # сумма ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
    list_x_sq = []
    [list_x_sq.append(x[i]**2) for i in range(len(x))]
    sx_sq = sum(list_x_sq)
        # количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
    n = len(x)
        # ΠΎΠ±Ρ‰ΠΈΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ
    det = sx_sq*n - sx*sx
        # ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ a
    det_a = sx_sq*sy - sx*sxy
        # искомый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ a
    a = (det_a / det)
        # ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎ b
    det_b = sxy*n - sy*sx
        # искомый ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ b
    b = (det_b / det)
        # ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹Π΅ значСния (ΠΏΡ€ΠΎΠΎΠ²Π΅Ρ€ΠΊΠ°)
    check1 = (n*b + a*sx - sy)
    check2 = (b*sx + a*sx_sq - sxy)
    return [round(a,4), round(b,4)]

# запустим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ запишСм ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹
ab_us = Kramer_method(x_us,y_us)
a_us = ab_us[0]
b_us = ab_us[1]
print ' 33[1m' + ' 33[4m' + "ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ значСния коэффициСнтов a ΠΈ b:"  + ' 33[0m' 
print 'a =', a_us
print 'b =', b_us
print

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для подсчСта суммы ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ошибок
def errors_sq_Kramer_method(answers,x,y):
    list_errors_sq = []
    for i in range(len(x)):
        err = (answers[0] + answers[1]*x[i] - y[i])**2
        list_errors_sq.append(err)
    return sum(list_errors_sq)

# запустим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ запишСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ошибки
error_sq = errors_sq_Kramer_method(ab_us,x_us,y_us)
print ' 33[1m' + ' 33[4m' + "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ" + ' 33[0m'
print error_sq
print

# Π·Π°ΠΌΠ΅Ρ€ΠΈΠΌ врСмя расчСта
# print ' 33[1m' + ' 33[4m' + "ВрСмя выполнСния расчСта суммы ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ:" + ' 33[0m'
# % timeit error_sq = errors_sq_Kramer_method(ab,x_us,y_us)

Π’ΠΎΡ‚, Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π˜Ρ‚Π°ΠΊ, значСния коэффициСнтов Π½Π°ΠΉΠ΄Π΅Π½Ρ‹, сумма ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ установлСна. НарисуСм Π½Π° гистограммС рассСяния ΠΏΡ€ΡΠΌΡƒΡŽ линию Π² соотвСтствии с Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌΠΈ коэффициСнтами.

Код Π»ΠΈΠ½ΠΈΠΈ рСгрСссии

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для формирования массива рассчСтных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ
def sales_count(ab,x,y):
    line_answers = []
    [line_answers.append(ab[0]+ab[1]*x[i]) for i in range(len(x))]
    return line_answers

# построим Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ
print 'Π“Ρ€Ρ„ΠΈΠΊβ„–2 "ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΈ расчСтныС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹"'
plt.plot(x_us,y_us,'o',color='green',markersize=16, label = '$True$ $answers$')
plt.plot(x_us, sales_count(ab_us,x_us,y_us), color='red',lw=4,
         label='$Function: a + bx,$ $where$ $a='+str(round(ab_us[0],2))+',$ $b='+str(round(ab_us[1],2))+'$')
plt.xlabel('$Months$', size=16)
plt.ylabel('$Sales$', size=16)
plt.legend(loc=1, prop={'size': 16})
plt.show()

Π“Ρ€Π°Ρ„ΠΈΠΊ β„–2 Β«ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΈ расчСтныС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹Β»

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

МоТно ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π·Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ мСсяц. Π’ нашСм случаС, ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠΉ практичСской цСнности ΠΌΡ‹ ΠΈΠ· Π½Π΅Π³ΠΎ Π½Π΅ вынСсСм, Π½ΠΎ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΠΌ Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚ΡΡ‚Π²ΠΎ Π² Ρ‚ΠΎΠΌ, насколько Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠ·ΡƒΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ ΠΎΡ‚ мСсяца Π³ΠΎΠ΄Π°.

Код Π³Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для формирования массива ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π°Ρ…
def error_per_month(ab,x,y):
    sales_c = sales_count(ab,x,y)
    errors_percent = []
    for i in range(len(x)):
        errors_percent.append(100*(sales_c[i]-y[i])/y[i])
    return errors_percent

# построим Π³Ρ€Π°Ρ„ΠΈΠΊ
print 'Π“Ρ€Π°Ρ„ΠΈΠΊβ„–3 "ΠžΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΡ ΠΏΠΎ-мСсячно, %"'
plt.gca().bar(x_us, error_per_month(ab_us,x_us,y_us), color='brown')
plt.xlabel('Months', size=16)
plt.ylabel('Calculation error, %', size=16)
plt.show()

Π“Ρ€Π°Ρ„ΠΈΠΊ β„–3 Β«ΠžΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΡ, %Β»

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

НС идСально, Π½ΠΎ Π½Π°ΡˆΡƒ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΡ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ.

НапишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая для опрСдСлСния коэффициСнтов РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ NumPy, Ρ‚ΠΎΡ‡Π½Π΅Π΅ β€” напишСм Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ΠΎΠ΄Π½Ρƒ с использованиСм псСвдообратной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ (Π½Π΅ рСкомСндуСтся Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ процСсс Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ слоТный ΠΈ Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ), Π΄Ρ€ΡƒΠ³ΡƒΡŽ с использованиСм ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ уравнСния.

Код аналитичСского Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ (NumPy)

# для Π½Π°Ρ‡Π°Π»Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ столбСц с Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Π² 1. 
# Π”Π°Π½Π½Ρ‹ΠΉ столбСц Π½ΡƒΠΆΠ΅Π½ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ коэффицСнт a
vector_1 = np.ones((x_np.shape[0],1))
x_np = table_zero[['x']].values # Π½Π° всякий случай ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π² ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Π΅ΠΊΡ‚ΠΎΡ€ x_np
x_np = np.hstack((vector_1,x_np))

# ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ всС сдСлали ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ
print vector_1[0:3]
print x_np[0:3]
print '***************************************'
print

# напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая опрСдСляСт значСния коэффициСнтов a ΠΈ b с использованиСм псСвдообратной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹
def pseudoinverse_matrix(X, y):
    # Π·Π°Π΄Π°Π΅ΠΌ явный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ²
    X = np.matrix(X)
    # опрСдСляСм Ρ‚Ρ€Π°Π½ΡΠΏΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ
    XT = X.T
    # опрСдСляСм ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ
    XTX = XT*X
    # опрСдСляСм ΠΏΡΠ΅Π²Π΄ΠΎΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ
    inv = np.linalg.pinv(XTX)
    # Π·Π°Π΄Π°Π΅ΠΌ явный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²
    y = np.matrix(y)
    # Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π²Π΅ΠΊΡ‚ΠΎΡ€ вСсов
    return (inv*XT)*y

# запустим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
ab_np = pseudoinverse_matrix(x_np, y_np)
print ab_np
print '***************************************'
print

# напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅
def matrix_equation(X,y):
    a = np.dot(X.T, X)
    b = np.dot(X.T, y)
    return np.linalg.solve(a, b)

# запустим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
ab_np = matrix_equation(x_np,y_np)
print ab_np

Π‘Ρ€Π°Π²Π½ΠΈΠΌ врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ коэффициСнтов РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, Π² соотвСтствии с 3-мя прСдставлСнными способами.

Код для вычислСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ расчСтов

print ' 33[1m' + ' 33[4m' + "ВрСмя выполнСния расчСта коэффициСнтов Π±Π΅Π· использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy:" + ' 33[0m'
% timeit ab_us = Kramer_method(x_us,y_us)
print '***************************************'
print
print ' 33[1m' + ' 33[4m' + "ВрСмя выполнСния расчСта коэффициСнтов с использованиСм псСвдообратной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹:" + ' 33[0m'
%timeit ab_np = pseudoinverse_matrix(x_np, y_np)
print '***************************************'
print
print ' 33[1m' + ' 33[4m' + "ВрСмя выполнСния расчСта коэффициСнтов с использованиСм ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ уравнСния:" + ' 33[0m'
%timeit ab_np = matrix_equation(x_np, y_np)

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

На нСбольшом количСствС Π΄Π°Π½Π½Ρ‹Ρ…, Π²ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ «самописная» функция, которая Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ коэффициСнты ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠšΡ€Π°ΠΌΠ΅Ρ€Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способам нахоТдСния коэффициСнтов РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии.

Π“Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск

Для Π½Π°Ρ‡Π°Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚. По-простому, Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ β€” это ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ максимального роста Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. По Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с подъСмом Π² Π³ΠΎΡ€Ρƒ, Ρ‚ΠΎ ΠΊΡƒΠ΄Π° смотрит Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚, Ρ‚Π°ΠΌ ΠΈ Π΅ΡΡ‚ΡŒ самый ΠΊΡ€ΡƒΡ‚ΠΎΠΉ подъСм ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ Π³ΠΎΡ€Ρ‹. Развивая ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с Π³ΠΎΡ€ΠΎΠΉ, вспоминаСм, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ самый ΠΊΡ€ΡƒΡ‚ΠΎΠΉ спуск, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π½ΠΈΠ·ΠΈΠ½Ρ‹, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠ° β€” мСста Π³Π΄Π΅ функция Π½Π΅ возрастаСт ΠΈ Π½Π΅ ΡƒΠ±Ρ‹Π²Π°Π΅Ρ‚. Π’ этом мСстС производная Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π½Π΅ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚, Π° Π°Π½Ρ‚ΠΈΠ³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚. Для нахоТдСния Π°Π½Ρ‚ΠΈΠ³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π° Π½ΡƒΠΆΠ½ΠΎ всСго лишь ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Π½Π° -1 (минус ΠΎΠ΄ΠΈΠ½).

ΠžΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ функция ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠ², ΠΈ ΠΎΠΏΡƒΡΡ‚ΠΈΠ²ΡˆΠΈΡΡŒ Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΌΡƒ Π΄Π°Π»Π΅Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ, ΠΌΡ‹ Π½Π΅ смоТСм Π½Π°ΠΉΡ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ находится Π½ΠΈΠΆΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ. Расслабимся, Π½Π°ΠΌ это Π½Π΅ Π³Ρ€ΠΎΠ·ΠΈΡ‚! Π’ нашСм случаС ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ с СдинствСнным ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΠΎΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ наша функция РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ прСдставляСт собой ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽ ΠΏΠ°Ρ€Π°Π±ΠΎΠ»Ρƒ. А ΠΊΠ°ΠΊ ΠΌΡ‹ всС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ прСкрасно Π·Π½Π°Ρ‚ΡŒ ΠΈΠ· школьного курса ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ β€” Ρƒ ΠΏΠ°Ρ€Π°Π±ΠΎΠ»Ρ‹ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ выяснили для Ρ‡Π΅Π³ΠΎ Π½Π°ΠΌ потрСбовался Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ β€” это ΠΎΡ‚Ρ€Π΅Π·ΠΎΠΊ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ°ΠΊ Ρ€Π°Π· ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌΠΈ самыми коэффициСнтами РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск.

ΠŸΠ΅Ρ€Π΅Π΄ запуском, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ нСсколько ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΠ± Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ спуска:

  • ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ псСвдослучайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ коэффициСнтов РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ коэффициСнты Π²Π±Π»ΠΈΠ·ΠΈ нуля. Π­Ρ‚ΠΎ являСтся распространённой ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ случая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдусмотрСна своя ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°.
  • ΠžΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ частной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ 1-Π³ΠΎ порядка Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии. Π’Π°ΠΊ, Ссли производная Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ, Ρ‚ΠΎ функция возрастаСт. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, отнимая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ сторону роста, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² сторону спуска. Если производная ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Π°, Π·Π½Π°Ρ‡ΠΈΡ‚ функция Π² этой Ρ‚ΠΎΡ‡ΠΊΠ΅ ΡƒΠ±Ρ‹Π²Π°Π΅Ρ‚ ΠΈ отнимая Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ ΠΌΡ‹ двигаСмся Π² сторону спуска.
  • ΠŸΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ΠΎΠΉ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии: Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ частной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΎΠΉ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии.
  • Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠΊΠΎΡ‡ΠΈΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈ Π½Π΅ ΡƒΠ»Π΅Ρ‚Π΅Ρ‚ΡŒ Π² Π΄Π°Π»Π΅ΠΊΠΈΠΉ космос, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ шага Π² сторону спуска. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ ΠΈ Ρ†Π΅Π»ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ†Π΅Π»ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π΅Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ шаг ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π² процСссС спуска, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° вычислСния. Но сСйчас ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ нСсколько иная Π·Π°Π΄Π°Ρ‡Π°, ΠΈ ΠΌΡ‹ Π½Π°ΡƒΡ‡Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Β«Ρ‚Ρ‹ΠΊΠ°Β» ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ говорят Π² ΠΏΡ€ΠΎΡΡ‚ΠΎΠ½Π°Ρ€ΠΎΠ΄ΡŒΠ΅, эмпиричСским ΠΏΡƒΡ‚Π΅ΠΌ, установим Ρ€Π°Π·ΠΌΠ΅Ρ€ шага.
  • ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈΠ· Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии Π²Ρ‹Ρ‡Π»ΠΈ значСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии. Π”Π΅Π»Π°Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг (Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅), ΡƒΠΆΠ΅ ΠΈΠ· рассчитанных ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. И Ρ‚Π°ΠΊ Ρ†ΠΈΠΊΠ» запускаСтся вновь ΠΈ вновь, Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ достигнута трСбуСмая ΡΡ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ.

ВсС! Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ Π½Π° поиски самого Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ ΡƒΡ‰Π΅Π»ΡŒΡ ΠœΠ°Ρ€ΠΈΠ°Π½ΡΠΊΠΎΠΉ Π²ΠΏΠ°Π΄ΠΈΠ½Ρ‹. ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Π΅ΠΌ.

Код для Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска

# напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска Π±Π΅Π· использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy. 
# Ѐункция Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ x,y, Π΄Π»ΠΈΠ½Ρƒ шага (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ=0,1), Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΡƒΡŽ ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡŒ(tolerance)
def gradient_descent_usual(x_us,y_us,l=0.1,tolerance=0.000000000001):
    # сумма Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (всС мСсяца)
    sx = sum(x_us)
    # сумма истинных ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² (Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ° Π·Π° вСсь ΠΏΠ΅Ρ€ΠΈΠΎΠ΄)
    sy = sum(y_us)
    # сумма произвСдСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° истинныС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹
    list_xy = []
    [list_xy.append(x_us[i]*y_us[i]) for i in range(len(x_us))]
    sxy = sum(list_xy)
    # сумма ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
    list_x_sq = []
    [list_x_sq.append(x_us[i]**2) for i in range(len(x_us))]
    sx_sq = sum(list_x_sq)
    # количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
    num = len(x_us)
    # Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния коэффициСнтов, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ псСвдослучайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ
    a = float(random.uniform(-0.5, 0.5))
    b = float(random.uniform(-0.5, 0.5))
    # создаСм массив с ошибками, для старта ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ значСния 1 ΠΈ 0
    # послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ спуска стартовыС значСния ΡƒΠ΄Π°Π»ΠΈΠΌ
    errors = [1,0]
    # запускаСм Ρ†ΠΈΠΊΠ» спуска
    # Ρ†ΠΈΠΊΠ» Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ послСднСй ошибки суммы ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ мСньшС tolerance
    while abs(errors[-1]-errors[-2]) > tolerance:
        a_step = a - l*(num*a + b*sx - sy)/num
        b_step = b - l*(a*sx + b*sx_sq - sxy)/num
        a = a_step
        b = b_step
        ab = [a,b]
        errors.append(errors_sq_Kramer_method(ab,x_us,y_us))
    return (ab),(errors[2:])

# запишСм массив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ 
list_parametres_gradient_descence = gradient_descent_usual(x_us,y_us,l=0.1,tolerance=0.000000000001)


print ' 33[1m' + ' 33[4m' + "ЗначСния коэффициСнтов a ΠΈ b:" + ' 33[0m'
print 'a =', round(list_parametres_gradient_descence[0][0],3)
print 'b =', round(list_parametres_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ:" + ' 33[0m'
print round(list_parametres_gradient_descence[1][-1],3)
print



print ' 33[1m' + ' 33[4m' + "ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π² Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС:" + ' 33[0m'
print len(list_parametres_gradient_descence[1])
print

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

ΠœΡ‹ ΠΏΠΎΠ³Ρ€ΡƒΠ·ΠΈΠ»ΠΈΡΡŒ Π½Π° самоС Π΄Π½ΠΎ ΠœΠ°Ρ€ΠΈΠ°Π½ΡΠΊΠΎΠΉ Π²ΠΏΠ°Π΄ΠΈΠ½Ρ‹ ΠΈ Ρ‚Π°ΠΌ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ всС Ρ‚Π΅ ΠΆΠ΅ значСния коэффициСнтов РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, Ρ‡Ρ‚ΠΎ собствСнно ΠΈ слСдовало ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ.

Π‘ΠΎΠ²Π΅Ρ€ΡˆΠΈΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° этот Ρ€Π°Π·, Π½Π°Ρ‡ΠΈΠ½ΠΊΠΎΠΉ нашСго Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ²ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° NumPy.

Код для Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска (NumPy)

# ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy, 
# напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ опрСдСлСния суммы ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ с использованиСм NumPy
def error_square_numpy(ab,x_np,y_np):
    y_pred = np.dot(x_np,ab)
    error = y_pred - y_np
    return sum((error)**2)

# напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy. 
# Ѐункция Π½Π° Π²Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ x,y, Π΄Π»ΠΈΠ½Ρƒ шага (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ=0,1), Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΡƒΡŽ ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡŒ(tolerance)
def gradient_descent_numpy(x_np,y_np,l=0.1,tolerance=0.000000000001):
    # сумма Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (всС мСсяца)
    sx = float(sum(x_np[:,1]))
    # сумма истинных ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² (Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠ° Π·Π° вСсь ΠΏΠ΅Ρ€ΠΈΠΎΠ΄)
    sy = float(sum(y_np))
    # сумма произвСдСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° истинныС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹
    sxy = x_np*y_np
    sxy = float(sum(sxy[:,1]))
    # сумма ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
    sx_sq = float(sum(x_np[:,1]**2))
    # количСство Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ
    num = float(x_np.shape[0])
    # Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния коэффициСнтов, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ псСвдослучайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ
    a = float(random.uniform(-0.5, 0.5))
    b = float(random.uniform(-0.5, 0.5))
    # создаСм массив с ошибками, для старта ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ значСния 1 ΠΈ 0
    # послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ спуска стартовыС значСния ΡƒΠ΄Π°Π»ΠΈΠΌ
    errors = [1,0]
    # запускаСм Ρ†ΠΈΠΊΠ» спуска
    # Ρ†ΠΈΠΊΠ» Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ послСднСй ошибки суммы ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ, Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ мСньшС tolerance
    while abs(errors[-1]-errors[-2]) > tolerance:
        a_step = a - l*(num*a + b*sx - sy)/num
        b_step = b - l*(a*sx + b*sx_sq - sxy)/num
        a = a_step
        b = b_step
        ab = np.array([[a],[b]])
        errors.append(error_square_numpy(ab,x_np,y_np))
    return (ab),(errors[2:])

# запишСм массив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ 
list_parametres_gradient_descence = gradient_descent_numpy(x_np,y_np,l=0.1,tolerance=0.000000000001)

print ' 33[1m' + ' 33[4m' + "ЗначСния коэффициСнтов a ΠΈ b:" + ' 33[0m'
print 'a =', round(list_parametres_gradient_descence[0][0],3)
print 'b =', round(list_parametres_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ:" + ' 33[0m'
print round(list_parametres_gradient_descence[1][-1],3)
print

print ' 33[1m' + ' 33[4m' + "ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π² Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС:" + ' 33[0m'
print len(list_parametres_gradient_descence[1])
print

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии
ЗначСния коэффициСнтов РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½Ρ‹.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ измСнялась ошибка ΠΏΡ€ΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ измСнялась сумма ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ шагом.

Код для Π³Ρ€Π°Ρ„ΠΈΠΊΠ° сумм ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ

print 'Π“Ρ€Π°Ρ„ΠΈΠΊβ„–4 "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ-шагово"'
plt.plot(range(len(list_parametres_gradient_descence[1])), list_parametres_gradient_descence[1], color='red', lw=3)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

Π“Ρ€Π°Ρ„ΠΈΠΊ β„–4 Β«Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС»

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

На Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ шагом ошибка ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ, Π° спустя ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ количСство ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ наблюдаСм практичСски Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΡƒΡŽ линию.

НапослСдок ΠΎΡ†Π΅Π½ΠΈΠΌ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния ΠΊΠΎΠ΄Π°:

Код для опрСдСлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ вычислСния Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска

print ' 33[1m' + ' 33[4m' + "ВрСмя выполнСния Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска Π±Π΅Π· использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy:" + ' 33[0m'
%timeit list_parametres_gradient_descence = gradient_descent_usual(x_us,y_us,l=0.1,tolerance=0.000000000001)
print '***************************************'
print

print ' 33[1m' + ' 33[4m' + "ВрСмя выполнСния Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy:" + ' 33[0m'
%timeit list_parametres_gradient_descence = gradient_descent_numpy(x_np,y_np,l=0.1,tolerance=0.000000000001)

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎ, Π½ΠΎ ΠΎΠΏΡΡ‚ΡŒ простая «самописная» функция, которая Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ NumPy ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°Π΅Ρ‚ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния расчСтов Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ NumPy.

Но ΠΌΡ‹ Π½Π΅ стоим Π½Π° мСстС, Π° двигаСмся Π² сторону изучСния Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ способа Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ уравнСния простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии. ВстрСчайтС!

БтохастичСский Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ быстрСС ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹ стохастичСского Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска, Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ отличия ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска. ΠœΡ‹, Π² случаС с Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΌ спуском, Π² уравнСниях ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΎΡ‚ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии использовали суммы Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ всСх ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² ΠΈ истинных ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ², ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ΡΡ Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ суммы всСх РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии). Π’ стохастичСском Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС значСния, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅, Π° вмСсто этого, псСвдослучайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ индСкс Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π³ΠΎ значСния.

НапримСр, Ссли индСкс опрСдСлился Π·Π° Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ 3 (Ρ‚Ρ€ΠΈ), Ρ‚ΠΎ ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ значСния РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, Π΄Π°Π»Π΅Π΅ подставляСм значСния Π² уравнСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ опрСдСляСм Π½ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹. Π—Π°Ρ‚Π΅ΠΌ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹, ΠΌΡ‹ ΠΎΠΏΡΡ‚ΡŒ псСвдослучайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ опрСдСляСм индСкс Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ, подставляСм значСния, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ индСксу Π² уравнСния частных ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ…, ΠΏΠΎ Π½ΠΎΠ²ΠΎΠΌΡƒ опрСдСляСм ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ Ρ‚.Π΄. Π΄ΠΎ позСлСнСния сходимости. На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, ΠΊΠ°ΠΊ это Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ΠŸΡ€Π°Π²Π΄Π° стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ шагом ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ ошибка, Π½ΠΎ тСндСнция бСзусловно имССтся.

ΠšΠ°ΠΊΠΎΠ²Ρ‹ прСимущСства стохастичСского Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ? Π’ случаС, Ссли Ρƒ нас Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π²Π΅Π»ΠΈΠΊ ΠΈ измСряСтся дСсятками тысяч Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, допустим ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ тысячу ΠΈΠ· Π½ΠΈΡ…, Π½Π΅ΠΆΠ΅Π»ΠΈ всю Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ. Π’ΠΎΡ‚ Π² этом случаС ΠΈ запускаСтся стохастичСский Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск. Π’ нашСм случаС ΠΌΡ‹ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ большой Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠΌ.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΊΠΎΠ΄.

Код для стохастичСского Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ стох.Π³Ρ€Π°Π΄.шага
def stoch_grad_step_usual(vector_init, x_us, ind, y_us, l):
#     Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ икс, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ соотвСтствуСт случайному Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ind 
# (см.Ρ„-Ρ†ΠΈΡŽ stoch_grad_descent_usual)
    x = x_us[ind]
#     рассчитывыаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ y (Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΡƒ), которая соотвСтствуСт Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ x
    y_pred = vector_init[0] + vector_init[1]*x_us[ind]
#     вычисляСм ΠΎΡˆΠΈΠ±ΠΊΡƒ расчСтной Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прСдставлСнной Π² Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅
    error = y_pred - y_us[ind]
#     опрСдСляСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π° ab
    grad_a = error
#     опрСдСляСм Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρƒ ab
    grad_b = x_us[ind]*error
#     вычисляСм Π½ΠΎΠ²Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ коэффициСнтов
    vector_new = [vector_init[0]-l*grad_a, vector_init[1]-l*grad_b]
    return vector_new


# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ стох.Π³Ρ€Π°Π΄.спуска
def stoch_grad_descent_usual(x_us, y_us, l=0.1, steps = 800):
#     для самого Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π°Π΄Π°Π΄ΠΈΠΌ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния коэффициСнтов
    vector_init = [float(random.uniform(-0.5, 0.5)), float(random.uniform(-0.5, 0.5))]
    errors = []
#     запустим Ρ†ΠΈΠΊΠ» спуска
# Ρ†ΠΈΠΊΠ» расчитан Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ количСство шагов (steps)
    for i in range(steps):
        ind = random.choice(range(len(x_us)))
        new_vector = stoch_grad_step_usual(vector_init, x_us, ind, y_us, l)
        vector_init = new_vector
        errors.append(errors_sq_Kramer_method(vector_init,x_us,y_us))
    return (vector_init),(errors)


# запишСм массив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ 
list_parametres_stoch_gradient_descence = stoch_grad_descent_usual(x_us, y_us, l=0.1, steps = 800)

print ' 33[1m' + ' 33[4m' + "ЗначСния коэффициСнтов a ΠΈ b:" + ' 33[0m'
print 'a =', round(list_parametres_stoch_gradient_descence[0][0],3)
print 'b =', round(list_parametres_stoch_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ:" + ' 33[0m'
print round(list_parametres_stoch_gradient_descence[1][-1],3)
print

print ' 33[1m' + ' 33[4m' + "ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π² стохастичСском Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС:" + ' 33[0m'
print len(list_parametres_stoch_gradient_descence[1])

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° коэффициСнты ΠΈ Π»ΠΎΠ²ΠΈΠΌ сСбя Π½Π° вопросС «Как ΠΆΠ΅ Ρ‚Π°ΠΊ?Β». Π£ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния коэффициСнтов РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ стохастичСский Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск нашСл Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ уравнСния? Π£Π²Ρ‹, Π½Π΅Ρ‚. Достаточно ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° сумму ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π½ΠΎΠ²Ρ‹Ρ… значСниях коэффициСнтов, ошибка большС. НС спСшим ΠΎΡ‚Ρ‡Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ. ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊ измСнСния ошибки.

Код для Π³Ρ€Π°Ρ„ΠΈΠΊΠ° суммы ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ стохастичСском Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС

print 'Π“Ρ€Π°Ρ„ΠΈΠΊ β„–5 "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ-шагово"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1])), list_parametres_stoch_gradient_descence[1], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

Π“Ρ€Π°Ρ„ΠΈΠΊ β„–5 Β«Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ стохастичСском Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС»

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Π² Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊ, всС становится Π½Π° свои мСста ΠΈ сСйчас ΠΌΡ‹ всС исправим.

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ? ΠŸΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅. Когда ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ мСсяц, Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ для Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ мСсяца наш Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ стрСмится ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² расчСтС Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΠΈ. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠΉ мСсяц ΠΈ повторяСм расчСт, Π½ΠΎ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ ΡƒΠΆΠ΅ для Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ мСсяца. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ вспомним, Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° мСсяца сущСствСнно ΠΎΡ‚ΠΊΠ»ΠΎΠ½ΡΡŽΡ‚ΡΡ ΠΎΡ‚ Π»ΠΈΠ½ΠΈΠΈ уравнСния простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° выбираСтся любой ΠΈΠ· этих Π΄Π²ΡƒΡ… мСсяцСв, Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ…, наш Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΠΎ всСй Π²Ρ‹Π±ΠΎΡ€ΠΊΠ΅. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ? ΠžΡ‚Π²Π΅Ρ‚ простой: Π½Π°Π΄ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ шаг спуска. Π’Π΅Π΄ΡŒ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ² шаг спуска, ошибка Ρ‚Π°ΠΊ ΠΆΠ΅ пСрСстанСт Β«ΡΠΊΠ°ΠΊΠ°Ρ‚ΡŒΒ» Ρ‚ΠΎ Π²Π²Π΅Ρ€Ρ…, Ρ‚ΠΎ Π²Π½ΠΈΠ·. Π’Π΅Ρ€Π½Π΅Π΅, ошибка Β«ΡΠΊΠ°ΠΊΠ°Ρ‚ΡŒΒ» Π½Π΅ пСрСстанСт, Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ это Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Ρ‚Π°ΠΊ ΠΏΡ€Ρ‹Ρ‚ΠΊΠΎ:) ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ.

Код для запуска SGD с мСньшим шагом

# запустим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ² шаг Π² 100 Ρ€Π°Π· ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ² количСство шагов ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΠ²ΡƒΡŽΡ‰Π΅ 
list_parametres_stoch_gradient_descence = stoch_grad_descent_usual(x_us, y_us, l=0.001, steps = 80000)

print ' 33[1m' + ' 33[4m' + "ЗначСния коэффициСнтов a ΠΈ b:" + ' 33[0m'
print 'a =', round(list_parametres_stoch_gradient_descence[0][0],3)
print 'b =', round(list_parametres_stoch_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ:" + ' 33[0m'
print round(list_parametres_stoch_gradient_descence[1][-1],3)
print



print ' 33[1m' + ' 33[4m' + "ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π² стохастичСском Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС:" + ' 33[0m'
print len(list_parametres_stoch_gradient_descence[1])

print 'Π“Ρ€Π°Ρ„ΠΈΠΊ β„–6 "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ-шагово"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1])), list_parametres_stoch_gradient_descence[1], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π“Ρ€Π°Ρ„ΠΈΠΊ β„–6 Β«Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ стохастичСском Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС (80 тыс. шагов)Β»

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

ЗначСния коэффициСнтов ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ»ΠΈΡΡŒ, Π½ΠΎ всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹. ГипотСтичСски это ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° послСдних 1000 итСрациях значСния коэффициСнтов, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±Ρ‹Π»Π° Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Π° минимальная ошибка. ΠŸΡ€Π°Π²Π΄Π° Π½Π°ΠΌ для этого придСтся Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ сами значСния коэффициСнтов. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ этого Π΄Π΅Π»Π°Ρ‚ΡŒ, Π° Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊ. Он выглядит Π³Π»Π°Π΄ΠΊΠΈΠΌ, ΠΈ ошибка ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎ. На самом Π΄Π΅Π»Π΅ это Π½Π΅ Ρ‚Π°ΠΊ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 1000 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ сравним ΠΈΡ… с послСдними.

Код для Π³Ρ€Π°Ρ„ΠΈΠΊΠ° SGD (ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 1000 шагов)

print 'Π“Ρ€Π°Ρ„ΠΈΠΊ β„–7 "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ-шагово. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ 1000 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1][:1000])), 
         list_parametres_stoch_gradient_descence[1][:1000], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

print 'Π“Ρ€Π°Ρ„ΠΈΠΊ β„–7 "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ ΠΏΠΎ-шагово. ПослСдниС 1000 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ"'
plt.plot(range(len(list_parametres_stoch_gradient_descence[1][-1000:])), 
         list_parametres_stoch_gradient_descence[1][-1000:], color='red', lw=2)
plt.xlabel('Steps (Iteration)', size=16)
plt.ylabel('Sum of squared deviations', size=16)
plt.show()

Π“Ρ€Π°Ρ„ΠΈΠΊ β„–7 Β«Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ SGD (ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 1000 шагов)Β»

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π“Ρ€Π°Ρ„ΠΈΠΊ β„–8 Β«Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ SGD (послСдниС 1000 шагов)Β»

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π’ самом Π½Π°Ρ‡Π°Π»Π΅ спуска ΠΌΡ‹ наблюдаСм достаточно Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ΅ ΠΈ ΠΊΡ€ΡƒΡ‚ΠΎΠ΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ ошибки. На послСдних итСрациях ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ошибка Ρ…ΠΎΠ΄ΠΈΡ‚ Π²ΠΎΠΊΡ€ΡƒΠ³ Π΄Π° ΠΎΠΊΠΎΠ»ΠΎ значСния Π² 1,475 ΠΈ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ Π΄Π°ΠΆΠ΅ равняСтся этому ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ всС Ρ€Π°Π²Π½ΠΎ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π²Π²Ρ‹ΡΡŒβ€¦ ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡŽΡΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ значСния коэффициСнтов РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии ΠΈ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚Π΅, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ошибка минимальна. Однако Ρƒ нас Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π΅Π΅: Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ 80 тыс. шагов (см. ΠΊΠΎΠ΄), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ значСния, Π±Π»ΠΈΠ·ΠΊΠΈΠ΅ ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ. А это, ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ ΠΈΠ΄Π΅Π΅ ΠΎΠ± экономии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ вычислСний ΠΏΡ€ΠΈ стохастичСском Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ. Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ? НС Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… итСрациях ΠΌΡ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ ΠΈΠ΄Π΅ΠΌ Π²Π½ΠΈΠ· ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ стоит ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ большой шаг Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Ρ… итСрациях ΠΈ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ продвиТСния Π²ΠΏΠ΅Ρ€Π΅Π΄ шаг ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ‚ΡŒ. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ этого Π΄Π΅Π»Π°Ρ‚ΡŒ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ β€” ΠΎΠ½Π° ΠΈ Ρ‚Π°ΠΊ ΡƒΠΆΠ΅ Π·Π°Ρ‚ΡΠ½ΡƒΠ»Π°ΡΡŒ. Π–Π΅Π»Π°ΡŽΡ‰ΠΈΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈ сами ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это Π½Π΅ слоТно πŸ™‚

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ стохастичСский Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ NumPy (ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΏΠΎΡ‚Ρ‹ΠΊΠ°Ρ‚ΡŒΡΡ ΠΎ ΠΊΠ°ΠΌΠ½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ выявили Ρ€Π°Π½Π½Π΅Π΅)

Код для стохастичСского Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска (NumPy)

# для Π½Π°Ρ‡Π°Π»Π° напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ шага
def stoch_grad_step_numpy(vector_init, X, ind, y, l):
    x = X[ind]
    y_pred = np.dot(x,vector_init)
    err = y_pred - y[ind]
    grad_a = err
    grad_b = x[1]*err
    return vector_init - l*np.array([grad_a, grad_b])

# ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ стохастичСского Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска
def stoch_grad_descent_numpy(X, y, l=0.1, steps = 800):
    vector_init = np.array([[np.random.randint(X.shape[0])], [np.random.randint(X.shape[0])]])
    errors = []
    for i in range(steps):
        ind = np.random.randint(X.shape[0])
        new_vector = stoch_grad_step_numpy(vector_init, X, ind, y, l)
        vector_init = new_vector
        errors.append(error_square_numpy(vector_init,X,y))
    return (vector_init), (errors)

# запишСм массив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ 
list_parametres_stoch_gradient_descence = stoch_grad_descent_numpy(x_np, y_np, l=0.001, steps = 80000)

print ' 33[1m' + ' 33[4m' + "ЗначСния коэффициСнтов a ΠΈ b:" + ' 33[0m'
print 'a =', round(list_parametres_stoch_gradient_descence[0][0],3)
print 'b =', round(list_parametres_stoch_gradient_descence[0][1],3)
print


print ' 33[1m' + ' 33[4m' + "Π‘ΡƒΠΌΠΌΠ° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ² ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ:" + ' 33[0m'
print round(list_parametres_stoch_gradient_descence[1][-1],3)
print



print ' 33[1m' + ' 33[4m' + "ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π² стохастичСском Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠΌ спускС:" + ' 33[0m'
print len(list_parametres_stoch_gradient_descence[1])
print

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

ЗначСния ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΈ спускС Π±Π΅Π· использования NumPy. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, это Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ.

Π£Π·Π½Π°Π΅ΠΌ сколько ΠΆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π»ΠΈ Ρƒ нас стохастичСскиС Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹Π΅ спуски.

Код для опрСдСлСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ вычислСния SGD (80 тыс. шагов)

print ' 33[1m' + ' 33[4m' +
"ВрСмя выполнСния стохастичСского Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска Π±Π΅Π· использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy:"
+ ' 33[0m'
%timeit list_parametres_stoch_gradient_descence = stoch_grad_descent_usual(x_us, y_us, l=0.001, steps = 80000)
print '***************************************'
print

print ' 33[1m' + ' 33[4m' +
"ВрСмя выполнСния стохастичСского Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy:"
+ ' 33[0m'
%timeit list_parametres_stoch_gradient_descence = stoch_grad_descent_numpy(x_np, y_np, l=0.001, steps = 80000)

РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии

Π§Π΅ΠΌ дальшС Π² лСс, Ρ‚Π΅ΠΌ Ρ‚Π΅ΠΌΠ½Π΅Π΅ Ρ‚ΡƒΡ‡ΠΈ: ΠΎΠΏΡΡ‚ΡŒ «самописная» Ρ„ΠΎΡ€ΠΌΡƒΠ»Π° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ВсС это Π½Π°Π²ΠΎΠ΄ΠΈΡ‚ Π½Π° мысли ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΈΠ΅ способы использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΡΡŽΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вычислСний. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ ΠΎ Π½ΠΈΡ… ΡƒΠΆΠ΅ Π½Π΅ ΡƒΠ·Π½Π°Π΅ΠΌ. Π‘ΡƒΠ΄Π΅Ρ‚ ΠΎ Ρ‡Π΅ΠΌ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π½Π° досугС:)

Π Π΅Π·ΡŽΠΌΠΈΡ€ΡƒΠ΅ΠΌ

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ Ρ€Π΅Π·ΡŽΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ скорСС всСго, Π²ΠΎΠ·Π½ΠΈΠΊ Ρƒ нашСго Π΄ΠΎΡ€ΠΎΠ³ΠΎΠ³ΠΎ читатСля. Для Ρ‡Π΅Π³ΠΎ, собствСнно, Ρ‚Π°ΠΊΠΈΠ΅ «мучСния» со спусками, Π·Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ Π³ΠΎΡ€Π΅ Π²Π²Π΅Ρ€Ρ… ΠΈ Π²Π½ΠΈΠ· (прСимущСствСнно Π²Π½ΠΈΠ·), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π·Π°Π²Π΅Ρ‚Π½ΡƒΡŽ Π½ΠΈΠ·ΠΈΠ½Ρƒ, Ссли Π² Π½Π°ΡˆΠΈΡ… Ρ€ΡƒΠΊΠ°Ρ… Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠΎΡ‰Π½Ρ‹ΠΉ ΠΈ простой ΠΏΡ€ΠΈΠ±ΠΎΡ€, Π² Π²ΠΈΠ΄Π΅ аналитичСского Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ Ρ‚Π΅Π»Π΅ΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ нас Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ мСсто?

ΠžΡ‚Π²Π΅Ρ‚ Π½Π° этот вопрос Π»Π΅ΠΆΠΈΡ‚ Π½Π° повСрхности. БСйчас ΠΌΡ‹ Ρ€Π°Π·Π±ΠΈΡ€Π°Π»ΠΈ ΠΎΡ‡Π΅Π½ΡŒ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ истинный ΠΎΡ‚Π²Π΅Ρ‚ РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии зависит ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ° РСшаСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии. Π’ ΠΆΠΈΠ·Π½ΠΈ Ρ‚Π°ΠΊΠΎΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡˆΡŒ Π½Π΅ часто, поэтому прСдставим, Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² 2, 30, 50 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅. Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ этому тысячи, Π° Ρ‚ΠΎ ΠΈ дСсятки тысяч Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠ°. Π’ этом случаС аналитичСскоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π²Ρ‹Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ испытания ΠΈ Π΄Π°Ρ‚ΡŒ сбой. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск ΠΈ Π΅Π³ΠΎ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, Π½ΠΎ Π²Π΅Ρ€Π½ΠΎ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ°Ρ‚ΡŒ нас ΠΊ Ρ†Π΅Π»ΠΈ β€” ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. А Π½Π° счСт скорости Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ β€” ΠΌΡ‹ навСрняка Π΅Ρ‰Π΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ способы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволят Π½Π°ΠΌ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Ρ€Π΅Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ шага (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ).

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ собствСнно ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ Ρ€Π΅Π·ΡŽΠΌΠ΅.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, надСюсь, Ρ‡Ρ‚ΠΎ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π», ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌ Β«Π΄Π°Ρ‚Π° сайнтистам» Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ уравнСния простой (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ) Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΡ‹ рассмотрСли нСсколько способов Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ уравнСния. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Π² зависимости ΠΎΡ‚ ситуации, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ поставлСнной Π·Π°Π΄Π°Ρ‡ΠΈ.

Π’-Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ силу Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… настроСк, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π»ΠΈΠ½Ρ‹ шага Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½ΠΎΠ³ΠΎ спуска. Π­Ρ‚ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ нСльзя ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅Π³Π°Ρ‚ΡŒ. Как Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ΄ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π²Ρ‹ΡˆΠ΅, с Ρ†Π΅Π»ΡŒΡŽ сокращСния Π·Π°Ρ‚Ρ€Π°Ρ‚ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ вычислСний, Π΄Π»ΠΈΠ½Ρƒ шага стоит ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ спуска.

Π’-Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹Ρ…, Π² нашСм случаС, «самописныС» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Π»ΡƒΡ‡ΡˆΠΈΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ вычислСний. ВСроятно, это связано с Π½Π΅ самым ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ возмоТностСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ NumPy. Но ΠΊΠ°ΠΊ Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ, Π²Ρ‹Π²ΠΎΠ΄ Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ. Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, ΠΈΠ½ΠΎΠ³Π΄Π° стоит ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Ρ‚ΡŒ сомнСнию ΡƒΡΡ‚ΠΎΡΠ²ΡˆΠΈΠ΅ΡΡ мнСния, Π° с Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π½Π΅ всСгда стоит всС ΡƒΡΠ»ΠΎΠΆΠ½ΡΡ‚ΡŒ β€” Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ ΠΈΠ½ΠΎΠ³Π΄Π° эффСктивнСС оказываСтся Π±ΠΎΠ»Π΅Π΅ простой способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ. А Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ†Π΅Π»ΡŒ Ρƒ нас Π±Ρ‹Π»Π° Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ уравнСния простой Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ рСгрСссии, Ρ‚ΠΎ использованиС «самописных» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π°ΠΌ Π²ΠΏΠΎΠ»Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΎ.

Π›ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π° (ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ Ρ‚ΠΎΠ³ΠΎ)

1. ЛинСйная рСгрСссия

http://statistica.ru/theory/osnovy-lineynoy-regressii/

2. ΠœΠ΅Ρ‚ΠΎΠ΄ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΡ… ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΎΠ²

mathprofi.ru/metod_naimenshih_kvadratov.html

3. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Π°Ρ

www.mathprofi.ru/chastnye_proizvodnye_primery.html

4. Π“Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚

mathprofi.ru/proizvodnaja_po_napravleniju_i_gradient.html

5. Π“Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π½Ρ‹ΠΉ спуск

habr.com/ru/post/471458

habr.com/ru/post/307312

artemarakcheev.com//2017-12-31/linear_regression

6. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° NumPy

docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.linalg.solve.html

docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.pinv.html

pythonworld.ru/numpy/2.html

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ