BetaMeow的起源
前段時間AlphaGo和李世石廣受關注,作為人工智慧的腦殘粉,看完比賽後激動不已,因為有一定的機器學習的基礎,便打算擼一個棋類的AI,但我還算有點自知之明,圍棋AI,甚至google打算做得通用AI是做不出的了,所以打算擼一個五子棋的AI。
選取五子棋作為試手專案主要是以下幾點原因:
- 規則簡單。為了簡單起見,BetaMeow只要有一方練成五子就可以判輸贏。
- 受眾多。因為五子棋的規則相對簡單,使得其受眾遠比圍棋多,換句話來說,我把BetaMeow做出來了,那麼可以測試的人也多。
機器學習的簡單介紹
近年機器學習
,資料探勘
,人工智慧
很火,但其實不少人對這些名詞其實是一頭霧水,我嘗試用我自己的語言解釋,如果有什麼需要完善的地方,歡迎提出。
比如說,有一個模型能夠能夠根據一個人的社交動態,推斷出他是喜歡蘋果還是香蕉,那麼,我現在想知道某個社交平臺上市喜歡蘋果的人多,還是喜歡香蕉的人多。顯然,我把社交平臺的資料扔進模型中跑一遍就可以了,但社交平臺資料肯定不是說一兩個txt檔案這麼簡單啊。這時就可能涉及網路爬蟲(收集資料),分散式儲存(資料量巨大的時候),過濾無關的資料(資料清洗),修改模型使得符合當前業務場景(花式調參),跑完資料獲得結果後決定採取什麼商業措施等。(BI)
機器學習就是負責考慮如何建立模型,而資料探勘則是負責其他地方,不過一般來說,資料探勘部分的工作可能會分開幾個部門來做。
簡言之,機器學習是內功,而資料探勘則是機器學習的一種用途。而人工智慧,就是更廣的概念了
五子棋AI
回到正題上,傳統的五子棋AI採用的搜尋演算法,這個方面其實已經很完善,聽聞已經出現了無解的結果(玩家無法取勝)。但BetaMeow本質上是我在學習機器學習方面的實戰專案,所以我想辦法利用機器學習的方面的演算法實現。
最後選擇決策樹演算法。通過決策樹判斷該局的狀況,屬於對方(玩家)佔優還是己方(AI)佔優。
什麼叫決策樹
至於什麼叫決策樹,有時真的是一圖勝千言。
圖片來至於http://www.52analysis.com/shujuwajue/2441.html
簡單來說,通過一層層的篩選下來,你就能獲得相應的結果。
如何構建決策樹
關於如何構建決策樹,如果需要了解文字說明,可以參考這裡,如果需要參考python的程式碼實現,可以參考下文給出的github地址,這裡只給出簡單總結。
簡單描述
在一個二維集合(可以看成矩陣)中,第二維代表每一個決策的例項,用某種方式(例如資訊增益(首先要計算熵))在確定一個最佳分割點(p),然後以該點作為根節點,此時剩下的子集有兩種情況,要麼作為決策樹的結果,要麼遞迴下去建立子樹。
選取特徵
有句話叫好的資料勝過好的模型,經過這番實踐我算是真正認識到這句話的意思。機器學習的演算法不是你隨便扔一個資料集下去,他都能訓練出一個有效的模型。我曾經把整個棋局扔給他它訓練,然而並沒有什麼亂用。幾番周折才角色以連子形式作為訓練的內容。
舉個例子
1 |
[1,1,0,1,2] |
這個訓練集表明,玩家的連子形式已經是1,1,0,1(0表示空位),如果玩家順利連成了4子,那麼AI則徹底出於劣勢,因為如果4子是在棋盤中間的話,那麼ai只能堵一邊,玩家還是可以在另一邊連成5子。
所以ai應該下在2號位,阻止其連成4子。
我的程式碼中有大量如此的資料,用於教會ai決定是及時阻止對方,還是提高自己的連子數。(跑兩次不同的決策樹)
BetaMeow的未來與本文後話
BetaMeow現在顯然是不完善的。
- 首先是五子棋規則的本身,首先是五子棋棋盤應該
15x15
,然後無知的我把它弄成了19x19
,然後規先後手的規則好像也有不同的規定,但我沒有考慮太多這方面,畢竟我的主要目的是機器學習的實踐,並非做出一個五子棋遊戲。五子棋只是一個載體。
同樣是因為我的目的在於演算法,所以介面不太美觀,甚至在不同解析度上可能有問題(使用的bootstrap應該問題不大),所以如果有較為熟悉前端的朋友,歡迎修改修改後Pull Requese給我。 - 第二點,演算法本身也有不完善的地方。
因為目前的方案是遍歷棋局,分析各店的形式,可能因為迴圈的原因,會導致後面的選擇覆蓋掉前一個選擇,從而錯過了一些最好的選擇。
下一步會是給每一個選擇的結果加上權重,從而避免上述問題。
嗯,說了這麼多,最後給出這個專案的github地址
重要的事情再說一遍。
前端真的做得很爛,如果有熟悉前端的朋友幫我修改一下,真的萬分感謝。
這個github地址會記錄下我學習機器學習和資料探勘的各種小專案(包括我之前的圖片識別的專案),將會持續更新很長一段時間,如果你對這個有興趣,歡迎關注和支援。
如果你也有機器學習和資料探勘等相關的專案,歡迎推薦給我,大家互相學習的同時,我也會在我的專案的README中給出你專案的URL(你也要給出我專案的URL哦,親)
感謝關注和支援。