Max Coding blog

Max Coding blog

Zero in your target,and go for it.

HTML
1
2
3
4
5
6
7
<!DOCTYPE html>
<html>
<head>
<title>max</title>
</head>
<body>Hello this note is about HTML</body>
</html>

Add a content title

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<head>
<title>max</title>
</head>
<body>
<h1>one</h1>
<h2>two</h2>
<h3>three</h3>
<h5>five</h5>
</body>
</html>
MNIST手寫辨識(Pytorch version)

此文章是介紹MNIST手寫辨識的作法及知識,分為兩個版本,一個為Pytorch版本,另一個為Tensorflow版本,觀念的部分大致相同,比較不一樣的地會是在實作的部分,那廢話不多說,開始吧!

Contents

我會一步一步的講解每一個步驟,有些步驟是幫助我們做理解的,但對最後實作結果沒有明顯幫助,在文章最後面會有完整程式碼,而某些步驟只是讓我們更了解實作過程的那些程式碼不會被包含在內。

MNIST手寫辨識(TensorFlow-version)

此文章是介紹MNIST手寫辨識的作法及知識,分為兩個版本,,一個為Tensorflow版本,另一個為Pytorch版本,觀念的部分大致相同,比較不一樣的地會是在實作的部分,那廢話不多說,開始吧!

Contents

我會一步一步的講解每一個步驟,有些步驟是幫助我們做理解的,但對最後實作結果沒有明顯幫助,在文章最後面會有完整程式碼,而某些步驟只是讓我們更了解實作過程的那些程式碼不會被包含在內。

遷移學習-圖片辨識

影像辨識

(Modify from https://github.com/yenlung/Deep-Learning-Basics) ## 利用ResNet製作影像辨識

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.applications.resnet50 import preprocess_input
from tensorflow.keras.preprocessing.image import load_img, img_to_array
from urllib.request import urlretrieve

urlretrieve("https://rawcdn.githack.com/MaxWutw/Deep-Learning/a9bbc7ed859d16ebc782f3bbde5bd2e1c65073dc/Image%20recognition/type.txt", "classes.txt")

photo = []
for i in range(1,10):
urlretrieve(f"https://github.com/MaxWutw/Deep-Learning/raw/main/ResNet/photo{i}.jpg", f"photo{i}.jpg")
photo.append(f"photo{i}.jpg")
store = []
for i in range(0,9):
img = load_img(photo[i], target_size = (224,224))
x = img_to_array(img)
store.append(x)
resnet = ResNet50()
with open('classes.txt') as f:
labels = [line.strip() for line in f.readlines()]
for i in range(0, 9):
plt.figure(i)
plt.axis('off')
plt.imshow(store[i]/255)
store[i] = store[i].reshape(1, 224, 224, 3)
inp = preprocess_input(store[i])
[k] = np.argmax(resnet.predict(inp), axis=-1)
tex = labels[k].split(' ')
plt.text(15, 220,f"ResNet judge: {tex[0]}", fontsize = 15)
plt.show()
print(f"ResNet 覺得是 {labels[k]}")
### 輸出 ### 程式介紹 首先引入基本的套件,由於會使用到ResNet,所以這邊要引入keras.applications底下的ResNet50,其實還有V2版本,但這邊就使用原來版本的,而ResNet50在做判斷前會將圖片做前置處理,所以這邊引入preprocess_input,再來就是讀入圖片並將圖片轉成array,所以這邊要引入load_img,和img_to_array,最後urlretrieve是為了將網上的資料下載下來。 先從我的github下載ResNet判斷1000種類別的清單,並將此清單命名為classes.txt,接著從我的github上下載範例圖片,並將它添加進入一個list,再來將圖片轉成arrayㄝ並將此資料加入另一個list,這裡加入RestNet50當我們的神經網路,再來將剛才classes.txt的資料提取並加入laels裡,最後我們用迴圈將每個圖片都送進去ResNet50裡,並做預測,這樣即完成此次圖像辨識。 ## 利用遷移學習打造影像辨識 ### 程式碼(此部分程式碼是利用電腦裡自有的照片)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.applications.resnet50 import preprocess_input
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.preprocessing.image import load_img, img_to_array

tmp = []
for i in range(1,10):
tmp.append(f"photo{i}.jpg")

data = []
for i in range(0,9):
img = load_img(tmp[i], target_size = (256,256))
x = img_to_array(img)
data.append(x)
data = np.asarray(data, dtype = np.uint8)

target = np.array([1,1,1,2,2,2,3,3,3])

x_train = preprocess_input(data)
plt.axis('off')
n = 1
plt.imshow(x_train[n])

y_train = to_categorical(target-1, 3)

resnet = ResNet50(include_top=False, pooling="avg")
resnet.trainable = False

model = Sequential()
model.add(resnet)
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
model.fit(x_train, y_train, batch_size=9, epochs=25)

y_predict = np.argmax(model.predict(x_train), -1)
labels=["麻雀", "喜鵲", "白頭翁"]
print(y_predict)
print(target-1)

testing = []
pho = []
for i in range(1,4):
pho.append(f"test{i}.jpg")
for i in range(0,3):
img = load_img(pho[i], target_size = (256,256))
x = img_to_array(img)
testing.append(x)
testing = np.asarray(testing, dtype = np.uint8)

testing_data = preprocess_input(testing)
final = np.argmax(model.predict(testing_data), -1)
for i in range(3):
print(f"{i+1}. CNN judge: ", labels[final[i]])

print("Answer : 麻雀、白頭翁、喜鵲")
### 輸出

APCS實作題

APCS實作

Default code v1

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define out cout << '\n';
#define int long long
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")
signed main(){
IOS

return 0;
}

My default code

1
2
3
4
5
6
7
8
9
10
#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int main(){
IOS

return 0;
}

About pragma

1
2
3
4
5
6
#pragma GCC optimize("O0")//不優化(預設)
#pragma GCC optimize("O1")//優化一些
#pragma GCC optimize("O2")//優化更多
#pragma GCC optimize("O3")//O2優化再加上inline函式優化
#pragma GCC optimize("Os")//針對程式大小進行優化(程式最小)
#pragma GCC optimize("Ofast")//O3加上一些快速但不安全的數學運算

More about pragma

1
2
3
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")
  1. Ofast優化,加上迴圈展開、忽略堆疊溢出攻擊。
  2. 針對CPU的指令集擴充,只有一些intel支援,有些AMD也有。
  3. 加開堆疊,可以讓遞迴函式跑多一點。 $$$$
Linux基礎使用

Linux

linux基礎用法

第一個輸入大多為命令(command),後面家的通常為跟著這個命令的參數,參數都是用空格分開,不管加多少空格,terminal都會認為只加了一個空格。在最一開此使,@前面是用戶名,在@後面是計算機名 ### @ at在 ### computer:後第一個字元(Home Directory):為所在文件夾的名字 ### computer:後第二個字元(Prompt):提示符 ### uname 1. uname :會印出內核名字。 2. uname -a == uname --all:會印出系統的所有的資訊,會忽略未知的處理器與未知的硬件平台。 3. uname -s == uname --kernel-name:會印出顯示於網路上的主機名稱。 4. uname -r == uname --kernel-release:會印出內核的版本。 5. uname -v == uname --kernel-version:會印出內核運行於哪個linux上,和實際發行的日期。 6. uname -m == uname --machine:會印出電腦類型:x86_64(為64位元架構,如為32位元會如:x86_32) 7. uname -p == uname --processor:會印出處理器類型:x86_64(為64位元架構,如為32位元會如:x86_32) 8. uname -i == uname --hardware-platform:會印出硬件平台類型:x86_64(硬件平台包括如CPU、儲存裝置、主機板等等硬體) 9. uname -o == uname --operating-system:會印出操作系統名稱:GNU/Linux(作業系統,如windows) 10. uname -h == uname --help:會印出這個指令的幫助,與各個參數的功能 11. uname --version :會印出這個指令(uname)的版本與其他訊息(包括聲明、授權等等) ### ctrl+c :強制中斷某一支程式。 ### exit :離開系統。 ### cal :看月曆 。 ### cal :年份 :看某年的年曆。 ### cal :年份 月份 :看某年某月的月曆。 ### bc :計算機(此情況不能用小數)。 #### scale = 小數位數。 #### quit :退出bc。 ### file :查看文件訊息。 ### pwd(Print Working Directory) 取得目前的路徑 ### ls(list) 取得當前資料夾與檔案名稱 #### ls -l: 顯示出的資料的第一個區塊為顯示使用者權限,排除第一個字元(第一個字元如果是dash(-),此檔案即為文件,如果是d,則為目錄),剩下字元為三個三個一組,共三組,第一組是user,第二組是group,第三組是other。順序必為rwx,r(read),w(write),x(execute),若有權限則會顯示出該字元,若沒有權限則會顯示'-'(dash),而這三組的權限分別為第一個是文件所有者的權限、第二個為用戶組的權限,第三組為其他人的權限。 ### chmod(change mode) 如果你想要更換權限,可以使用這個命令,command:chmod u+r t.py,用法是第一個加入chmod指令,第二個是輸入你想更改權限的對象,user是u,group是g,other是o,接著+後面是加上你要給予的權力,注意如果是要刪除某項權力,就加上-減號,接著加上以下就是給予的權力,r(read),w(write),x(execute),最後加上檔案名稱。 ### 直接執行檔案 ./file.py 如果要直接執行某個檔案時可以直接使用這個指令,假設有一個檔案叫做test.py,然後我們想要執行他,所以輸入:./test.py,此時會發現出錯了,原因是你要在test.py的第一行加入一段指令,代表說這份文件要通過什麼來運行,而這邊我輸入#!/usr/bin/python3,之後再輸入:./test.py,即完成。 ### linux有一個特性,就是所有東西都是一個文件。 ### linux大小寫必須區分,在linux中大小寫是不一樣的東西。 ### 在terminal中可使用TAB鍵來補齊一些物件或檔名(善用TAB鍵)。 ### lscpu :查詢 CPU 規格。 ### / :根目錄。 #### bin :放置執行文件。 #### boot :放置開機會運用到的文件。 #### dev :接口設備都會存取在dev中。 #### etc :系統主要配置文件,例如用戶的帳號密碼、服務的起始文件。 #### home :主文件夾的位置。 #### lib :開機時會用到的主函式庫。 #### media :放置可以刪除的設備。 #### opt :第三方程式的放置目錄。 #### root :系統管理員的主文件夾。 #### sbin :放置一些只有系統管理員才可以執行的執行命令。 #### srv :服務取用數據的目錄。 #### tmp :放置一些臨時的文件,需定時清理。 #### usr :unix操作系統的支援(不是user!!!!!),可放置一些系統默認程式。 #### var :放置快取 ### cd(Change Directory) :切換目錄。 #### 絕對路徑 :是由根目錄也就是最前面的那一個目錄開始向下輸入的(要加/),不管在哪裡,只要有絕對路徑都可以去。 #### 相對路徑 :相對於當前工作目錄(pwd),不是從根目錄開始。 #### cd . :當前目錄。 #### cd .. :該目錄的上一層目錄。 ### man(manual page) :指令查詢 ### mkdir :創造路徑 #### 創造多層目錄: ##### -p :可以幫你把上一層目錄也創建好(如果上一層目錄不存在的話)。 ##### -pv :v的功能可以幫你顯示他正在執行甚麼。 ### rmdir :刪除目錄。 #### -p :可一次刪除多個目錄 ### touch :創建空文件,主要功能為修改文件,如果該文件不存在,則會創造一個空文件。 #### -a :修改訪問時間。 #### -c :修改文件時間,若不存在則不創建新文件。 #### -d :使用指定日期,而不是當前日期。 #### -m :僅修改mtime。 #### -t :使用指定的時間而不是當前的時間。 ### cp :複製,用法 cp a b ,將a複製給b。 ### echo發送文字: 用法 echo "word"。而且會換行。 #### 將文字輸入進一個檔案裡: 用法 echo "word" > data.txt。 如果是用 > 寫入的話會將原本的覆蓋,所以要使用 >> 才能延續檔案原本的資料 echo "word" >> data.txt。 ### cat(concatenate)顯示出檔案裡的文字 用法 cat data.txt #### cat 合併資料輸出 用法 cat first.txt second.txt #### 將兩個檔案合併出一個新的檔案 方法 cat first.txt second.txt >> third.txt,要加 >> 。 若要合併更多檔案,就以此類推 ### 用printf輸出 用echo和printf的最大差別是echo會換行而printf不會換行。 也可以使用printf輸入一個檔案,和echo一樣 ### vim文字編輯器 vi和vim.tiny和vim這三個功能極為相似,不同的地方是有些功能比較多,通常在linux中vim要另外裝。 此處使用vim.tiny,要進行文字編輯的方法:vim.tiny data.txt,按enter鍵後再按 i 即可進行編輯,當編輯完之後想要結束編輯,先按Esc,再按 : ,接著如果想要將剛剛編輯的資料寫進去,則按w,如果想直接退出,按q,如果進行編輯後不想儲存,就輸入q!即可強制退出。若想退出又要寫入,就按wq。 ### 下載vim 首先到ubuntu商店下載vim,接著去terminal輸出apt-get,apt-get會去網站上找有關你要下載的套件,但是如果apt-get沒有更新,他上去找的網站還是舊的,此時要把你的apt-get更新,因此輸入apt-get update,但此時又會出現錯誤,因為update此動作為較高階的動作,所以以目前的狀態是沒有權限執行的,所以要在apt-get前加sudo,此時作業系統會嘗試以超級使用者的方式幫你去做執行,所以輸入完sudo apt-get update即可完成網站的更新,更新完之後輸入sudo apt-get install vim,即可進行安裝,如果要移除,就輸入sudo apt-get remove vim ### whereis 查看東西在哪裡,會顯示所有相關的路徑。 whereis name ### which 會明確跟你說東西的實際路徑。 ### 查看物品的實際位置 以vim為例 方法 : ls -al /usr/bin/vim 接著會顯示一個箭頭 ->會指向一個地方,這就是軟連結,會指向更精確的地方,可以再繼續使用那個位置尋找更精確的位置。 ### vim 基本用法和vim.tiny一致,接著為vim的一些基礎指令。 :set nu 在每一行前面加數字編號。 輸入 dd 即可快速刪去該行。 輸入d2d可以快速刪除兩行 在前面加 / 後面加你想搜尋的文字。 按u可以undo 按ctrl+r是redo ## linux ssh 首先要再其中一台linux上獲取ip位置(稍後要給其他電腦做連接),首先先下載net-tools(稍後要使用的ifconfig是其中一部分),接著輸入ifconfig,然後往下滑可以找到你的ip位置,或者輸入ip addr show,也可以看到你的ip位置。接著在另一台電腦輸入:ssh username@ip,username是你linux的名稱,ip是你的ip位置。 mac 用戶: 如果是mac用戶且同時想要利用ssh在自己的mac上看到matplotlib的結果,要先安裝XQuartz,安裝完後在terminal裡輸入的不再是ssh user@ip 了,是要改輸入ssh -X user@ip,這樣才能看到matplotlib的效果。 ### linux查詢gpu型號 輸入 lspci | grep -i nvidia ,會顯示出幾行文字,例如: 01:00.0 VGA compatible controller: NVIDIA Corporation Device 1e84 (rev a1) 01:00.1 Audio device: NVIDIA Corporation Device 10f8 (rev a1) 01:00.2 USB controller: NVIDIA Corporation Device 1ad8 (rev a1) 01:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device 1ad9 (rev a1) 然後看第一行的最後面 1e84 ,這個就是型號,但我們還是看不出來實際的型號,所以去這個網站上輸入你的型號:http://pci-ids.ucw.cz/mods/PC/10de?action=help?help=pci 可以查到這張gpu是GeForce RTX 2070 Super。 ### 查看ubuntu版本 cat /etc/issue ### 更改檔案名稱 mv 原檔案名稱 更改的名稱 ### 查看目錄裡資料的數量 1. ls -l|grep "^-"| wc -l , find ./ -type f | wc -l: 查看當前目錄的所有資料數量(不包括子目錄資料數量)。 2. ls -lR|grep "^-"| wc -l : 查看當前目錄的所有資料數量(包括子目錄資料數量)。 3. ls -l|grep "^d"| wc -l : 查看當前目錄的所有資料夾目錄個數(包括子資料夾目錄個數)。 ## tmux 1. tmux:進入tmux。 2. tmux attach:進入預設第一個Session。 3. tmux new -s "tmp":新增、進入一個名為tmp的Session。 4. tmux ls:列出所有的Session。 5. tmux detach:暫時離開目前的Session。 6. Ctrl+D:關閉/結束目前的Session。 7. tmux kill-session -t "tmp":關閉、結束名稱維tmp的Session。 ### Panes分割視窗 1. Ctrl+b+%:垂直分割視窗。 2. Ctrl+b+":水平分割視窗。 3. Ctrl+b+o:輪流切換pane。 4. Ctrl+b+方向鍵:切換指定方向的pane。 5. Ctrl+b+空白鍵:切換佈局。 6. Ctrl+b+!:將目前的pane抽出來,並獨立建立一個window視窗。 7. Ctrl+b+x:關閉目前的pane。 ### Windows視窗 1. Ctrl+b+c:建立新的window視窗。 2. Ctrl+b+w:以視覺化選單切換window視窗。 3. Ctrl+b+n:切換至下一個window視窗。 4. Ctrl+b+p:切換至上喔個window視窗。 5. Ctrl+b+數字鍵:切換至指定的window視窗。 6. Ctrl+b+&:關閉目前的window視窗。 ### Session 1. Ctrl+b+$:重新命名目前的Session。 2. Ctrl+b+d:離開tmux環境。 3. Ctrl+b+s:視覺化選單切換Session。 4. Ctrl+b+L:切換上一個使用過的Session。 5. Ctrl+b+(:切換上一個Session。 6. Ctrl+b+):切換下一個Session。 7. 想回去特定的Session: tmux attach -t "session name"(請忽略雙引號) 8. 修改Session名稱:tmux rename-session -t "origin seesion name" "new name" (請忽略雙引號) 9. 刪除某一個Session: tmux kill-session -t 0 或是 tmux kill-session -t <session_name> 10. 刪除所有Session: tmux kill-session -a 11. 快捷鍵:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
快捷鍵/視窗管理
C-b ? Help
C-b c 新增視窗
C-b, 視窗命名
C-b w 視窗列表
C-b f 尋找視窗
C-b & 刪除視窗
C-b % 垂直分割區塊
C-b “ 水平分割區塊
C-b <方向鍵>
C-b p 上一個視窗
C-b n 下一個視窗
C-b <number> 依照編號直接切換(編號顯示於狀態列)
C-b d 離開 session
C-b x 關閉 Pane
C-d 關閉 Pane
C-b z 讓一個 Pane 變成全螢幕,在輸入一次則回到剛剛的尺寸

by 中和高中 吳振榮
Matplotlib

matplotlib 數據可視化

參考資料:https://matplotlib.org/stable/index.html ### matplotlib.pyplot.cla() & matplotlib.pyplot.clf() & matplotlib.pyplot.close() matplotlib.pyplot.cla():清除當前座標軸。 matplotlib.pyplot.clf():清除當前圖形。 matplotlib.pyplot.close():關閉整個視窗。 ### 做出一個簡易的一次函數圖形

1
2
3
4
5
6
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1, 1,50)
y = 2*x+1
plt.plot(x,y)
plt.show()
Pandas

Pandas

pandas

參考資料:https://pandas.pydata.org/pandas-docs/stable/reference/index.html ### Series #### 製作出一個一維陣列

1
2
3
4
5
6
import pandas as pd
data = pd.Series([1,2,3,4,5])
print(data)
print("Max:",data.max())#output is 5
print("Median",data.median())#output is 3.0
print(data==20)#output is a boolean
#### 觀察Series資料
1
2
3
4
5
import pandas as pd
data = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(data.dtype)#查看資料型態
print(data.size)#查看資料數量
print(data.index)#查看資料索引
#### 資料的索引(索引數量要和元素數量一致)
1
2
3
import pandas as pd
data = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(data)
1
2
3
4
import pandas as pd
data = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(data[2],data[0])##按照順序取得資料
print(data["e"],["d"])##按照索引取得資料
#### Series數學、統計相關函式:sum()max()、prod()全部相乘、mean()、median()、std()標準差、nlargest(n)前n大的數字、nsmallest(n)取最小的n個數字
1
2
3
4
5
6
7
import pandas as pd
data = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(data.max())#最大值
print(data.sum())#總和
print(data.std())#標準差
print(data.median())#中位數
print(data.nlargest(3))#最大的三個數
#### Series字串操作:str.lower()、str.upper()、str.len()、str.cat(sep = "n")用n串在一起、str.contains("n")判斷每一個字串是否包含n、str.replace("n","k")對字串做取代的動作,把n變成k
Numpy

參考資料:https://numpy.org/doc/stable/reference/ ## np.array([]) 若要製造一個矩陣,可使用此函式。 ## array.ndim 可查看array是幾維矩陣。 ## array.size 可查看有多少元素在array裡。 ## array.transpose() or array.T 可將矩陣轉置,row變成column,column變成row。

Scikit Learn

Scikit Learn

線性回歸

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

x = np.linspace(0, 5, 200)
y = 1.2 * x + 0.8 + 0.5 * np.random.randn(200)

x_train, x_test, y_train, y_test = train_test_split(x, y,test_size = 0.2,random_state = 0)
x_train = x_train.reshape(len(x_train), 1)
x_test = x_test.reshape(len(x_test), 1)

model = LinearRegression()
model.fit(x_train, y_train)

y_predict = model.predict(x_test)
model.predict([[4.3],[2.5]])

plt.scatter(x_test, y_test)
plt.plot(x_test, y_predict,c = 'r')
plt.show()

函數圖形

### 程式介紹 首先先引入一些第三方套件,numpy和matplotlib幾乎是必備,今後不多做贅述,接著從sklearn.model_selection引入train_test_split,train_test_split主要功能是劃分資料,最後從linear_model引入LinearRegression方便稍後做線性回歸訓練。 接著建造假數據,x為0~5得數字,共500個,y為將x乘以1.2+0.8,且還須加上一個雜值,使數據更像真數據。然後我們將x和y資料做切割,分別代表x訓練資料x測試資料,y訓練資料,y測試資料,在train_test_split()參數裡先加入要切割的資料,在第三個參數加入每個資料的大小,範圍在0~1之間,而random_state是我們的亂數種子,可以固定我們切割資料的結果。然後我將x的訓練資料和測試資料變成n*1的矩陣,代表說我們每次輸入皆是一個資料。 接著我們的model是線性回歸,而我們使用model.fit()將此model fit,意思是使此model在函數中找到代表的線,此線是最合適所有資料點的,也就是線性回歸在做的事,找尋最佳直線。接著進行預。,我們將一開始切割好的預測資料放入,此時為了測試效果,我在後面又多加兩個資料,記得自己增加資料時,要保持n*1的矩陣,最後將點點出來,並畫出回歸直線即完成。 ## 波士頓房價預測(真實數據) ### 程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston

sns.set()
boston_dataset = load_boston()
# print(boston_dataset.DESCR) # description
# print(boston_dataset.data[:5])

boston = pd.DataFrame(boston_dataset.data,columns = boston_dataset.feature_names)

# boston.head()

boston['MEDV'] = boston_dataset.target
boston.head()

sns.distplot(boston.MEDV, bins = 30)
corr_matrix = boston.corr().round(2)
plt.figure(figsize = (11.7, 8.27)) # 寬先寫
sns.heatmap(corr_matrix, annot = True) # draw
plt.figure(3)
boston.iloc[0]
x = boston.loc[:, "CRIM" : "LSTAT"].values
y = boston.MEDV.values

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 0)
model = LinearRegression()
model.fit(x_train, y_train)

y_predict = model.predict(x_test)
plt.scatter(y_test, y_predict)
plt.xlim(0, 55)
plt.ylim(0, 55)
plt.plot([0, 55], [0, 55], c = 'r')
### 輸出圖形
avatar
Max Wu
Hello