題目太長啦!文檔下載【傳送門】
第1題
簡述:設計一個5*5的單位矩陣。
1 import numpy as np 2 A = np.eye(5) 3 print(A)
運行結果:
第2題
簡述:實現單變量線性回歸。
1 import numpy as np 2 import matplotlib.pyplot as plt 3 from mpl_toolkits.mplot3d import Axes3D 4 5 #-----------------計算代價值函數----------------------- 6 def computeCost(X, y, theta): 7 m = np.size(X[:,0]) 8 J = 1/(2*m)*np.sum((np.dot(X,theta)-y)**2) 9 return J 10 11 12 #----------------根據人口預測利潤---------------------- 13 #讀取數據集中數據,第一列是人口數據,第二列是利潤數據 14 data = np.loadtxt('ex1data1.txt',delimiter=",",dtype="float") 15 m = np.size(data[:,0]) 16 # print(data) 17 18 #------------------繪制樣本點-------------------------- 19 X = data[:,0:1] 20 y = data[:,1:2] 21 plt.plot(X,y,"rx") 22 plt.xlabel('Population of City in 10,000s') 23 plt.ylabel('Profit in $10,000s') 24 # plt.show() 25 26 #-----------------梯度下降計算局部最優解---------------- 27 #添加第一列1 28 one = np.ones(m) 29 X = np.insert(X,0,values=one,axis=1) 30 # print(X) 31 32 #設置α、迭代次數、θ 33 theta = np.zeros((2,1)) 34 iterations = 1500 35 alpha = 0.01 36 37 #梯度下降,並顯示線性回歸 38 J_history = np.zeros((iterations,1)) 39 for iter in range(0,iterations): 40 theta = theta - alpha/m*np.dot(X.T,(np.dot(X,theta)-y)) 41 J_history[iter] = computeCost(X,y,theta) 42 plt.plot(data[:,0],np.dot(X,theta),'-') 43 plt.show() 44 # print(theta) 45 # print(J_history) 46 47 #--------------------顯示三維圖------------------------ 48 theta0 = np.linspace(-10,10,100) 49 theta1 = np.linspace(-1,4,100) 50 J_vals = np.zeros((np.size(theta0),np.size(theta1))) 51 for i in range(0,np.size(theta0)): 52 for j in range(0,np.size(theta1)): 53 t = np.asarray([theta0[i],theta1[j]]).reshape(2,1) 54 J_vals[i,j] = computeCost(X,y,t) 55 # print(J_vals) 56 J_vals = J_vals.T #需要轉置一下,否則軸會反 57 fig1 = plt.figure() 58 ax = Axes3D(fig1) 59 ax.plot_surface(theta0,theta1,J_vals,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow')) 60 ax.set_xlabel('theta0') 61 ax.set_ylabel('theta1') 62 ax.set_zlabel('J') 63 plt.show() 64 65 #--------------------顯示輪廓圖----------------------- 66 lines = np.logspace(-2,3,20) 67 plt.contour(theta0,theta1,J_vals,levels = lines) 68 plt.xlabel('theta0') 69 plt.ylabel('theta1') 70 plt.plot(theta[0],theta[1],'rx') 71 plt.show()
運行結果:
第3題
簡述:實現多元線性回歸。
1 import numpy as np 2 import matplotlib.pyplot as plt 3 4 #-----------------計算代價值函數----------------------- 5 def computeCost(X, y, theta): 6 m = np.size(X[:,0]) 7 J = 1/(2*m)*np.sum((np.dot(X,theta)-y)**2) 8 return J 9 10 #-------------------根據面積和卧室數量預測房價---------- 11 #讀取數據集中數據,第一列是面積數據,第二列是卧室數量,第三列是房價 12 data = np.loadtxt('ex1data2.txt',delimiter=",",dtype="float") 13 m = np.size(data[:,0]) 14 # print(data) 15 X = data[:,0:2] 16 y = data[:,2:3] 17 18 #----------------------均值歸一化--------------------- 19 mu = np.mean(X,0) 20 sigma = np.std(X,0) 21 X_norm = np.divide(np.subtract(X,mu),sigma) 22 one = np.ones(m) #添加第一列1 23 X_norm = np.insert(X_norm,0,values=one,axis=1) 24 # print(mu) 25 # print(sigma) 26 # print(X_norm) 27 28 #----------------------梯度下降----------------------- 29 alpha = 0.05 30 num_iters = 100 31 theta = np.zeros((3,1)); 32 J_history = np.zeros((num_iters,1)) 33 for iter in range(0,num_iters): 34 theta = theta - alpha/m*np.dot(X_norm.T,(np.dot(X_norm,theta)-y)) 35 J_history[iter] = computeCost(X_norm,y,theta) 36 # print(theta) 37 x_col = np.arange(0,num_iters) 38 plt.plot(x_col,J_history,'-b') 39 plt.xlabel('Number of iterations') 40 plt.ylabel('Cost J') 41 plt.show() 42 43 #----------使用上述結果對[1650,3]的數據進行預測-------- 44 test1 = [1,1650,3] 45 test1[1:3] = np.divide(np.subtract(test1[1:3],mu),sigma) 46 price = np.dot(test1,theta) 47 print(price) #輸出預測結果[292455.63375132] 48 49 #-------------使用正規方程法求解---------------------- 50 one = np.ones(m) 51 X = np.insert(X,0,values=one,axis=1) 52 theta = np.dot(np.dot(np.linalg.pinv(np.dot(X.T,X)),X.T),y) 53 # print(theta) 54 price = np.dot([1,1650,3],theta) 55 print(price) #輸出預測結果[293081.46433497]
運行結果:【一個疑惑>>兩種方法求解的估算價格很小,但θ相差較大?】