Python實現線性回歸
Python實現線性回歸
完整代碼與數據見:https://github.com/xiaohuzai/ML-Excercise.git
導入數據
import numpy as npdata = np.loadtxt(linear_regression_data1.txt,delimiter=,)X = np.c_[np.ones(data.shape[0]),data[:,0]]y = np.c_[data[:,1]]
data:
6.1101 17.592
5.5277 9.13028.5186 13.662
7.0032 11.8545.8598 6.82338.3829 11.8867.4764 4.34838.5781 126.4862 6.59875.0546 3.8166......X:
1 6.1101
1 5.5277
1 8.51861 7.00321 5.85981 8.38291 7.47641 8.57811 6.48621 5.0546......y:
17.592
9.130213.66211.8546.823311.8864.3483126.59873.8166......顯示數據
import matplotlib.pyplot as pltplt.scatter(X[:,1], y, s=30, c=r, marker=x, linewidths=1)plt.xlim(4,24)plt.xlabel(Population of City in 10,000s)plt.ylabel(Profit in $10,000s)
計算損失函數
# theta默認值為[0,0]Tdef computerCost(X,y,theta=[[0],[0]]): m = y.size J = 0 # X點乘theta h = X.dot(theta) J = 1.0/(2*m)*(np.sum(np.sqaure(h-y)))# theta默認值為[0,0]T時損失函數的值computerCost(X,y)Out[15]: 32.072733877455676
梯度下降函數
# 默認迭代次數為1500次,學習率alfa取0.01def gradientDescent(X, y, theta=[[0],[0]], alpha=0.01, num_iters=1500): m = y.size # J_history用來保存每一次迭代後損失函數J的值 J_history = np.zeros(num_iters) # 迭代的過程 for iter in np.arange(num_iters): h = X.dot(theta) theta = theta - alpha*(1.0/m)*(X.T.dot(h-y)) J_history[iter] = computeCost(X, y, theta) return(theta, J_history)# 計算迭代1500次以後theta的值theta , Cost_J = gradientDescent(X, y)thetaOut[27]: array([[-3.63029144], [ 1.16636235]])# 即theta0 = -3.63029144,theta1 = 1.16636235# 畫出每一次迭代和損失函數變化plt.plot(Cost_J)plt.ylabel(Cost J)plt.xlabel(Iterations)
可見在迭代了1500次以後,損失函數J的值趨近收斂。
畫圖
# 畫出我們自己寫的線性回歸圖xx = np.arange(5,23)yy = theta[0]+theta[1]*xxplt.scatter(X[:,1], y, s=30, c=r, marker=x, linewidths=1)plt.plot(xx,yy, label=Linear regression (Gradient descent))
# 和Scikit-learn中的線性回歸對比一下 from sklearn.linear_model import LinearRegression# 我們自己梯度下降計算得到的線性回歸xx = np.arange(5,23)yy = theta[0]+theta[1]*xxplt.scatter(X[:,1], y, s=30, c=r, marker=x, linewidths=1)plt.plot(xx,yy, label=Linear regression (Gradient descent))# 使用Scikit計算得到的線性回歸regr = LinearRegression()regr.fit(X[:,1].reshape(-1,1), y.ravel())plt.plot(xx, regr.intercept_+regr.coef_*xx, label=Linear regression (Scikit-learn GLM))plt.xlim(4,24)plt.xlabel(Population of City in 10,000s)plt.ylabel(Profit in $10,000s)plt.legend(loc=4)
可以看出兩者基本重合。
預測
使用我們計算得到的線性回歸模型,預測一下人口為35000和70000的城市的結果。
print(theta.T.dot([1, 3.5])*10000)[ 4519.7678677]print(theta.T.dot([1, 7])*10000)[ 45342.45012945]
推薦閱讀:
※知識布局-tensorflow-梯度下降
※谷歌今日上線基於TensorFlow的機器學習速成課程(免費中文版)
※無需編程,即刻擁有你的機器學習模型
※想成為機器學習工程師?這份自學指南你值得收藏(自用)
※入門教程 | 使用 Colab,玩轉谷歌深度學習全家桶!
TAG:機器學習 |