房價預測問題
你有一個10000平方英尺的房子,現在要進行轉買,能賣多少錢呢?
單變量線性迴歸,顧名思義是一個變量對結果產生的影響,例如上題房屋面積對房屋價格的影響
迴歸是統計學的一個重要概念,其本意是根據之前的數據預測一個準確的輸出值,解題思路如下:
1、定義一個模型 hθ(x)=θ0+θ1x,並初始化θ0 θ1的值就會產生一個如下的圖像
然後就會發現這條直線並不能很好的彌合這些數據,所以需要更新參數,但是更新參數前需要求一下這條直線的代價
2.求代價函數
3.進行梯度下降更新參數並取得θ的最小值
梯度下降後會發現這條線比之前的要好一點,接着我們重複這個步驟,最後我們會獲得這樣的一個圖像
接下來我們就以一個例子來看一下這個流程
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 讀取數據
data = np.loadtxt(r'C:\Users\shy\PycharmProjects\untitled\week3\ex1data1.txt',delimiter=',')
# print(data.shape)
# 數據提取
X = data[:,:-1]
y = data[:,-1]
# 數據初始化
X = np.c_[np.ones(len(X)),X]
y = np.c_[y]
# 定義模型
def model(X,theta):
h = np.dot(X,theta)
return h
# 定義代價函數
def costFunc(h,y):
m = y.shape[0]
J = 1.0/(2*m)*np.sum(np.square(h-y))
# J = 1.0/(2*m)*np.dot((h-y).T,(h-y))
return J
# 定義梯度下降函數
def gradDesc(X,y,alpha=0.01,iter_num=15000):
m,n = X.shape
theta = np.zeros((n,1)) # 初始化theta值
J_history = np.zeros(iter_num) # 初始化代價函數值
# 執行梯度下降
for i in range(iter_num):
h = model(X,theta)
J_history[i] = costFunc(h,y)
deltatheta = (1.0/m)*np.dot(X.T,h-y)
theta -= alpha*deltatheta
return J_history,theta
# 調用梯度下降算法
J_history,theta = gradDesc(X,y)
# 畫圖
# 畫代價曲線
plt.title('代價曲線')
plt.plot(J_history)
plt.xlabel('迭代次數')
plt.ylabel('代價值')
plt.show()
# 畫樣本散點圖和線性迴歸方程
plt.title('樣本分佈圖')
# 散點圖
plt.scatter(X[:,1],y[:,0],c='pink')
# 畫迴歸方程
min_x,max_x = np.min(X[:,1]),np.max(X[:,1])
min_x_y,max_x_y = theta[0]+theta[1]*min_x,theta[0]+theta[1]*max_x
plt.plot([min_x,max_x],[min_x_y,max_x_y])
plt.show()
效果展示
總結
通過這個訓練模型,你就能清晰的看出房屋面積對價格的影響,也可以知道10000平方英尺的房子能賣多少了