【機器學習】人像分類(一)——過程總結
這個問題其實是上學期某門課的大作業的三個題目之一。公佈題目後我就對這個內容很感興趣,然而由於種種原因,和隊友商量之後仍然選擇了看起來最簡單的句子分類,對此我不無遺憾。
這個寒假裡計劃要乾的事情其實有很多,完成這個專案是其中之一;對CS的熱門方向——如機器學習等聽起來神乎其神的領域——有所瞭解也在ToDo-List上。據說最好的學習方式是learning in projects,不如趁此機會鞏固一下python。
問題描述
給定一組內容是兩個人在不同光線條件、不同表情下拍攝的面部照片,將照片按照人物分成兩類。
輸入:
10個2016維的向量。每張照片有2016個“畫素點”,輸入資料對應著10張照片的灰度圖。
輸出
屬於人物1的照片編號,和屬於人物2的照片編號。
過程
處理輸入
由於PCA有現成的庫,K-Means聚類的過程也相對清晰,因此處理輸入資料相關事宜的耗時可能要佔去1/3。
最為智障的是,一開始我以為input.txt中第i * 2016 ~ ((i + 1) * 2016 - 1)個數是第一幅圖的灰度值,聚類聚了半天卻發現怎麼都不對,場面一度十分尷尬;直到發現灰度圖也無法還原,我才意識到可能檔案中每一列是一幅圖片的灰度向量……
PCA降維
因為沒有學過高等代數,所以這部分我一直寄希望於現成的庫。對於PCA的數學原理,理解起來心有餘而力不足,找到的解釋玄之又玄,我在深夜怎麼都進不了眾妙之門。
然而,在向小夥伴討要原始測試資料時,超nice的小夥伴發給我一些他覺得有如神助的參考資料,其中就有這篇講解由淺入深、極為清晰動人的
K-Means聚類
開始的幾個晚上,簡直是面向bing懵逼……網上有不少聚類的例子,有些二維向量聚類的結果能被影象化,但2016維怎麼畫在平面上?陷入僵局.jpg。
某一天忘了什麼契機,突然在一個瞬間恍然大悟,n維空間中的兩個點也可以算距離啊!!之前的想法就很僵硬!這世界不只是二維和三維的嘛!
想通之後,碼程式碼勢如破竹,半個晚上就搞定了這部分。
一些很有趣的拓展閱讀資料:資料探勘十大演算法詳解。還原灰度圖檢驗
這部分用Matblab來做。
遇到的問題
判斷終止條件時,試圖計算這一次質心和上一次對應的質心之間的距離之差。然而怎麼知道哪兩個質心是對應的呢?
>>最終放棄此法,而選擇設一個聚類次數上限。發現list可以賦值給array!之後就變成向量運算了!python太好用了!記得需要把座標都存成向量的形式。
變數的作用域問題。假設dots本來是一個list,如果在函式內重新賦值dots = []的話,新賦的物件並不能被函式外感知到。尷尬。
試圖記錄執行log,但是write到檔案需要把list轉化成str,而且還可能會被省略號代替。醜。
>>然而我畢竟是學過ICS的人。C中有dup2()函式可以重定位,python中也可以呢。
temp = sys.stdout # 存一下標準輸出原先的值
sys.stdout = open(filename, 'w') # 重定位到檔案指標上
sys.stdout = temp # 恢復標準輸出