1. 程式人生 > 其它 >吳恩達機器學習ex1

吳恩達機器學習ex1

小小小白剛剛開始學機器學習
參考部落格吳恩達機器學習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個數

擬合後的影象為

3.多變數線性迴歸

作者:inss!w! 出處:https://www.cnblogs.com/Hfolsvh/ 版權宣告:本部落格所有文章除特別宣告外,均採用 BY-NC-SA 許可協議。轉載請註明出處!