日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

2020李宏毅深度学习hw1

發布時間:2023/12/8 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2020李宏毅深度学习hw1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2020李宏毅深度學習hw1

1、導入包

import sys import pandas as pd import numpy as np

2、加載數據

data = pd.read_csv('train.csv', encoding = 'big5')

兩個參數分別是“文件路徑”和“文件編碼格式”,

‘big5’指的是繁體中文編碼,因為給的數據是TW那邊的,所以必須是用big5來進行解碼。

3、無用數據去除

data = data.iloc[:, 3:] #iloc(行,列)

data.iloc[:, 3:]:
iloc(行號,列號),這個函數的功能是根據行號和列號提取內容。

行號傳遞的參數是“:”說明data的行內容全部取出,

列號傳遞的參數“3:”表明數據從3這個標號開始的列才拿出來,前面的0-3的列就全部去掉。

總結:取data中所有行的從第三列之后的所有列數

data[data == 'NR'] = 0

data[data == ‘NR’] = 0:
將數據中值為“NR”的數據全部賦值為0,去除特殊值。

raw_data = data.to_numpy()

raw_data = data.to_numpy():
將處理好的DataFrame的數據變成一個numpy矩陣。

事實證明raw_data = data.values這句話的效果和上面的這一句是一樣的效果。

4、提取特征

month_data = {} for month in range(12): # month 從0-11 共12個月sample = np.empty([18, 480]) # 返回一個18行480列的數組,用來保存一個月的數據(一個月只有20天,一天24個小時)for day in range(20): # day從0-19 共20天sample[:, day * 24: (day + 1) * 24] = raw_data[18 * (20 * month + day): 18 * (20 * month + day + 1),:]# raw的行每次取18行,列取全部列。# sample中(sample是18行480列)行給全部行,# 列只給24列,然后列往后增加month_data[month] = sample

使用字典month_data來存儲數據,先創建一個空字典

使用empty()來創建一個空的數組sample,用來存放最后的數據。

sample = np.empty([18,480])的參數是[18,480]就是要創建一個18行480列的數組來存放數據。

18行的意思是每天的一個小時的數據有18個特征數據,

480的意思是一天有24個小時,我們取得是每個月得前面20天,所以列數就是24*20==480。

sample[:, day * 24 :(day+1) * 24]中的“,

”前面是":“表明行的內容全部都要,”,

"后面的是列的內容,就是按照0-24-48-…這樣將24小時的數據提取出來保存。

raw_data的數據是豎著排列的,

raw_data[18 * (20 * month + day) : 18 * (20 * month + day+1), :]的“,

”前面是0-18-36…這樣取得。

5、特征提取

x = np.empty([12 * 471, 18 * 9],dtype=float) # 一共480個小時,每9個小時一個數據(480列最后一列不可以計入,因為如果取到最后一行,# 那么最后一個數據便沒有了結果{需要9個小時的輸入和第10個小時的第10行作為結果}),# 480-1-9+1=471。471*12個數據集按行排列,每一行一個數據;# 數據是一個小時有18個特征,而每個數據9個小時,一共18*9列 y = np.empty([12 * 471, 1], dtype=float) # 結果是471*12個數據,每個數據對應一個結果,即第10小時的PM2.5濃度 for month in range(12): # month 0-11for day in range(20): # day 0-19for hour in range(24): # hour 0-23if day == 19 and hour > 14: # 取到raw_data中的最后一塊行為18,列為9的塊之后,就不可以再取了,再取就會超過界限了#hour >14 表示每次取前9個小時,按滑動窗口方式依次向后滑動,當hour >14時,后面的列數就不夠9列,所以不能>14continuex[month * 471 + day * 24 + hour, :] = month_data[month][:, day * 24 + hour: day * 24 + hour + 9].reshape(1,-1) # vector dim:18*9 (9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9)# 取對應month:行都要取,列取9個,依次進行,最后將整個數據reshape成一行數據#(列數無所謂)。然后賦給x,x內的坐標只是為了保證其從0-471*12y[month * 471 + day * 24 + hour, 0] = month_data[month][9, day * 24 + hour + 9] # value,結果對應的行數一直是第9列(即第10行PM2.5)然后列數隨著取得數據依次往后進行

這一步的工作內容為獲取x和y這兩個數據,就相當于得到訓練的數據與目標的結果。

x的維數是[12471,189],最后的數據格式應該是行數代表的是按照9小時劃分出來的這么多的訓練數據,列的內容是每個小時的18項特征的的值。這便是訓練集的輸入參數。

y的維數是[12*471,1],代表和x對應的輸入的PM2.5的數值,所以列數是1,就只是一個PM2.5的值。

整個循環其實就是遍歷month_data字典將數據分割為9小時一組的訓練數據。

reshape(1,-1),就是將month_data[month][:,day * 24 + hour : day *24 + hour + 9]取出來的數據變換成1行的數據,列數的參數給-1,就是說列數讓程序自己去算出來。

https://www.jianshu.com/p/fc2fe026f002 是reshape()函數的介紹的博客,貼在這里。

y的值取0-9者10個小時中的最后一個小時的PM2.5的值。

6、Normalize 歸一化

mean_x = np.mean(x, axis=0) # 18 * 9 求均值,axis = 0表示對各列求均值,返回 1* 列數 的矩陣 std_x = np.std(x, axis=0)# 18 * 9 求標準差,axis = 0表示對各列求均值,返回 1* 列數 的矩陣 for i in range(len(x)): # 12 * 471for j in range(len(x[0])): # 18 * 9if std_x[j] != 0:x[i][j] = (x[i][j] - mean_x[j]) / std_x[j] # 標準差歸一化

mean_x = np.mean(x, axis=0)代碼解釋:
對x數據集中的每一列求平均值。

axis 不設置值,對 m*n 個數求均值,返回一個實數

axis = 0 : 壓縮行,對各列求均值,返回 1*n矩陣

axis = 1 : 壓縮列,對各行求均值,返回 m*1矩陣

https://www.cnblogs.com/LBSer/p/4440590.html 解釋了上面的一段代碼采用的是標準差歸一化。

7、拆分訓練集和驗證集

? 接下來是將訓練數據按8:2拆成訓練數據和驗證數據。這樣的好處是因為最終只給我們test data的輸入而沒有給我們輸出,所以我們無法定量我們模型的好壞,而使用驗證數據可以簡單驗證我們模型的好壞,讓我們自己心里有數。

# 將訓練數據拆成訓練數據:驗證數據=8:2,這樣用來驗證 import math x_train_set = x[: math.floor(len(x) * 0.8), :] y_train_set = y[: math.floor(len(y) * 0.8), :] x_validation = x[math.floor(len(x) * 0.8):, :] y_validation = y[math.floor(len(y) * 0.8):, :]

8、train 訓練

np.zeros([m,n]):返回一個全0的mn數組。
??np.ones([m,n]):返回一個全1的mn維數組。
??np.concatenate((a,b),axis=1):a和b做行拼接,結果為[a,b]。
??np.dot(x,w):x和w點乘。
??np.power(x,n):x中各元素的n次方。
??np.sqrt(x):x中各元素的平方根。
??np.sum(x):x中所有元素的和,返回一個值。
??x.transpose():將x轉置。

dim = 18 * 9 + 1 #參數:18*9個權重 + 1個偏置bias w = np.zeros([dim, 1]) #參數列向量初始化為0#x新增一列用來與偏置bias相乘,將模型y=wx+b轉化成y=[b,w]轉置·[1,x] x = np.concatenate((np.ones([12 * 471, 1]), x), axis=1).astype(float) # np.ones來生成12*471行1列的全1數組,np.concatenate,axis=1#表示按列將兩個數組拼接起來,即在x最前面新加一列內容,#之前x是12*471行18*9列的數組,新加一列之后變為12*471行18*9+1列的數組 learning_rate = 100 # 學習率 iter_time = 10000 # 迭代次數 adagrad = np.zeros([dim, 1]) # 生成dim行即163行1列的數組,用來使用adagrad算法更新學習率 eps = 0.0000000001 # 因為新的學習率是learning_rate/sqrt(sum_of_pre_grads**2),#而adagrad=sum_of_grads**2,所以處在分母上而迭代時adagrad可能為0,#所以加上一個極小數,使其不除0 for t in range(iter_time):loss = np.sqrt(np.sum(np.power(np.dot(x, w) - y,2)) / 471 / 12) # rmse loss函數是從0-n的(X*W-Y)**2之和/(471*12)再開根號,#即使用均方根誤差(root mean square error),#具體可百度其公式,/471/12即/N(次數)if (t % 100 == 0): # 每一百次迭代就輸出其損失print(str(t) + ":" + str(loss))gradient = 2 * np.dot(x.transpose(), np.dot(x,w) - y) # dim*1 x.transpose即x的轉置,后面是X*W-Y,即2*(x的轉置*(X*W-Y))是梯度,#具體可由h(x)求偏微分獲得.最后生成1行18*9+1列的數組。轉置后的X,其每一行是一個參數,#與h(x)-y的值相乘之后是參數W0的修正值,#同理可得W0-Wn的修正值保存到1行18*9+1列的數組中,即gradientadagrad += gradient ** 2 # adagrad用于保存前面使用到的所有gradient的平方,進而在更新時用于調整學習率w = w - learning_rate * gradient / np.sqrt(adagrad + eps) # 更新權重 np.save('weight.npy', w) # 將參數保存下來

9、載入驗證集進行驗證

w = np.load('weight.npy')# 使用x_validation和y_validation來計算模型的準確率,因為X已經normalize了,#所以不需要再來一遍,只需在x_validation上添加新的一列作為bias的乘數即可 x_validation = np.concatenate((np.ones([1131, 1]), x_validation),axis=1).astype(float) ans_y = np.dot(x_validation, w) loss = np.sqrt(np.sum(np.power(ans_y - y_validation, 2)) / 1131)print(loss)

10、預測testdata得到預測結果

testdata = pd.read_csv('./dataset/test.csv', header=None, encoding='big5') test_data = testdata.iloc[:, 2:] # 取csv文件中的全行數即第3列到結束的列數所包含的數據 test_data[test_data == 'NR'] = 0 # 將testdata中的NR替換為0 test_data = test_data.to_numpy() # 將其轉換為數組 test_x = np.empty([240, 18 * 9], dtype=float) # 創建一個240行18*9列的空數列用于保存textdata的輸入 for i in range(240): # 共240個測試輸入數據test_x[i, :] = test_data[18 * i: 18 * (i + 1), :].reshape(1, -1)# 下面是Normalize,且必須跟training data是同一種方法進行Normalize for i in range(len(test_x)):for j in range(len(test_x[0])):if std_x[j] != 0:test_x[i][j] = (test_x[i][j] - mean_x[j]) / std_x[j] test_x = np.concatenate((np.ones([240, 1]), test_x), axis=1).astype(float) # 在test_x前面拼接一列全1數組,構成240行,163列數據# 進行預測 w = np.load('weight.npy') ans_y = np.dot(test_x, w) # test data的預測值ans_y=test_x與W的積# 將預測結果填入文件當中 import csvwith open('submit.csv', mode='w', newline='') as submit_file:csv_writer = csv.writer(submit_file)header = ['id', 'value']print(header)csv_writer.writerow(header)for i in range(240):row = ['id_' + str(i), ans_y[i][0]]csv_writer.writerow(row)print(row)

參考來源:

李宏毅深度學習課程作業hw1詳解

李宏毅機器學習-第一課作業

李宏毅機器學習2020春季作業一hw1

總結

以上是生活随笔為你收集整理的2020李宏毅深度学习hw1的全部內容,希望文章能夠幫你解決所遇到的問題。

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