希望瀏覽數可以多點啦,更多人看我的教學後有所增長
因為有點趕急,今天的範例只有一個,但我認為非常有趣和實用,是可以當作一個開始學習製作資料及分類。今天的範例將會以寶可夢為主。那麼便開始吧:
畢氏定理(勾股定理)是數學中的一個基本定理,它與直角三角形有關。畢氏定理指出,在一個直角三角形中,直角的兩邊長的平方和相等斜邊長的平方。
相信大家在初中也有學過畢氏定理,所以這裏便不多作介紹。
公式:
(圖片來自google)
所以我們可以計算出幾個不同的物體最近距離,最近的距離代表兩者最相似,但總不可能數據只有兩種,可能有三、四種,甚至更多所以這時候便需要把公式改變成下列的:
但我們一開始是沒有他們的距離,所以要將兩個點相減,才可以取得距離。
下列是一個以寶可夢為例比較示範,我列出了五項數據,分別有力量、師氣度、屬性、地區和受歡迎的程度。各位如果有興趣的話可以更改他們的數據。
name | 力量(1-15) | 師氣度(1-5) | 屬性(0 or 1) | 地區(0-9) | 受歡迎的程度(1-5)
------------- | -------------
基格爾德 | 14 | 3 | 1 |5 | 3
烈空坐 | 11 | 5 | 1 | 2 | 4
固拉多 | 13 | 2 | 0 | 2 | 1
卡比獸 | 10 | 2 | 0 | 0 | 2
大牙狸 | 15 | 1 | 0 | 3 | 5
力量、師氣度、受歡迎的程度的數字都是代表越高越好,而地區則在下圖表示了他們的來源,屬性為0的話表示了這是一隻單一屬性的寶可夢,為一的話表示了這隻是複合屬性的寶可夢。
數字 | 地區 |
---|---|
0 | 關都 |
1 | 城都 |
2 | 豐緣 |
3 | 神奧 |
4 | 合眾 |
5 | 卡洛斯 |
6 | 阿羅拉 |
7 | 伽勒爾 |
8 | 洗翠 |
9 | 帕底亞 |
math是python內置的模組,不需另外安裝主要用作計算公式,但功能沒有numpy廣大。
import math as m
compare_name = "基格爾德"
pokemon_ability = [14 , 3 ,1 ,5 , 3]
pokemon_name = ["烈空坐","固拉多","卡比獸","大牙狸"]
#放置四隻寶可夢的各種數據
pokemon_features=[
[11 , 5 , 1 , 2 , 4],
[13 , 2 , 0 , 2 , 1],
[10 , 2 , 0 , 0 , 2],
[15 , 1 , 0 , 3 , 5]
]
#用作儲存答案
answers = []
for p in pokemon_features: #分別取出一項數據
distances = 0 #將他們的距離先設置為零,最後才加起來及開方
for i in range(len(p)):
distances = distances + (pokemon_ability[i] - p[i]) ** 2 #取得一項變數,並運用公式計算
distances=m.sqrt(distances) #開方
answers.append(distances) #加入answer的串列
most_similar = min(answers) #找出最少的值,即是最相關
similar_pokemon = answers.index(most_similar) #找出他的排序
#輸出答案
print(compare_name+" -->")
print(pokemon_name[similar_pokemon]+":" + str(most_similar))
for i in range(len(answers)): #用迴圈輸出答案
print(pokemon_name[i]+" : "+ str(answers[i]))
執行結果:
基格爾德 -->
大牙狸:3.7416573867739413
烈空坐 : 4.795831523312719
固拉多 : 4.0
卡比獸 : 6.6332495807108
大牙狸 : 3.7416573867739413
就這樣,我們發現大牙狸和基格爾德最相似。
基格爾德和卡比獸最不相似
大家可以利用這個方法去進行比較其他東西,自行嘗試才會有所進步,今天的有趣內容到這裏,如果覺得我的文章對你有幫助或有更好的建議,可以追蹤我和不妨在留言區提出,我們明天再見。
reference:
https://wiki.52poke.com/wiki/%E4%B8%BB%E9%A1%B5