自學機器學習與深度學習的路上,順便彌補不足的基礎知識很重要。
在利用ML/Neutral Network的技術解決問題時,程式的組織架構與邏輯往往反映一個人的思考模型,如果演算法能夠讓你的工作更有效率,學習沒有壞處呀。
藉由演算法的學習將有助於提升我們在撰寫程式的邏輯能力,並且在解決問題的思考模式上更有組織架構,如果我們在剛開始寫一項專案的程式只有考慮怎麼開頭與想要的結果,在撰寫程式的過程將會頻頻面臨很大的瓶頸,與無限次數的修改輪迴,這就是為什麼我們要學習演算法,來讓解決問題的流程更順暢!INPUT&OUTPUT的思考固然重要,但中間解決的過程需要符合(1)Finite能在有限步驟下完成(2)Definite描述上明確不冗長(3)Effectiveness,以達到符合期望的結果。
Step1:遇到問題清楚闡明問題的描述。
Step2:挑選適合的演算法。
Step3:證明演算法能得最適解答(正確且快速)。
以賽局理論著名的「穩定婚姻問題」來開始演算法的旅程~
假設一場餐宴中有男生與女生各三人,男生具有表白的自主權,而女生有權選擇接受與拒絕,兩方皆以喜好順序做排序,當A男與A女求婚時,A女可以比較A男與現任男友B男,以決定是否要答應求婚,追求穩定的婚姻關係。後面接以此類推,最終三男三女將各自擁有一段穩定的婚姻關係。在符合問題的假設之下,最終將有三個結果產生:
(1) 所有男生皆娶最愛的女生,儘管女生未必嫁給最愛的男生,在穩定的婚姻關係中,配對不會有改變。
(2) 所有女生皆嫁給最愛的男生,儘管男生未必娶最愛的女生,在穩定的婚姻關係中,配對不會有改變。
(3) 若男女生皆沒有達到最理想的配對,男女方未必是彼此的最愛,配對可能會改變。
當雙方願意結婚時,此時即為最適合的解。
而Gale Shapley演算法可以清楚闡述這個問題,當然不限於婚姻配對問題。
def stable_marriage(men_preferences, women_preferences):
# Number of men/women
n = len(men_preferences)
# Free men and women
free_men = list(range(n))
free_women = list(range(n))
# This will store the partner of each woman
women_partner = [-1] * n
# This will store the partner of each man
men_partner = [-1] * n
# This will store the proposal count of each man
men_proposal_count = [0] * n
while free_men:
man = free_men.pop(0)
woman = men_preferences[man][men_proposal_count[man]]
# Increment the proposal count for the man
men_proposal_count[man] += 1
if women_partner[woman] == -1:
# The woman is free, so they become partners
women_partner[woman] = man
men_partner[man] = woman
else:
# The woman is already engaged, check her preference
current_partner = women_partner[woman]
if women_preferences[woman].index(man) < women_preferences[woman].index(current_partner):
# The woman prefers this new man over her current partner
women_partner[woman] = man
men_partner[man] = woman
# The current partner becomes free again
free_men.append(current_partner)
else:
# The woman prefers her current partner
free_men.append(man)
return men_partner, women_partner
# Example preferences
men_preferences = [
[0, 1, 2],
[2, 0, 1],
[1, 2, 0]
]
women_preferences = [
[0, 1, 2],
[2, 0, 1],
[1, 2, 0]
]
men_partner, women_partner = stable_marriage(men_preferences, women_preferences)
print("Men's partners: ", men_partner)
print("Women's partners: ", women_partner)
第一天到此,明天就快要來了!