機器學習-線性迴歸
首先,我們先隨機產生資料點。
In [48]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
In [39]:
#y=ax+b
rng=np.random.RandomState(1)
#numpy.random.rand(d0, d1, …, dn)的數值會產生在(0,1)之間
#numpy.random.randn(d0, d1, …, dn)是從常態分配中返回一個或多個值
x=10*rng.rand(100)
y=2*x-5+rng.randn(100)
plt.scatter(x,y,s=10)
plt.xlabel('x-axis',fontsize=10)
plt.ylabel('y-axis',fontsize=10,rotation=90)
plt.savefig('data_point')
估計迴歸模型:先使用普通最小平方法(Ordinary Least Square,OLS)公式來求出β值。
In [41]:
def linear_regression(x,y):
x=np.concatenate((np.ones((x.shape[0],1)),x[:,np.newaxis]),axis=1)
y=y[:,np.newaxis]
beta=np.matmul(np.matmul(np.linalg.inv(np.matmul(x.T,x)),x.T),y)
return beta
In [12]:
#將(x,y)輸入OLS公式
by_hand = linear_regression(x,y)
#print出截距項
print(by_hand[0])
#print出斜率項
print(by_hand[1])
[-4.76304275] [1.96849251]
畫出linear regression。
In [42]:
#建立新樣本點
xs=np.linspace(0,10,50)
ys=by_hand[0]+by_hand[1]*xs
#原本的data point
plt.scatter(x,y,s=10,alpha=1)
plt.plot(xs,ys,'r',linewidth=2)
plt.xlabel('x-axis',fontsize=10)
plt.ylabel('y-axis',rotation=90,fontsize=10)
Out[42]:
Text(0, 0.5, 'y-axis')
也可採用內建迴歸指令linear_model.LinearRegression()。
In [61]:
#reshape x 為列數為1的形式
x=x.reshape(-1, 1)
reg=LinearRegression()
reg.fit(x, y)
Out[61]:
LinearRegression()
In [62]:
#將截距項和斜率命名
beta_0=reg.intercept_
beta_1=reg.coef_
In [63]:
print("Intercept: ",beta_0)
print("Cofficient: ",beta_1)
Intercept: -4.763042745851093 Cofficient: [1.96849251]
In [64]:
#plt.scatter(x, y, color='blue')
plt.scatter(x,y,s=10,alpha=1)
#plt.scatter(x, regr.predict(x), color='red')
plt.plot(x, reg.predict(x),'r',linewidth=2)
plt.show()
Gradient Descent (梯度下降法):先隨機訂一個參數,並套入函式中,求出yhat值,並與實際y值的差異,透過參數(β)+learning rate(學習率)gradients(差異x值)不斷調整出新的參數,最後就會到達最低點,也就是極小化損失函數loss function,yhat與實際y值的誤差最小。
In [ ]:
#設定學習率
learning_rate=0.0001
#經過3000次的調整參數
n_iterations=3000
#隨機定義參數值
theta = np.random.randn(2,1)
#如同最小平方法,必須加入截距項
x=np.concatenate((np.ones((x.shape[0],1)),x[:,np.newaxis]),axis=1)
y=y[:,np.newaxis]
#來畫點不一樣風格的圖吧
plt.style.use('fivethirtyeight')
#開始執行梯度下降
for iteration in range(n_iterations):
#求出預測的yhat值
scores = np.dot(x,theta)
#誤差值
output_error = y-scores
#x的shape(50,2) output_error的shapej為(50,1) gradients為(2,1)
gradients = 2*np.dot(x.T,output_error)
#每次對theta
theta += learning_rate*gradients
plt.plot(theta[0],theta[1],'o-',color='red')
plt.xlabel('intercept',color='black')
plt.ylabel('weight',color='black')
plt.xticks(color='black')
plt.yticks(color='black')
plt.show()