機器學習——單變量線性迴歸

房價預測問題

你有一個10000平方英尺的房子,現在要進行轉買,能賣多少錢呢?
單變量線性迴歸,顧名思義是一個變量對結果產生的影響,例如上題房屋面積對房屋價格的影響
迴歸是統計學的一個重要概念,其本意是根據之前的數據預測一個準確的輸出值,解題思路如下:

1、定義一個模型 hθ(x)=θ01x,並初始化θ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平方英尺的房子能賣多少了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章