吳恩達機器學習ex1
阿新 • • 發佈:2021-07-17
小小小小白剛剛開始學機器學習
參考部落格吳恩達機器學習ex1 python實現
需要用到的庫
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
- 機器學習演算法中大部分計算都是用numpy庫實現的
numpy庫的基礎操作參考部落格https://blog.csdn.net/codedz/article/details/82869370
numpy使用者手冊NumPy user guide - pandas庫是一個強大的用於分析結構化資料的工具集,基礎是numpy
在這裡用於處理CSV檔案 - matplot是python的繪相簿,搭配numpy一起使用
1.簡單練習
輸出5*5的單位矩陣
A = np.eye(5)
print(A)
np.eye()函式:返回一個對角線上全是1,其他全為0的二維陣列。
輸出
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
2.單變數的線性迴歸
根據城市人口數量,預測開小吃店的利潤
第一列是城市人口數量,第二列是在該城市開小吃店的利潤
2.1 Plotting the Data
# 用絕對路徑有問題,不知道為什麼,求解答 # data = pd.read_csv('D:\\ML\\Machine Learning\\ex1data1.csv', header=None, names=['Population', 'Profit']) data = pd.read_csv('ex1data1.csv', header=None, names=['Population', 'Profit']) print(data.head()) # 列印前五行 data.plot.scatter('Population', 'Profit') # 繪製散點圖 plt.show()
2.2 Gradient Descent
在已有的資料集上,訓練線性迴歸的引數θ
2.2.1 代價函式公式
def costFunc(X, y, theta):
inner = np.power((X @ theta) - y, 2)
return np.sum(inner) / (2*len(X))
python3.5以後@為一個操作符,意為矩陣-向量乘法
2.2.2 準備引數X,y,θ
# 在X矩陣中加一列全為1,方便計算 data.insert(0, 'Ones', 1) # 初始化X和y cols = data.shape[1] X = data.iloc[:, 0:-1] # 獲取前三列 y = data.iloc[:, cols-1:cols] # 獲取最後一列 X = np.array(X.values) # 轉化為陣列型別 y = np.array(y.values) print(X.shape) # X和y的維度 y.reshape(len(y), 1) print(y.shape) theta = np.zeros((2, 1)) # 初始化θ print(theta.shape) firstCost = costFunc(X, y, theta) print(firstCost)
iloc:即index locate。iloc[行,列] iloc[:,0:-1]是獲取前三列的意思(注:左閉右開)
iloc[:,-1]是獲取最後一列
np.zeros()返回一個給定形狀和型別的用0填充的陣列
2.2.3 計算代價函式
firstCost = costFunc(X, y, theta)
print(firstCost)
由於θ初始為0,計算結果為32.07
2.2.4 梯度下降
def gradientDescent(X, y, theta, alpha, iters):
"""
計算梯度下降的引數
:param X:
:param y:
:param theta:
:param alpha: 學習率
:param iters: 迭代次數
:return: theta,costs
"""
costs = []
for i in range(iters):
theta = theta - (alpha / len(X) * X.T @ (X @ theta - y)) # 梯度下降的公式
cost = costFunc(X, y, theta)
costs.append(cost)
if i % 100 == 0:
print(cost)
return theta, costs
alpha = 0.02
iters = 1000
2.3 畫出擬合後的直線
x = np.linspace(data.Population.min(), data.Population.max(), 100) # 從最小值到最大值的100個均勻的點
f = theta[0, 0] + x
fig, ax = plt.subplots() # 用來建立畫布
ax.scatter(X[:, 1], y, label='training data')
ax.plot(x, f, 'r', label='predict')
ax.legend() # 設定影象位置
ax.set(xlabel='population', ylabel='profit') # 設定橫縱座標
plt.show() # 顯示影象
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
返回[start,stop]範圍內間隔均勻的num個數
擬合後的影象為