iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
SideProject30

python基礎及數據科學之應用系列 第 16

python基礎及數據科學之應用day 16[寶可夢相似度專案 (應用畢氏定理)]

  • 分享至 

  • xImage
  •  

day 16:

/images/emoticon/emoticon06.gif
希望瀏覽數可以多點啦,更多人看我的教學後有所增長

因為有點趕急,今天的範例只有一個,但我認為非常有趣和實用,是可以當作一個開始學習製作資料及分類。今天的範例將會以寶可夢為主。那麼便開始吧:

什麼是畢氏定理

畢氏定理(勾股定理)是數學中的一個基本定理,它與直角三角形有關。畢氏定理指出,在一個直角三角形中,直角的兩邊長的平方和相等斜邊長的平方。

相信大家在初中也有學過畢氏定理,所以這裏便不多作介紹。

公式:
https://ithelp.ithome.com.tw/upload/images/20231001/20163173Gh8WuAhmCq.jpg
(圖片來自google)

所以我們可以計算出幾個不同的物體最近距離,最近的距離代表兩者最相似,但總不可能數據只有兩種,可能有三、四種,甚至更多所以這時候便需要把公式改變成下列的:

https://ithelp.ithome.com.tw/upload/images/20231001/20163173Q2VjNjotBg.jpg

但我們一開始是沒有他們的距離,所以要將兩個點相減,才可以取得距離。

下列是一個以寶可夢為例比較示範,我列出了五項數據,分別有力量、師氣度、屬性、地區和受歡迎的程度。各位如果有興趣的話可以更改他們的數據。

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

就這樣,我們發現大牙狸和基格爾德最相似。
基格爾德和卡比獸最不相似

/images/emoticon/emoticon01.gif
大家可以利用這個方法去進行比較其他東西,自行嘗試才會有所進步,今天的有趣內容到這裏,如果覺得我的文章對你有幫助或有更好的建議,可以追蹤我和不妨在留言區提出,我們明天再見。

reference:
https://wiki.52poke.com/wiki/%E4%B8%BB%E9%A1%B5

此專案有參考Python-最強入門chatGPT助攻邁向數據科學之路-王者歸來(全彩印刷第四版)的第31章

上一篇
python基礎及數據科學之應用day 15[sympy模組]
下一篇
python基礎及數據科學之應用day 17[nltk資料庫介紹]
系列文
python基礎及數據科學之應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言