摘要: 經過閱讀本文,咱們能夠了解一個名爲KernelML的Python軟件包,該軟件包旨在爲分析師和數據科學家提供針對於複雜損失函數和非線性係數的廣義機器學習算法。算法
最近,我創造了一個自定義的「粒子優化算法」,並製做了一個叫作KernelML的Python包。創造這種算法是爲了給數據分析師和數據科學家提供一個針對複雜損失函數和非線性係數的廣義機器學習算法。優化算法經過簡單機器學習和機率模擬的組合,使用損失函數、輸入和輸出矩陣以及隨機採樣器(可選)來尋找最優參數。目前,我在研究更多功能,但願項目最終可以開源。機器學習
**函數
**學習
以經緯度座標的聚類問題做爲範例,K均值的聚類方法使用歐氏距離來區別觀測值。可是,經緯度座標間的歐氏距離並不能直接映射爲Haversine距離。這意味着,若是將0和1之間的座標進行歸一化,則距離沒法精確的在聚類模型中得以表示。最好的解決方案就是找到座標投影,使該點質心的Haversine距離等於歐式空間中的投影距離。優化
以上座標變換在聚類解決方案中的縮放和使用,將相對於中心的Haversine距離轉化爲歐式距離。阿里雲
另外一個更簡單的問題是找到非線性係數的最優值,即最小二乘線性模型中的冪變換。這樣作的緣由很簡單,整數的冪變換不容易獲得最佳擬合變換。經過將冪變換轉換成爲任意實數,準確性大大提高,模型也能更好地驗證數據。spa
爲了更好地解釋冪變換的含義,上圖提供了該模型的公式。翻譯
KernelML的核心思想很簡單。在模型中使用參數更新歷史記錄來決定如何更新下一個參數集。在末端使用模型致使誤差變化問題,具體地說,參數誤差在每次迭代更新中變大。這個問題能夠在每次迭代後解決,須要在最佳參數集周圍進行蒙特卡洛模擬。code
該模型在每次迭代後保存最佳參數和用戶定義的損失,同時還記錄了全部參數的歷史更新記錄。但問題是如何使用這些數據來定義收斂。一個可能的解決方案的代碼以下blog
convergence = (best_parameter-np.mean(param_by_iter[-10:,:],axis=0))/(np.std(param_by_iter[-10:,:],axis=0)) if np.all(np.abs(convergence)<1): print('converged') break
該公式使用最後10個參數和最佳參數建立Z分數。若是全部參數的Z分數小於1,那麼該算法能夠說已經收斂。當存在理論上最好的參數集時,這種收斂解決方案效果很是好。下面的例子是在使用該算法進行聚類時所遇到的問題
圖1:使用KernelML,2-D多變量正態分佈(藍色),聚類解決方案(其餘顏色)
咱們不會深究聚類方案的質量,由於顯然它不表明數據。聚類解決方案使多維直方圖與6個正態分佈的平均機率之間的差別達到最小,每一個軸都是3。在這裏,分佈能夠很容易地「交換」座標點,這可能會增長收斂時間。也許有人會問,爲何不採用3-多元正態分佈?模擬分佈參數存在問題,由於一些參數具備約束條件。協方差矩陣須要是正的、半肯定的,而且須要存在逆矩陣。正態分佈中的標準差必須爲正。該模型中使用的解決方案經過對每一個單獨參數進行自定義模擬來整合對參數的約束。
非正態分佈(如泊松)可能不適合多元正態聚類解決方案中的其餘維度。另外,隨着維數的增長,一個聚類是具備非零值特徵的惟一聚類的機率也增長。這對EM算法提出了一個問題,由於它試圖更新協方差矩陣。惟一特徵和其餘維度之間的協方差將爲零,或者另外一個聚類接受具備此非零值的觀察值的機率爲零。
參數的機率模擬與徹底參數化的模型相比具備一些很大的好處。首先,正則化包含在先前的隨機模擬中。例如,若是先前對參數的隨機模擬在-1和1之間,則能夠推論參數將以一樣重要的方式更新。此外,在算法收斂的同時,每次迭代都會產生一組參數,以全局或局部最小損耗爲樣本進行採樣。這有兩個主要的好處:1)能夠爲每一個參數創建置信區間;2)每一個參數集的預測輸出能夠是統一模型中的有用特徵。
本文由阿里云云棲社區組織翻譯。
文章原標題《Kernel Machine Learning (KernelML) - Generalized Machine Learning Algorithm》,譯者:Anchor C.,審校:虎說八道。
本文爲雲棲社區原創內容,未經容許不得轉載。