日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

李宏毅机器学习——课后作业1

發布時間:2023/12/14 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 李宏毅机器学习——课后作业1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

李宏毅機器學習視頻地址:
【李宏毅 深度學習19(完整版)國語】
第一次作業參考地址:
線性回歸預測PM2.5----臺大李宏毅機器學習作業1(HW1)

文章目錄

    • 作業要求:
    • 作業分析:
    • 模型分析:
    • 代碼分析:
      • 數據預處理:
      • 模型建立:
    • 完整代碼:
    • 運行結果:

作業要求:

給定訓練集train.csv,要求根據前9個小時的空氣監測情況預測第10個小時的PM2.5含量。

訓練集介紹:

  • CSV文件,包含臺灣豐原地區240天的氣象觀測資料(取每個月前20天的數據做訓練集,12月X20天=240天,每月后10天數據用于測試,對學生不可見);
  • 每天的監測時間點為0時,1時…到23時,共24個時間節點;
  • 每天的檢測指標包括CO、NO、PM2.5、PM10等氣體濃度,是否降雨、刮風等氣象信息,共計18項;
  • 數據集地址:https://pan.baidu.com/s/1o2Yx42dZBJZFZqCa5y3WzQ,提取碼:qgtm。
  • 作業分析:

    先看tarin.csv,列是監測數據,行是檢測項目,共分為18個檢測項目,24時的監測數據。

    其中比較特殊的數據是RAINFALL,含義是:是否下雨,所以需要將其變成布爾值。

    對于該數據,我們需要準備一個二維數組(18,9)來包含每一天的信息。


    而由于train.csv中給了24時的數據,我們只需要9時數據來預測10時的PM2.5,因此,我們可以用滑動窗口的方法來擴展數據:

    這樣一來,一天中包含了15個(18,9)的數據幀,共計240天*15=3600個數據幀及其label。


    模型分析:

    請見:
    線性回歸預測PM2.5----臺大李宏毅機器學習作業1(HW1)

    代碼分析:

    數據預處理:

    # 數據預處理 def dataProcess(df):#建立兩個列表,跟數組類似,但當中存放的是索引x_list, y_list = [], []# df替換指定元素,將空數據填充為0df = df.replace(['NR'], [0.0])# astype() 轉換array中元素數據類型array = np.array(df).astype(float)# 將數據集拆分為多個數據幀#從0開始,到4320行,步長為18for i in range(0, 4320, 18):#從0列開始,到第15列結束for j in range(15):#獲取一個二維列表,18行9列mat = array[i:i+18, j:j+9]# 取得PM2.5的數值作為標簽label = array[i+9, j+9]x_list.append(mat)y_list.append(label)x = np.array(x_list)y = np.array(y_list)return x, y, array

    df:是pd.read_csv()函數讀取train.csv獲得的DataFrame格式的類表格結構。

    其格式如下:


    模型建立:

    # 更新參數,訓練模型 def train(x_train, y_train, epoch):bias = 0 # 偏置值初始化weights = np.ones(9) # 權重初始化learning_rate = 1 # 初始學習率reg_rate = 0.001 # 正則項系數bg2_sum = 0 # 用于存放偏置值的梯度平方和wg2_sum = np.zeros(9) # 用于存放權重的梯度平方和for i in range(epoch):b_g = 0w_g = np.zeros(9)# 在所有數據上計算Loss_label的梯度for j in range(3200):b_g += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-1)for k in range(9):w_g[k] += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-x_train[j, 9, k])# 求平均b_g /= 3200w_g /= 3200# 加上Loss_regularization在w上的梯度for m in range(9):w_g[m] += reg_rate * weights[m]# adagradbg2_sum += b_g**2wg2_sum += w_g**2# 更新權重和偏置bias -= learning_rate/bg2_sum**0.5 * b_gweights -= learning_rate/wg2_sum**0.5 * w_g# 每訓練200輪,輸出一次在訓練集上的損失if i%200 == 0:loss = 0for j in range(3200):loss += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias)**2print('after {} epochs, the loss on train data is:'.format(i), loss/3200)return weights, bias

    完整代碼:

    import pandas as pd import numpy as np# 數據預處理 def dataProcess(df):#建立兩個列表,跟數組類似,但當中存放的是索引x_list, y_list = [], []# df替換指定元素,將空數據填充為0df = df.replace(['NR'], [0.0])# astype() 轉換array中元素數據類型array = np.array(df).astype(float)# 將數據集拆分為多個數據幀#從0開始,到4320行,步長為18for i in range(0, 4320, 18):#從0列開始,到第15列結束for j in range(15):#獲取一個二維列表,18行9列mat = array[i:i+18, j:j+9]# 取得PM2.5的數值作為標簽label = array[i+9, j+9]x_list.append(mat)y_list.append(label)x = np.array(x_list)y = np.array(y_list)return x, y, array# 更新參數,訓練模型 def train(x_train, y_train, epoch):bias = 0 # 偏置值初始化weights = np.ones(9) # 權重初始化learning_rate = 1 # 初始學習率reg_rate = 0.001 # 正則項系數bg2_sum = 0 # 用于存放偏置值的梯度平方和wg2_sum = np.zeros(9) # 用于存放權重的梯度平方和for i in range(epoch):b_g = 0w_g = np.zeros(9)# 在所有數據上計算Loss_label的梯度for j in range(3200):b_g += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-1)for k in range(9):w_g[k] += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-x_train[j, 9, k])# 求平均b_g /= 3200w_g /= 3200# 加上Loss_regularization在w上的梯度for m in range(9):w_g[m] += reg_rate * weights[m]# adagradbg2_sum += b_g**2wg2_sum += w_g**2# 更新權重和偏置bias -= learning_rate/bg2_sum**0.5 * b_gweights -= learning_rate/wg2_sum**0.5 * w_g# 每訓練200輪,輸出一次在訓練集上的損失if i%200 == 0:loss = 0for j in range(3200):loss += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias)**2print('after {} epochs, the loss on train data is:'.format(i), loss/3200)return weights, bias# 驗證模型效果 def validate(x_val, y_val, weights, bias):loss = 0for i in range(400):loss += (y_val[i] - weights.dot(x_val[i, 9, :]) - bias)**2return loss / 400def main():# 從csv中讀取有用的信息# 由于大家獲取數據集的渠道不同,所以數據集的編碼格式可能不同# 若讀取失敗,可在參數欄中加入encoding = 'gb18030'df = pd.read_csv('train.csv', usecols=range(3,27),encoding ='GBK')#print(df)x, y, _ = dataProcess(df)#劃分訓練集與驗證集x_train, y_train = x[0:3200], y[0:3200]x_val, y_val = x[3200:3600], y[3200:3600]epoch = 2000 # 訓練輪數# 開始訓練w, b = train(x_train, y_train, epoch)# 在驗證集上看效果loss = validate(x_val, y_val, w, b)print('The loss on val data is:', loss)if __name__ == '__main__':main()

    運行結果:

    總結

    以上是生活随笔為你收集整理的李宏毅机器学习——课后作业1的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。