機器學習,就是讓機器通過在大量資料中進行學習,獲得乙個**相同資料的能力,主要作用是用來對新資料的**。
線性回歸是機器學習中最經典的演算法之一,通過優化每個特徵的權重值,獲得最好的訓練模型,用來**後續資料的結果。
線性回歸屬於機器學習中的有監督學習,意思就是說每個已知的真實樣本,都擁有確定的結果,**的結果是連續性的一組值。
在讓機器學習之前,對要餵給機器的資料進行處理,是很重要的一環。資料的好壞,很大程度上決定了模型能夠訓練到什麼程度。
對資料的處理,一般包括將資料讀取到編輯器中;提取有效資料;對資料特徵進行縮放;對資料進行初始化。參考**如下:
# 首先要匯入一系列庫,包括用於矩陣計算的科學計算包-numpy
# 以及在後續資料展示時要用到的畫圖工具matplotlib
import numpy as np
from matplotlib import pyplot as plt
# 讀取資料
data_train = np.loadtxt(r'ccpp_train.txt',delimiter=',') # 利用科學計算工具進行資料讀取,讀取txt資料
data_test = np.loadtxt(r'ccpp_test.txt',delimiter=',')
# 定義資料預處理函式
def preprocess(data):
# 資料提取
x = data[:,:-1]
y = data[:,-1]
# 特徵縮放
x -= np.mean(x,axis=0)
x /= np.std(x,axis=0,ddof=1) # 這裡使用的特徵縮放中的經典縮放方法-標準化 就是資料減去資料的平均值再除以資料的標準差
# 資料初始化
x = np.c_[np.ones(len(x)),x] # 對資料拼接一列1,有利於後續資料計算的進行
y = np.c_[y] # 行轉列
return x,y
# 呼叫資料處理函式 獲得處理好的資料
x_train,y_train = preprocess(data_train)
x_test,y_test = preprocess(data_test)
線性回歸演算法的模型是固定的,其實就是一條直線y=kx+b,用**矩陣表達就是h=dot(x,theta)
**如下:
# 定義模型函式
def model(x,theta):
h = np.dot(x,theta)
return h
代價函式用來評價乙個模型的效能,這裡採用的是誤差均方和,值是**值和真實值之間差距的平方
,採用平方是為了消除減法得到的正負值相互抵消,帶價值越大,表示**值和真實值之間差距越大,代表了模型就越差,我們需要尋找的就是帶價值最小的那個模型,可以**的最好。
**如下:
# 定義代價函式
def costfunction(h,y):
m = len(h)
j = (1.0/(2*m))*np.sum(np.square(h-y)) # 均方誤差和的**表達
return j
梯度下降方法,是更新theta引數的最重要的一步,因為我們所使用的模型是h=x*theta,x是常量,模型的變化通過theta的變化決定。
梯度下降就是讓當前模型的代價函式值變小,帶價值越小,模型越好。使帶價值變小的最快的方向就是其導數的方向,就是當前一點的斜率的方向,沿著斜率的方向下降,速度最快。
所以我們決定對代價函式進行求導,獲得乙個下降的值。
deltatheta = (1/m)*np.dot(x.t,h-y)
然後對theta進行更新,
theta -= deltheta
再次將更新後的theta和資料傳入模型中,獲得**值,把**值傳入代價函式,進行效能評價,直到找到最好的那一組theta,就找到了最好的模型
**如下:
# 定義梯度下降函式
def gradedesc(x,y,alpha=0.01,iter_num=2000):
# 獲取資料維度
m,n = x.shape
# 初始化代價值
j_history = np.zeros(iter_num)
# 初始化theta
theta = np.zeros((n,1))
# 執行梯度下降
for i in range(iter_num):
h = model(x,theta)
j_history[i] = costfunction(h,y)
# 4.要求輸出迭代過程中的代價函式值(10分)
print(j_history[i])
# 求取deltatheta
deltatheta = (1.0/m)*np.dot(x.t,h-y)
# 更新theta
theta -= alpha * deltatheta
return j_history,theta
經過多次迭代,獲得了最好的模型,最好的模型的評價標準是:達到期望的代價值或者達到一定的迭代次數,或者達到期望的精度。
精度表達的是,一組**值和實際值的相似程度。
**如下:
# 呼叫梯度下降函式獲取訓練好的theta
j_history,theta = gradedesc(x_train,y_train,alpha=0.01,iter_num=2000)
# 呼叫模型,獲取**的y值
y_test_h = model(x_test,theta)
# 5.完成測試集的資料**,並計算在測試集上的代價函式值(15分)
j_test = costfunction(y_test_h,y_test)
print('測試集上的代價函式值')
print(j_test)
# 求取精度
def score(h,y):
u = np.sum(np.square(h-y))
v = np.sum(np.square(y-np.mean(y)))
return 1 - u/v
# 呼叫精度函式求取精度
s = score(y_test_h,y_test)
print('精度是:')
print(s)
這裡主要的是畫圖展示的工作,比如說可以畫出代價函式的變化曲線,也可以畫出真實值和**值的對比圖。通過影象的方式,更直觀的看出模型的擬合程度如何。
**如下:
# 畫代價函式曲線
plt.title('代價函式曲線')
plt.plot(j_history)
plt.show()
# 6.以橫軸為真實值,縱軸為**值,畫出散點圖(25分)
plt.title('真實值與**值對比圖')
plt.scatter(y_test,y_test,label='真實值')
plt.scatter(y_test,y_test_h,label='**值')
plt.show()
通過上述六個步驟,可以完成線性回歸演算法的機器學習,當框架寫好以後,可以通過代價函式的曲線圖看出模型是否收斂,並且可以通過調整學習率alpha和迭代次數iter_num來使模型更好的收斂。
機器學習 多變數線性回歸
注 本系列部落格是博主學習stanford大學 andrew ng 教授的 機器學習 課程筆記。博主深感學過課程後,不進行總結非常easy遺忘,依據課程加上自己對不明確問題的補充遂有此系列部落格。本系列部落格包含線性回歸 邏輯回歸 神經網路 機器學習的應用和系統設計 支援向量機 聚類 將維 異常檢測...
機器學習 多變數線性回歸
1 說明 需要 房屋的 除了房屋面積還有其他的特徵量,比如層數,年齡,臥室數目等等,如下圖。因為有多個特徵值,所以稱為多變數線性回歸。2 假設函式 單變數只有乙個特徵值,所以之前的假設函式將不再適用,下面是多變數的假設函式。其中x0設定為1 3 特徵縮放 在所有特徵值中,size的範圍大概在0 20...
機器學習(三) 多變數線性回歸
目錄 一 前言 二 模型描述 1.hypothesis 2.cost function 三 多元梯度下降法 1.特徵放縮 2.學習率 的選擇 四 特徵與多項式回歸 五 正規方程 區別於梯度下降法 六 梯度下降法與正規方程法的比較 在所有公式中,n為特徵個數,m為樣本數量 與前面單變數線性回歸類似,只...