튜토리얼

필수 데이터사이언스 방법론 가이드
카테고리는 수준별, 언어별, 분야별, 주제별 순으로 정렬되어 있습니다.

단순 선형 회귀

작성자
sungkenh
작성일
2017-01-12 14:46
조회
127
카테고리 : [ 중급   |   Python   |   기타   |   기타 ]

1) 제목


단순 선형 회귀 분석

2) 작성자


컴퓨터정보통신공학과 홍성은

3) 링크 및 출처


Data Science From Scratch

4) 문제 및 개요


5) 데이터


6) 해결방법 및 결과






6.1 Simple Linear Regression (단순 선형 회귀)
  • 통계학에서, 선형 회귀(linear regression)는 종속 변수 y와 한 개 이상의 독립 변수 (또는 설명 변수) X와의 선형 상관 관계를 모델링하는 회귀분석 기법이다. 한 개의 설명 변수에 기반한 경우에는 단순 선형 회귀, 둘 이상의 설명 변수에 기반한 경우에는 다중 선형 회귀라고 합니다.

  • 커뮤니케이션 과학에서 가장 자주 사용하는 통계분석 기법 중 하나인 회귀분석은 크게 두 가지 장점을 갖고 있습니다. 하나는 예측변인이 변화함에 따라 결과변인이 얼마나 변화하는지를 예측할 수 있고, 또 다른 하나는 제3의 변인을 통제함으로써 예측변인과 결과변인 간의 인과성을 통계적으로 검증할 수 있다는 것입니다.
    상수 α (alpha)와 β (beta) 있을때, 회귀모형은 다음과 같이 모수에 대해 선형(linear)인 모형입니다

  • yi = βxi+α+εi

  • yi는 사용자가 매일 사이트에서 소비하는 시간

  • xi는 사용자 i의 친구 수

  • εi는이 단순한 모델에 의해 설명되지 않은 다른 요소가 있다는 사실을 나타내는 오류입니다.


 

6.2 용어정리
  • 회귀분석: 변수와 변수 사이의 관계를 알아보기 위한 통계적 분석방법, 독립변수의 값에 의하여 종속변수의 값을 예측하위 위함 z 독립변수(independent variable): 종속변수에 영향을 미치는 변수 z 종속변수(dependent variable): 분석의 대상이 되는 변수

  • 회귀분석의 분류 z 단순회귀분석(simple regression analysis): 하나의 종속변수와 하나의 독립변수의 관계를 분석 z 다중회귀분석(multiple regression analysis): 하나의 종속변수와 둘 이상의 독립변수간의 관계를 분석 z 단순회귀분석이 간단하고 결과의 해석도 명확하지만 종속변수를 하나의 독립변수로 설명하기 어려운 경우가 많다.


 

In [43]:
from collections import Counter
from functools import partial
from linear_algebra import dot, vector_add
from stats import median, standard_deviation
from probability import normal_cdf
from gradient_descent import minimize_stochastic
from simple_linear_regression import total_sum_of_squares
import math, random


In [44]:

def predict(alpha, beta, x_i):
return beta * x_i + alpha


In [45]:

def error(alpha, beta, x_i, y_i):
return y_i - predict(alpha, beta, x_i)

 

알파와 베타를 선택하면 각 입력 x_i에 대한 예측 된 결과를 얻을 수 있습니다. 실제 출력 y_i를 알기 때문에 각 쌍의 오류를 계산할 수 있습니다.

In [46]:

def sum_of_squared_errors(alpha, beta, x, y):
return sum(error(alpha, beta, x_i, y_i) ** 2
for x_i, y_i in zip(x, y))



우리가 정말로 알고 싶은 것은 전체 데이터 세트에 대한 총 오류입니다. 그러나 x_1에 대한 예측이 너무 높고 x_2에 대한 예측이 너무 낮으면 오류를 그냥 추가 할 수 있습니다. 대신에 제곱 된 오류를 더합니다.
이러한 최적의 표본회귀선을 구하는 방법중 가장 많이 사용되는 추정법이 최소자승법(OLS: ordinary least squares method)입니다.

오차항을 자승한 값들의 합이 최소기 되도록 하는 회귀선을 구하는 방법:
Min∑ i=1,n ei 2= Min∑ i=1,n (Yi - Y^i)2 = Min∑ i=1,n (Yi - α^ - β^Xi)2
최소자승 추정량의 도출
식 Min L = Min∑ i=1,n ei 2 = Min∑ i=1,n (Yi - α^ - β^Xi)2 에 나타난 오차의 최소자승값을 구하려면 이식을 α^ 와 β^에 대해 1 차미분한 값이 0 이 되어야한다:
X (표본평균)= (1/n) ∑ Xi, Y (표본평균)= (1/n)∑Yi,
xi (편차)= Xi – X, yi (편차) = Yi - Y
α^ = Y - β^ X
α^ 과 β^ 은 알려지지 않은 모집단의 상수 α 과 β 의 최소자승추정량 (least squares estimator: LSE)이며, 이들은 확률함수형태의 확률변수입니다..

In [47]:
from collections import Counter, defaultdict
from linear_algebra import vector_subtract
from stats import mean, correlation, standard_deviation, de_mean
from gradient_descent import minimize_stochastic
import math, random
def least_squares_fit(x, y):
beta = correlation(x, y) * standard_deviation(y) / standard_deviation(x)
alpha = mean(y) - beta * mean(x)
return alpha, beta


베타의 선택은 입력 값이 표준 편차 (x)만큼 증가 할 때 상관 관계 (x, y) * 표준 편차 (y)만큼 예측이 증가한다는 것을 의미합니다. x와 y가 완벽하게 상관되는 경우, x의 표준 편차가 1 증가하면 예측에서 표준 편차 -y가 1 증가합니다. 이들이 완벽하게 역 상관 관계에있을 때 x가 증가하면 예측이 감소합니다. 상관 관계가 0 일 때 베타는 0이며, 이는 x의 변화가 예측에 전혀 영향을 미치지 않음을 의미합니다

alpha, beta = least_squares_fit(num_friends_good, daily_minutes_good)

In [48]:
def total_sum_of_squares(y):
"""the total squared variation of y_i's from their mean"""
return sum(v ** 2 for v in de_mean(y))

def r_squared(alpha, beta, x, y):
"""the fraction of variation in y captured by the model, which equals
1 - the fraction of variation in y not captured by the model"""

return 1.0 - (sum_of_squared_errors(alpha, beta, x, y) /
total_sum_of_squares(y))

이제 우리는 제곱 된 예측 오차의 합을 최소화하는 알파와 베타를 선택했습니다. 우리가 선택할 수있는 하나의 선형 모델은 "제곱근 오차의 합이 제곱의 총합과 정확히 일치하는"항상 "평균 (y) 예측"(알파 = 평균 (y) 및 베타 = 0에 해당)입니다. 이것은 제로의 R 제곱을 의미합니다.이 모델은 (분명히,이 경우) 평균을 예측하는 것보다 나은 성능을 발휘하지 못하는 모델을 나타냅니다. 분명히, 최소 자승 모델은 적어도 그 이상이어야합니다. 즉, 제곱 오류의 합이 많아야 총 제곱합 인 것을 의미합니다. 즉, R 제곱이 적어도 0이어야 함을 의미합니다. 그리고 제곱 오류의 합은 최소 0이어야합니다. 즉 R 제곱이 최대 1 일 수 있습니다. 숫자가 높을수록 모델이 더 적합합니다. 여기서 우리는 0.329의 Rsquared를 계산합니다.이 모델은 우리 모델이 데이터를 맞추는 데만 일종의 괜찮은 것이며, 분명히 다른 요인들이 작용한다는 것을 알려줍니다.
6.1 Simple Linear Regression (단순 선형 회귀)

통계학에서, 선형 회귀(linear regression)는 종속 변수 y와 한 개 이상의 독립 변수 (또는 설명 변수) X와의 선형 상관 관계를 모델링하는 회귀분석 기법이다. 한 개의 설명 변수에 기반한 경우에는 단순 선형 회귀, 둘 이상의 설명 변수에 기반한 경우에는 다중 선형 회귀라고 합니다.
커뮤니케이션 과학에서 가장 자주 사용하는 통계분석 기법 중 하나인 회귀분석은 크게 두 가지 장점을 갖고 있습니다. 하나는 예측변인이 변화함에 따라 결과변인이 얼마나 변화하는지를 예측할 수 있고, 또 다른 하나는 제3의 변인을 통제함으로써 예측변인과 결과변인 간의 인과성을 통계적으로 검증할 수 있다는 것입니다.
상수 α (alpha)와 β (beta) 있을때, 회귀모형은 다음과 같이 모수에 대해 선형(linear)인 모형입니다
yi = βxi+α+εi
yi는 사용자가 매일 사이트에서 소비하는 시간
xi는 사용자 i의 친구 수
εi는이 단순한 모델에 의해 설명되지 않은 다른 요소가 있다는 사실을 나타내는 오류입니다.

6.2 용어정리

회귀분석: 변수와 변수 사이의 관계를 알아보기 위한 통계적 분석방법, 독립변수의 값에 의하여 종속변수의 값을 예측하위 위함 z 독립변수(independent variable): 종속변수에 영향을 미치는 변수 z 종속변수(dependent variable): 분석의 대상이 되는 변수
회귀분석의 분류 z 단순회귀분석(simple regression analysis): 하나의 종속변수와 하나의 독립변수의 관계를 분석 z 다중회귀분석(multiple regression analysis): 하나의 종속변수와 둘 이상의 독립변수간의 관계를 분석 z 단순회귀분석이 간단하고 결과의 해석도 명확하지만 종속변수를 하나의 독립변수로 설명하기 어려운 경우가 많다.
In [43]:





from collections import Counter
from functools import partial
from linear_algebra import dot, vector_add
from stats import median, standard_deviation
from probability import normal_cdf
from gradient_descent import minimize_stochastic
from simple_linear_regression import total_sum_of_squares
import math, random


In [44]:

def predict(alpha, beta, x_i):
return beta * x_i + alpha


In [45]:

def error(alpha, beta, x_i, y_i):
return y_i - predict(alpha, beta, x_i)



알파와 베타를 선택하면 각 입력 x_i에 대한 예측 된 결과를 얻을 수 있습니다. 실제 출력 y_i를 알기 때문에 각 쌍의 오류를 계산할 수 있습니다.
In [46]:

def sum_of_squared_errors(alpha, beta, x, y):
return sum(error(alpha, beta, x_i, y_i) ** 2
for x_i, y_i in zip(x, y))



우리가 정말로 알고 싶은 것은 전체 데이터 세트에 대한 총 오류입니다. 그러나 x_1에 대한 예측이 너무 높고 x_2에 대한 예측이 너무 낮으면 오류를 그냥 추가 할 수 있습니다. 대신에 제곱 된 오류를 더합니다.
이러한 최적의 표본회귀선을 구하는 방법중 가장 많이 사용되는 추정법이 최소자승법(OLS: ordinary least squares method)입니다.
오차항을 자승한 값들의 합이 최소기 되도록 하는 회귀선을 구하는 방법:
Min∑ i=1,n ei 2= Min∑ i=1,n (Yi - Y^i)2 = Min∑ i=1,n (Yi - α^ - β^Xi)2
최소자승 추정량의 도출
식 Min L = Min∑ i=1,n ei 2 = Min∑ i=1,n (Yi - α^ - β^Xi)2 에 나타난 오차의 최소자승값을 구하려면 이식을 α^ 와 β^에 대해 1 차미분한 값이 0 이 되어야한다:
X (표본평균)= (1/n) ∑ Xi, Y (표본평균)= (1/n)∑Yi,
xi (편차)= Xi – X, yi (편차) = Yi - Y
α^ = Y - β^ X
α^ 과 β^ 은 알려지지 않은 모집단의 상수 α 과 β 의 최소자승추정량 (least squares estimator: LSE)이며, 이들은 확률함수형태의 확률변수입니다..
In [47]:


from collections import Counter, defaultdict
from linear_algebra import vector_subtract
from stats import mean, correlation, standard_deviation, de_mean
from gradient_descent import minimize_stochastic
import math, random
def least_squares_fit(x, y):
beta = correlation(x, y) * standard_deviation(y) / standard_deviation(x)
alpha = mean(y) - beta * mean(x)
return alpha, beta



베타의 선택은 입력 값이 표준 편차 (x)만큼 증가 할 때 상관 관계 (x, y) * 표준 편차 (y)만큼 예측이 증가한다는 것을 의미합니다. x와 y가 완벽하게 상관되는 경우, x의 표준 편차가 1 증가하면 예측에서 표준 편차 -y가 1 증가합니다. 이들이 완벽하게 역 상관 관계에있을 때 x가 증가하면 예측이 감소합니다. 상관 관계가 0 일 때 베타는 0이며, 이는 x의 변화가 예측에 전혀 영향을 미치지 않음을 의미합니다
alpha, beta = least_squares_fit(num_friends_good, daily_minutes_good)
In [48]:


def total_sum_of_squares(y):
"""the total squared variation of y_i's from their mean"""
return sum(v ** 2 for v in de_mean(y))

def r_squared(alpha, beta, x, y):
"""the fraction of variation in y captured by the model, which equals
1 - the fraction of variation in y not captured by the model"""

return 1.0 - (sum_of_squared_errors(alpha, beta, x, y) /
total_sum_of_squares(y))



이제 우리는 제곱 된 예측 오차의 합을 최소화하는 알파와 베타를 선택했습니다. 우리가 선택할 수있는 하나의 선형 모델은 "제곱근 오차의 합이 제곱의 총합과 정확히 일치하는"항상 "평균 (y) 예측"(알파 = 평균 (y) 및 베타 = 0에 해당)입니다. 이것은 제로의 R 제곱을 의미합니다.이 모델은 (분명히,이 경우) 평균을 예측하는 것보다 나은 성능을 발휘하지 못하는 모델을 나타냅니다. 분명히, 최소 자승 모델은 적어도 그 이상이어야합니다. 즉, 제곱 오류의 합이 많아야 총 제곱합 인 것을 의미합니다. 즉, R 제곱이 적어도 0이어야 함을 의미합니다. 그리고 제곱 오류의 합은 최소 0이어야합니다. 즉 R 제곱이 최대 1 일 수 있습니다. 숫자가 높을수록 모델이 더 적합합니다. 여기서 우리는 0.329의 Rsquared를 계산합니다.이 모델은 우리 모델이 데이터를 맞추는 데만 일종의 괜찮은 것이며, 분명히 다른 요인들이 작용한다는 것을 알려줍니다.

6.3 Using Gradient Descent (기울기 하강)

θ값에 따른 비용함수의 값은 위와 같은 그래프를 그릴 것이다. 비용함수를 최소화하는 값을 찾는것이 가장 좋은 가설함수를 찾는것이고 이것이 Gradient Descent알고리즘의 목표이다.
우선 미분텀을 살펴보면 그래프의 특정점에 대한 기울기임을 알 수 있다. 현재 위치에서 미분값이 양수이면 현제 위치에서 증가하는 중이고 그 값을 a와 곱해서 빼면 θ값은 감소하게 되고 최소점에 가까워지게 된다. 반대로 미분텀의 값이 음수이면 현재위치에서 기울기가 음수이므로 감소하는 중이다 θ에서 음수를 빼면 업데이트된 θ는 증가하므로 최소점에 가까워진다.
그럼 α값에 따라 gradient decent는 어떻게 변할까 alpha값이 너무 작으면 θ의 값이 아주 조금씩 변할 것이다. α의 값이 너무 크다면 overshooting이 일어나 아마 최소점을 찾지 못 할 수도 있다.

In [49]:
def squared_error(x_i, y_i, theta):
alpha, beta = theta
return error(alpha, beta, x_i, y_i) ** 2

def squared_error_gradient(x_i, y_i, theta):
alpha, beta = theta
return [-2 * error(alpha, beta, x_i, y_i), # alpha partial derivative
-2 * error(alpha, beta, x_i, y_i) * x_i] # beta partial derivative

num_friends_good = [49,41,40,25,21,21,19,19,18,18,16,15,15,15,15,14,14,13,13,13,13,12,12,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
daily_minutes_good = [68.77,51.25,52.08,38.36,44.54,57.13,51.4,41.42,31.22,34.76,54.01,38.79,47.59,49.1,27.66,41.03,36.73,48.65,28.12,46.62,35.57,
32.98,35,26.07,23.77,39.73,40.57,31.65,31.21,36.32,20.45,21.93,26.02,27.34,23.49,46.94,30.5,33.8,24.23,21.4,27.94,32.24,40.57,25.07,19.42,22.39,18.42,
46.96,23.72,26.41,26.97,36.76,40.32,35.02,29.47,30.2,31,38.11,38.18,36.31,21.03,30.86,36.07,28.66,29.08,37.28,15.28,24.17,22.31,30.17,25.53,19.85,35.37,
44.6,17.23,13.47,26.33,35.02,32.09,24.81,19.33,28.77,24.26,31.98,25.73,24.86,16.28,34.51,15.23,39.72,40.8,26.06,35.76,34.76,16.13,44.04,18.03,19.65,32.62,
35.59,39.43,14.18,35.24,40.13,41.82,35.45,36.07,43.67,24.61,20.9,21.9,18.79,27.61,27.21,26.61,29.77,20.59,27.53,13.82,33.2,25,33.1,36.65,18.63,14.87,22.2,
36.81,25.53,24.62,26.25,18.21,28.08,19.42,29.79,32.8,35.99,28.32,27.79,35.88,29.06,36.28,14.1,36.63,37.49,26.9,18.58,38.48,24.48,18.95,33.55,14.24,29.04,
32.51,25.63,22.22,19,32.73,15.16,13.9,27.2,32.01,29.27,33,13.74,20.42,27.32,18.23,35.35,28.48,9.08,24.62,20.12,35.26,19.92,31.02,16.49,12.16,30.7,31.22,34.65,
13.13,27.51,33.2,31.57,14.1,33.42,17.44,10.12,24.42,9.82,23.39,30.93,15.03,21.67,31.09,33.29,22.61,26.89,23.48,8.38,27.81,32.35,23.84]

alpha, beta = least_squares_fit(num_friends_good, daily_minutes_good)
print("alpha", alpha)
print("beta", beta)

print("r-squared", r_squared(alpha, beta, num_friends_good, daily_minutes_good))
print()

print("gradient descent:")
# choose random value to start
random.seed(0)
theta = [random.random(), random.random()]
alpha, beta = minimize_stochastic(squared_error,
squared_error_gradient,
num_friends_good,
daily_minutes_good,
theta, 0.0001)
print("alpha", alpha)
print("beta", beta)
1346903
beta 0.903865945605865
r-squared 0.3291078377836305

gradient descent:
alpha 22.93746417548679
beta 0.9043371597664965

6.4 Maximum Likelihood Estimation(최대가능도방법)

최대가능도방법(maximum likelihood method) 또는 최대우도법은 어떤 확률변수에서 표집한 값들을 토대로 그 확률변수의 모수를 구하는 방법이다. 어떤 모수가 주어졌을 때, 원하는 값들이 나올 가능도를 최대로 만드는 모수를 선택하는 방법이다. 점추정 방식에 속한다.
간단한 회귀 모델에 대해 자주 제기되는 한 가지 가정은 회귀 오류가 평균 0과 일부 (알려진) 표준 편차 σ로 정규 분포된다는 것입니다. 이 경우 쌍 (xi,yi)(xi,yi)을 보는 것에 기반한 가능성은 다음과 같다.
L(α,β|xi,yi,σ)=12πσ⎯⎯⎯⎯⎯⎯√exp(−(yi−α−βxi)2/2σ2)L(α,β|xi,yi,σ)=12πσexp(−(yi−α−βxi)2/2σ2)
전체 데이터 세트를 기반으로하는 우도는 개별 우도의 산물이며, 알파와 베타를 선택하여 오차 제곱의 합을 최소화 할 때 가장 큰 것입니다. 즉,이 경우 (및 이러한 가정을 통해) 제곱 오류 합계를 최소화하는 것은 관찰 된 데이터의 가능성을 최대화하는 것과 같습니다.
확률변수 X1,X2,X3,···,XnX1,X2,X3,···,Xn의 관측값 x1,x2,···,xnx1,x2,···,xn에 대하여 우도함수 L(θ)=∏i=1nf(xi;θ)L(θ)=∏i=1nf(xi;θ)를 최대가 되게 하는 모수 θ를 추정하는 방법이다. 최대우도추정치에서 우도함수를 모수에 대하여 미분한 함숫값은 0이다.

θ값에 따른 비용함수의 값은 위와 같은 그래프를 그릴 것이다. 비용함수를 최소화하는 값을 찾는것이 가장 좋은 가설함수를 찾는것이고 이것이 Gradient Descent알고리즘의 목표이다.
우선 미분텀을 살펴보면 그래프의 특정점에 대한 기울기임을 알 수 있다. 현재 위치에서 미분값이 양수이면 현제 위치에서 증가하는 중이고 그 값을 a와 곱해서 빼면 θ값은 감소하게 되고 최소점에 가까워지게 된다. 반대로 미분텀의 값이 음수이면 현재위치에서 기울기가 음수이므로 감소하는 중이다 θ에서 음수를 빼면 업데이트된 θ는 증가하므로 최소점에 가까워진다.
그럼 α값에 따라 gradient decent는 어떻게 변할까 alpha값이 너무 작으면 θ의 값이 아주 조금씩 변할 것이다. α의 값이 너무 크다면 overshooting이 일어나 아마 최소점을 찾지 못 할 수도 있다.
In [49]:

def squared_error(x_i, y_i, theta):
alpha, beta = theta
return error(alpha, beta, x_i, y_i) ** 2

def squared_error_gradient(x_i, y_i, theta):
alpha, beta = theta
return [-2 * error(alpha, beta, x_i, y_i), # alpha partial derivative
-2 * error(alpha, beta, x_i, y_i) * x_i] # beta partial derivative

num_friends_good = [49,41,40,25,21,21,19,19,18,18,16,15,15,15,15,14,14,13,13,13,13,12,12,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
daily_minutes_good = [68.77,51.25,52.08,38.36,44.54,57.13,51.4,41.42,31.22,34.76,54.01,38.79,47.59,49.1,27.66,41.03,36.73,48.65,28.12,46.62,35.57,
32.98,35,26.07,23.77,39.73,40.57,31.65,31.21,36.32,20.45,21.93,26.02,27.34,23.49,46.94,30.5,33.8,24.23,21.4,27.94,32.24,40.57,25.07,19.42,22.39,18.42,
46.96,23.72,26.41,26.97,36.76,40.32,35.02,29.47,30.2,31,38.11,38.18,36.31,21.03,30.86,36.07,28.66,29.08,37.28,15.28,24.17,22.31,30.17,25.53,19.85,35.37,
44.6,17.23,13.47,26.33,35.02,32.09,24.81,19.33,28.77,24.26,31.98,25.73,24.86,16.28,34.51,15.23,39.72,40.8,26.06,35.76,34.76,16.13,44.04,18.03,19.65,32.62,
35.59,39.43,14.18,35.24,40.13,41.82,35.45,36.07,43.67,24.61,20.9,21.9,18.79,27.61,27.21,26.61,29.77,20.59,27.53,13.82,33.2,25,33.1,36.65,18.63,14.87,22.2,
36.81,25.53,24.62,26.25,18.21,28.08,19.42,29.79,32.8,35.99,28.32,27.79,35.88,29.06,36.28,14.1,36.63,37.49,26.9,18.58,38.48,24.48,18.95,33.55,14.24,29.04,
32.51,25.63,22.22,19,32.73,15.16,13.9,27.2,32.01,29.27,33,13.74,20.42,27.32,18.23,35.35,28.48,9.08,24.62,20.12,35.26,19.92,31.02,16.49,12.16,30.7,31.22,34.65,
13.13,27.51,33.2,31.57,14.1,33.42,17.44,10.12,24.42,9.82,23.39,30.93,15.03,21.67,31.09,33.29,22.61,26.89,23.48,8.38,27.81,32.35,23.84]

alpha, beta = least_squares_fit(num_friends_good, daily_minutes_good)
print("alpha", alpha)
print("beta", beta)

print("r-squared", r_squared(alpha, beta, num_friends_good, daily_minutes_good))
print()

print("gradient descent:")
# choose random value to start
random.seed(0)
theta = [random.random(), random.random()]
alpha, beta = minimize_stochastic(squared_error,
squared_error_gradient,
num_friends_good,
daily_minutes_good,
theta, 0.0001)
print("alpha", alpha)
print("beta", beta)
1346903
beta 0.903865945605865
r-squared 0.3291078377836305

gradient descent:
alpha 22.93746417548679
beta 0.9043371597664965

6.4 Maximum Likelihood Estimation(최대가능도방법)

최대가능도방법(maximum likelihood method) 또는 최대우도법은 어떤 확률변수에서 표집한 값들을 토대로 그 확률변수의 모수를 구하는 방법이다. 어떤 모수가 주어졌을 때, 원하는 값들이 나올 가능도를 최대로 만드는 모수를 선택하는 방법이다. 점추정 방식에 속한다.
간단한 회귀 모델에 대해 자주 제기되는 한 가지 가정은 회귀 오류가 평균 0과 일부 (알려진) 표준 편차 σ로 정규 분포된다는 것입니다. 이 경우 쌍 (xi,yi)(xi,yi)을 보는 것에 기반한 가능성은 다음과 같다.
L(α,β|xi,yi,σ)=12πσ⎯⎯⎯⎯⎯⎯√exp(−(yi−α−βxi)2/2σ2)L(α,β|xi,yi,σ)=12πσexp(−(yi−α−βxi)2/2σ2)
전체 데이터 세트를 기반으로하는 우도는 개별 우도의 산물이며, 알파와 베타를 선택하여 오차 제곱의 합을 최소화 할 때 가장 큰 것입니다. 즉,이 경우 (및 이러한 가정을 통해) 제곱 오류 합계를 최소화하는 것은 관찰 된 데이터의 가능성을 최대화하는 것과 같습니다.
확률변수 X1,X2,X3,···,XnX1,X2,X3,···,Xn의 관측값 x1,x2,···,xnx1,x2,···,xn에 대하여 우도함수 L(θ)=∏i=1nf(xi;θ)L(θ)=∏i=1nf(xi;θ)를 최대가 되게 하는 모수 θ를 추정하는 방법이다. 최대우도추정치에서 우도함수를 모수에 대하여 미분한 함숫값은 0이다.