下午犯困的問題

在異國他鄉,亚洲男人天堂,日本一本道高清无码AV,最新高清无码专区.在线观看中文字幕DVD播放,2019在线观看亚洲男人天堂20整片观看,日本一本道高清无码AV,最新高清无码专区.在线观看中文字幕DVD播放体验更清晰,适度观看,小心身体。中午沒有午休時間,腦袋壹直處在暈暈的狀態,困的不行。也許習慣了院裏的舒適的環境,保證每天中午的睡眠時間;也許身體機能的退化,不能提供足夠的能量保證身體的精力充沛。壹直在思考,人為什麽中午需要休息?確切的說自己中午為什麽需要午休?按照壹般的理論,成年人睡夠6至8小時已經足夠,我的睡眠時間應該是足夠的。難道是意誌問題?也許吧。有時候意誌不夠堅定,很容易被大腦的另壹個它左右。那就需要改變,頂住困的狀態,繼續工作吧, :-)

發表在 隨筆 | 留下評論

各種分類算法比較

1決策樹(Decision Trees)的優缺點

決策樹的優點:

壹、           決策樹易於理解和解釋.人們在通過解釋後都有能力去理解決策樹所表達的意義。

二、           對於決策樹,數據的準備往往是簡單或者是不必要的.其他的技術往往要求先把數據壹般化,比如去掉多余的或者空白的屬性。

三、           能夠同時處理數據型和常規型屬性。其他的技術往往要求數據屬性的單壹。

四、           決策樹是壹個白盒模型。如果給定壹個觀察的模型,那麽根據所產生的決策樹很容易推出相應的邏輯表達式。

五、           易於通過靜態測試來對模型進行評測。表示有可能測量該模型的可信度。

六、          在相對短的時間內能夠對大型數據源做出可行且效果良好的結果。

七、           可以對有許多屬性的數據集構造決策樹。

八、           決策樹可很好地擴展到大型數據庫中,同時它的大小獨立於數據庫的大小。

 

決策樹的缺點:

壹、           對於那些各類別樣本數量不壹致的數據,在決策樹當中,信息增益的結果偏向於那些具有更多數值的特征。

二、           決策樹處理缺失數據時的困難。

三、           過度擬合問題的出現。

四、           忽略數據集中屬性之間的相關性。

2 人工神經網絡的優缺點

人工神經網絡的優點:分類的準確度高,並行分布處理能力強,分布存儲及學習能力強,對噪聲神經有較強的魯棒性和容錯能力,能充分逼近復雜的非線性關系,具備聯想記憶的功能等。

人工神經網絡的缺點:神經網絡需要大量的參數,如網絡拓撲結構、權值和閾值的初始值;不能觀察之間的學習過程,輸出結果難以解釋,會影響到結果的可信度和可接受程度;學習時間過長,甚至可能達不到學習的目的。

3 遺傳算法的優缺點

遺傳算法的優點:

壹、           與問題領域無關切快速隨機的搜索能力。

二、           搜索從群體出發,具有潛在的並行性,可以進行多個個體的同時比較,魯棒性好。

三、           搜索使用評價函數啟發,過程簡單。

四、           使用概率機制進行叠代,具有隨機性。

五、           具有可擴展性,容易與其他算法結合。

 

遺傳算法的缺點:

壹、           遺傳算法的編程實現比較復雜,首先需要對問題進行編碼,找到最優解之後還需要對問題進行解碼,

二、           另外三個算子的實現也有許多參數,如交叉率和變異率,並且這些參數的選擇嚴重影響解的品質,而目前這些參數的選擇大部分是依靠經驗.沒有能夠及時利用網絡的反饋信息,故算法的搜索速度比較慢,要得要較精確的解需要較多的訓練時間。

三、           算法對初始種群的選擇有壹定的依賴性,能夠結合壹些啟發算法進行改進。

4 KNN算法(K-Nearest Neighbour) 的優缺點

KNN算法的優點:

壹、          簡單、有效。

二、          重新訓練的代價較低(類別體系的變化和訓練集的變化,在Web環境和電子商務應用中是很常見的)。

三、          計算時間和空間線性於訓練集的規模(在壹些場合不算太大)。

四、           由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。

五、           該算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域采用這種算法比較容易產生誤分。

 

KNN算法缺點:

壹、           KNN算法是懶散學習方法(lazy learning,基本上不學習),壹些積極學習的算法要快很多。

二、           類別評分不是規格化的(不像概率評分)。

三、           輸出的可解釋性不強,例如決策樹的可解釋性較強。

四、           該算法在分類時有個主要的不足是,當樣本不平衡時,如壹個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入壹個新樣本時,該樣本的K個鄰居中大容量類的樣本占多數。該算法只計算“最近的”鄰居樣本,某壹類的樣本數量很大,那麽或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響運行結果。可以采用權值的方法(和該樣本距離小的鄰居權值大)來改進。

五、           計算量較大。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。

5 支持向量機(SVM)的優缺點

SVM的優點:

壹、           可以解決小樣本情況下的機器學習問題。

二、           可以提高泛化性能。

三、           可以解決高維問題。

四、           可以解決非線性問題。

五、           可以避免神經網絡結構選擇和局部極小點問題。

 

SVM的缺點:

壹、           對缺失數據敏感。

二、           對非線性問題沒有通用解決方案,必須謹慎選擇Kernelfunction來處理。

6 樸素貝葉斯的優缺點

優點:

壹、           樸素貝葉斯模型發源於古典數學理論,有著堅實的數學基礎,以及穩定的分類效率。

二、           NBC模型所需估計的參數很少,對缺失數據不太敏感,算法也比較簡單。

 

缺點:

壹、           理論上,NBC模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因為NBC模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的(可以考慮用聚類算法先將相關性較大的屬性聚類),這給NBC模型的正確分類帶來了壹定影響。在屬性個數比較多或者屬性之間相關性較大時,NBC模型的分類效率比不上決策樹模型。而在屬性相關性較小時,NBC模型的性能最為良好。

二、           需要知道先驗概率。

三、           分類決策存在錯誤率

7 Adaboosting方法的優點

壹、           adaboost是壹種有很高精度的分類器。

二、           可以使用各種方法構建子分類器,Adaboost算法提供的是框架。

三、           當使用簡單分類器時,計算出的結果是可以理解的。而且弱分類器構造極其簡單。

四、           簡單,不用做特征篩選。

五、           不用擔心overfitting。

8 Rocchio的優點

Rocchio算法的突出優點是容易實現,計算(訓練和分類)特別簡單,它通常用來實現衡量分類系統性能的基準系統,而實用的分類系統很少采用這種算法解決具體的分類問題。


9各種分類算法比較

根據這篇論文所得出的結論,

Calibrated boosted trees的性能最好,隨機森林第二,uncalibrated bagged trees第三,calibratedSVMs第四, uncalibrated neural nets第五。

    性能較差的是樸素貝葉斯,決策樹。

    有些算法在特定的數據集下表現較好。


參考文獻:

 

[1] 羅森林, 馬俊, 潘麗敏.數據挖掘理論與技術[M].電子工業出版社.2013.126-126

[2] 楊曉帆,陳廷槐.人工神經網絡固有的優點和缺點[J].計算機科學.1994(vol.21).23-26

[3] Steve.遺傳算法的優缺點.http://blog.sina.com.cn/s/blog_6377a3100100h1mj.html

[4] 楊建武.文本自動分類技術.

www.icst.pku.edu.cn/course/mining/12-13spring/TextMining04-%E5%88%86%E7%B1%BB.pdf

[5] 白雲球工作室. SVM(支持向量機)綜述.http://blog.sina.com.cn/s/blog_52574bc10100cnov.html

[6] 張夏天. 統計學習理論和SVM的不足(1).http://blog.sciencenet.cn/blog-230547-248821.html

[7] RichCaruana,AlexandruNiculescu-Mizil.An Empirical Comparison of Supervised LearningAlgorithms.2006

 

發表在 機器學習 | 留下評論

文獻調研壹

今天閱讀了兩篇文獻,壹篇略讀,壹篇詳讀,閱讀文獻的感覺像雨後的豆子,小苗破土而出,慢慢的長大。

很長壹段時間,閱讀文獻壹直困惑著我,有點“看山不是山,看山還是山”。閱讀完後,文章的新穎性,創新性、缺點或不足之處仍然飄在空中,讓我有點抓狂。今天又是壹個值得紀念的日子(紀念的日子越來越多,就怕後來記不住,發表個心得,作為記錄,:-)),腦洞大開的我有史歷來第壹次都懂了別人的文章,思考文章的思路方法能否為我所用,如應用到不通的領域、針對不足之處,結合其他的方法,設計壹種新的的算法框架等等。同時也慢慢的明白研究要做好,需要做大量的文獻調研。文獻調研的思路非常重要,與大家分享下我的思路(計算機方向)。

首先,調研研究領域的問題現狀,別人用了哪些方法,優點缺點如何,做好詳細的記錄,這對論文開題和論文撰寫中的國內外研究現狀部分幫助非常大(之前本人吃過大虧,總覺得寫這部分非常的難)。

其次,針對別人沒有解決的問題,目前哪些方法可以解決。谷歌學術中搜索文獻綜述(如果有),沒有的話也只有自己找近3年的相關頂級雜誌會議的文章。根據參考文獻,回溯算法歷史,對算法整體有個大致的了解。

最後,對采用的算法文章進行精讀,並Python或者matlab快速實現(如果能下載到源碼或者作者給的話,是最好不過的事情),看看算法的效果。這時,算法很多細節會很清楚。跑幾個實際案例,算法的優缺點壹目了然了,還怕找不到創新點。

以上純屬個人悟出的總結,僅供大家參考!

發表在 研究心得 | 標簽為 | 留下評論

從博士開題失利中受到的啟發

2015年7月3日下午4點20分,人生中壹個值得紀念的時間點。今天下午博士開題,首戰不利,折戟沈沙,科研自信心嚴重受挫。決定參加7月初開題以來,每天逛google,遊知網,上ACM,瀏覽於elsevier等學術網站瘋狂下載文獻。對於壹個沈迷於技術的工科男來說,閱讀文獻都帶有工程的思維,希望了解下載文獻的所講的技術細節,後果是兩周的文獻調研沒什麽進展(主要是開始文獻看太細,每個點都想弄清,壹篇文章花的時間太多)。眼看著開題報告的時間點就要到了,內心焦慮,食不香,夜不能寐。向導師請教經驗,同學交流,根據關鍵詞在ISI Web上看文章摘要。對於壹個在學術上沒有多少沈澱的我來說,看過與沒看過基本上是壹樣。距交開題材料還有不到壹周的時間,開題報告上仍然是孤零零的論文題目幾個大字,內心更加焦慮。沒有辦法,只有努力的從鍵盤中敲出了開題報告中的每個部分的框架,然後壹點壹點的往框架裏面填材料。第壹步,我寫的研究內容。由於博士課題是小老板臨時敲定的,我不是太熟悉的領域,研究內容可是折騰的我不輕,夢裏都在想。想不清楚,與小老板討論,閱讀文獻,然後再去討論,反反復復N多次。感覺這個月比過去幾年時間所閱讀文獻數量都要多,也算是壹種進步了。撰寫技術路線時,壹個碼農的思維怪圈再次出現,從數據、算法、應用、系統方面的闡釋博士論文,最後服務於人民大眾。小老板糾正了N多次,終於在時間節點的前壹天,壹篇仍然帶著工程思維的開題報告完成出爐。然後火急火燎的準備開題PPT,提交,總是松了口氣。

時間過得真快,壹轉眼就到了開題報告會的日期,也就是今天下午。在錯過了第壹個兄弟的開題展現,不過,後面的兄弟姐妹的展示盡收眼底。當他們展示完後,五個評委老師輪番攻擊,壹個個像灌了火藥似得,壹副不問倒誓不罷休的樣子。當時我的心就咯噔了壹下,平心而論,兄弟姐妹們做的比我好很多,有的已經發表了SCI文章。本次開題總共7人,報告順序我倒數第二個。按道理說,這應該個不錯的順序。由於準備的不是很充分,坐在凳子上的我如坐針氈,七上八下,忐忑不安。時間在不知不覺的過程中偷偷跑了兩個小時,終於輪到我上臺做報告了。坐在報告席上,頭暈乎乎的,幾乎短路(昨天晚上在開發壹個基於微信的第三方服務系統,壹直忙到今天淩晨四點才結束,6點多親愛的爸爸電話叫早不期而遇,幾乎崩潰)。在做開題報告PPT展示過程中,幾乎都是按字念過的,乏味而冗長。報告做完後,靜候評委老師發炮。不出壹點意外,炮火來的密集且猛烈,炸的體無完膚。他們提的第壹個問題,提出的算法新穎性在哪裏?為什麽參考文獻幾乎沒有近幾年的研究比較好的文章,如頂級會議ICML的文章?如何保證提出的算法別人的更優?(其實不止壹個問題,問題是連續問的壹系列問題)。提到文獻調研,這確實是我的壹個軟肋,沒有好好的總結過所閱讀的文獻確(實話實說,真的不是太清楚怎麽總結,小老板講的讓我感覺在遊黃山,雲裏霧裏)。第二個問題,提出算法模型的思路不清晰,評委老師覺得開題報告中提出的算法具體怎麽做?研究的偽度量空間分割樹的結構與現有的其他樹形結構的異同,我也講不清楚(還是文獻調研不充分的問題)。另外,醫療大數據的度量計算方面,傳統的聚類算法用的歐氏空間的度量方式,醫療數據用的非歐氏空間度量,苦逼的是我對非歐氏空間的度量方式都沒有多少概念,開題報告中的只是停留在大的概念中,沒有落地到怎樣解決非歐氏度量空間的問題。豪沒底氣的回答了評委老師的問題,當時覺得這次開題很懸,被Fail掉的概率很高。壹點不超出我的意料,開題結束不到半個小時,人教處的漂亮妹妹電話通知我確實Failed。雖然在意料之中,但還是很受打擊。

痛定思痛,仔細想想,或許這是件好事。首先,得糾正自己的學術態度;第二,得花much more的時間在學術研究上了(縱觀Paper Machine們,每天工作到晚上兩三點);第三,平時多閱讀文獻;第四,要樹立追求卓越的思想,要麽不做,要做就做到極致!!!

版權所有,轉載註明出處(http://www.kfboy.com)

發表在 研究心得 | 標簽為 | 留下評論

數據挖掘在醫學上的應用

數據挖掘,又稱知識發現(KDD),是從大量的數據中抽取潛在的、有價值的知識的過程。數據挖掘所探尋的模式是壹種客觀存在的、但隱藏在數據中未被發現的知識。例如,數據挖掘可直接挖掘疾病高發人群,發現疾病及癥狀間的未知聯系,探索化驗指標間的影響關系及化驗指標與疾病間的潛在影響,對未知的實驗室指標值進行預測,可以探索合並癥之間的關系,還可以自動發現壹組高維實驗室指標變量的異常等等。再如,在科研設計中利用聚類分析,我們可以對數據進行科學分組,通過考察多因素的不同影響權重,可以幫助確定析因分析或嵌套分析等不同的科研設計等等。數據挖掘在醫學中應用非常廣泛,它必然為醫學臨床和科學研究提供傳統方法不能企及的又壹種前沿技術手段。

國外數據挖掘在醫學應用上的案例

數據挖掘在國外各行各業得到廣泛的應用,醫學領域也不例外,很多數據挖掘技術被成功應用到醫學臨床和科研方面,下面就列舉幾個簡單的案例。

1. 聚類分析在醫學上的應用

糖尿病是世界上壹種常見的疾病,超過18萬美國人患有糖尿病,另有16萬人糖尿病處於糖尿病前期。糖尿病的臨床診斷往往是從身體癥狀和化驗值異常著手的。有些異常指標包括身體質量指數( BMI ),血壓( BP )指數等。利用聚類分析工具可以分析患者的疾病診斷數據,以進行探索性的數據分析,並考察產生的聚類結果的意義。至於糖尿病患者的數據,聚類分析工具試圖按照年齡、種族、性別、體重指數和BP指數等產生聚類模式,並將數據劃分到相應的自然組群中。

使用聚類分析工具探索性地分析糖尿病患者的基本指標數據,通過良好的劃分類均值來產生聚類。本案例中,對於已有的3個不同的數據集進行聚類分析,產生的聚類數在5到8之間,每個聚類中的病人數量有多有少,運算聚類所消耗的時間大約在5秒鐘到4分鐘之間。

通過聚類分析,專家們在所有3個數據集中共得到4種類型的患者:

·患者為肥胖(體重指數> 56 ),但血壓正常;
·患者基本指標(BMI,BP)是正常的 ;
·患者血壓在正常範圍內,但體重指標異常 ;
·患者基本指數(BMI,BP)異常 ;

以上4種糖尿病的聚類結果揭示了糖尿病患者典型的四個分型,在臨床上具有重要意義。

2. 關聯規則分析在醫學上的應用

關聯規則是壹個發現醫療數據中隱藏關聯模型的有前途的技術。通常,關聯規則在醫療數據中挖掘出大量的規則,規則數量不僅相當大,而且其中大部分規則在醫學上是無關緊要的。對於有用的壹些規則,醫學專家尋找的速度很慢,而且發現了規則以後解釋起來也很困難。在這項工作中,我們引入搜索約束,以只發現在醫學上有意義的關聯規則,並使規則搜索更有效。

例如,應用關聯規則分析發現心臟灌註測量和病人危險因素與四個特殊的動脈狹窄程度緊密相關。我們通常用關聯規則的支持度、置信度、以及LIFT指標來評價其在醫學上的意義,如圖壹所示。

數據挖掘
3. 預測分析在醫學上的應用

前列腺癌檢查可早期發現癌癥,但不是所有的病人都能受益於後繼的治療。因此,辨別出哪些病人最有可能患有侵入性癌癥,將大大減少前列腺活檢試驗。我們收集了1,563例接受了前列腺活檢的病人數據,采集10微克/毫升或更少的血清PSA數據,用預測模型對侵入性前列腺癌進行分析。用隨機選取的70%的數據對預測模型進行訓練,其余30%的數據用於對預測模型進行測試。在1,563例病例中,有406人患有癌癥(26.1%),其中130人患有侵入性前列腺癌(8.3%)。預測模型創建了如下侵入性前列腺癌風險組規則:

1. PSAD大於0.165ng/ml/cc。

2. PSAD大於0.058 ng/ml/cc且小於0.165 ng/ml/cc , 年齡大於 57.5 歲且前列腺量大於22.7 cc。

預測模型經測試數據驗證,模型對侵入性前列腺癌的敏感度為91.5% ,特異性為33.5%。在測試數據中,當PSAD 是0.058 ng/ml/cc 或更少時,侵入性前列腺癌的發病率是1.1%。因此,預測模型可以有效地識別侵入性前列腺癌風險組。當單壹的高度前列腺癌診斷將導致後繼的治療時,預測模型可以減少33.5%的不必要的活檢試驗。

國外數據挖掘在醫學上的應用

數據挖掘的很多理論和技術源自歐美國家,這些國家開展數據挖掘技術的研究和應用比較早,因此也有長年的數據挖掘的技術積累和經驗積累。歐美國家對數據挖掘技術研發的投入比較大,不僅投入大量的資金,而且還配備了陣容強大的研發團隊。這些國家對數據挖掘技術的應用意識比較高,因此他們對數據挖掘技術的研究熱情較高,將最新技術應用於科學和商業的需求比較迫切,因此有大量的成熟的、應用穩定可靠的數據挖掘實際應用案例。由於他們比較早地應用前沿智能信息技術開展健康與醫學方面的研究,現在無論從數據挖掘研究和應用的深度和廣度上都走在了世界前列,並且很多科研成果已經轉化為有形的技術與產品,直接得到了廣泛的應用,並產生了顯著的社會效益與經濟效益。例如,數據挖掘在在醫學應用於如下幾個方面。

1、疾病和疾病風險的預測

通過對醫學大數據的挖掘、分析,並應用智能決策技術,對常見疾病如心絞痛、心肌梗死、腦血管疾病、糖尿病、高血壓病、腫瘤、哮喘病、結締組織病等疾病發生幾率的預測和疾病風險的預測,預測遺傳性疾病和多發性多因素疾病,有重大的臨床意義和廣泛的社會效益。如圖二所示,應用數據挖掘技術對不穩定心絞痛病人進行探索性分析。數據挖掘
2、人群健康、生命質量的預測

現代人要應付快節奏的學習、工作和生活,而且要處理好各種錯綜復雜的社會人際關系。面對競爭和挑戰,人們的生理和心理都不斷在衰弱、老化和病變。最新流行疾病調查顯示,某些城市人口甚至有70%的人群處於亞健康狀態,而且亞健康人群、疾病人群還在增加。通過對大量醫學數據的挖掘分析和應用智能決策技術,不僅可以發現各種健康的危險因素和相關性,並可進行個體化預測,而且基於相關的挖掘成果可建立的壹套完善、周密和個性化的健康管理系統,幫助健康人群及亞健康人群建立有序、健康的生活方式,降低風險狀態,遠離疾病;並可幫助對亞健康人群對疾病早發現、早預防、早診斷、早治療、早手術,提高生存率、降低致殘率和病死率、提高生命的質量。如圖三所示,應用數據挖掘的預測模型對“體重超重且血脂並不異常”的體檢人群進行血紅蛋白指標的預測分析。
數據挖掘

3、醫療上各種缺陷發生幾率的預測

通過對大量醫學數據的挖掘分析,以及應用智能決策技術,可以揭示發生醫療缺陷的原因、趨向、相關因素,以便制定科學的管理,減少、甚至杜絕醫療缺陷和糾紛。例如,加拿大安大略省癌癥防治中心通過研發、實施安大略省預防醫學與癌癥防治體系,對全省的腫瘤大數據進行數據挖掘,開展病人安全與事故的預防,即利用數據挖掘方法揭示臨床事故的趨勢,研究和辨別引起各種事故的關鍵因素,指導預防措施。

4、降低醫療費用,優化醫療資源

通過對醫學大數據的挖掘,並應用智能決策技術還能夠大幅度地降低醫療費用。基於大量醫學數據分析的基礎上進行科學的健康管理,可使醫療費用大幅下降,醫療費用可降少到原來的10%。正如美國密執安大學健康管理研究中心主任Dee.W.Edington博士提出的90%和10%的論斷,即健康管理對於任何企業及個人都有這樣壹個秘密,即90%和10%。具體地說,就是90%的個人和企業通過健康管理後,醫療費用降到原來的10%;10%的個人和企業未做健康管理,醫療費用比原來上升90%。因此,數據挖掘在醫學上的應用具有顯著的經濟效益。通過對醫學大數據的挖掘與應用,可清楚了解疾病發生的幾率和臨床上預防和治療的重點,可以優化現有的設備和人才,明確引進人才和新技術的方向,促進醫療的更新和建設,調整醫療布局,優化醫療資源,正確進行醫療決策。

國內數據挖掘在醫學上的應用

數據挖掘的應用在中國得到了越來越多的重視與越來越廣泛的認可,我們可以預言,數據挖掘的應用必將在各行各業上得到普及!

總的來說,在中國,數據挖掘在醫學上得到了很多的嘗試,人們在不斷地探索和進步。我們在應用數據挖掘技術研究健康與疾病的領域中尚屬摸索階段,與業界領先的壹些國家存在著壹定的差距,主要體現在以下幾個方面:

1、從數據挖掘的理論和技術上看,我們的很多認識和意識還是比較傳統和陳舊的。很多人對數據挖掘的理論和技術的認識,還只是停留在幾個常用的技術和算法上面,把數據挖掘認識得比較狹隘。實際上,數據挖掘發展到今天,雖然還只是初級階段,但數據挖掘的內涵和外延已經較以前有了相當的拓展,數據挖掘不再是大家認識的常用的幾個技術和算法,而是壹切可以應用的用於發現大數據中隱藏規律的技術和手段。既然認識不足、意識不到,那必將影響到數據挖掘的研究與應用的效果,這是我們首要需要改進的。

2、從數據挖掘的研發與應用的人員結構上看,我們的很多數數據挖掘的從業人員大多是來自大專院校的老師、或醫療研究機構的技術人員、或其他IT技術人員,大多數人不是系統地從事醫學數據挖掘的專業研究與應用,很難了解世界上先進的數據挖掘的完整體系和系統應用方法,甚至很多人還限於對某些傳統算法的摸索,導致數據挖掘技術的研究和應用的起點不高。尤其在數據挖掘的應用層面,數據挖掘是個大知識的匯集區與融通體,它不僅需要對數據挖掘算法有深入掌握,還需要對大數據技術有深刻了解,包括數據庫技術、數據建模技術、數據整合技術、超大規模數據優化技術等等,當然還需要對醫學專業知識的深入了解。因此,做好數據挖掘在醫學上的應用,應該需要復合型的人才,他們應是數學專家、信息專家和醫學專家三位壹體的人員或三位壹體高度集成的團隊。

3、從數據挖掘的應用經驗上看,國內的很多從業人員沒有長年的技術積累,更沒有成熟的科研應用和醫學應用經驗,所以數據挖掘的應用大多僅限於某壹局部的探討性應用,鮮有成熟穩定的實際應用案例。

但是,我們堅信,只要我們知己知彼,博采眾長,勇於探索、持之以恒,我們必將能夠在數據挖掘應用與醫學的事業上取得長足進步!

數據挖掘在醫學上的應用需求

醫學是壹門知識體系龐大、復雜的學科,有太多的新知識、新規律有待人們去挖掘。數據挖掘作為壹種主動式發現工具,在醫學臨床和科研中具有廣泛用途。例如,

1、對體檢人的醫學數據和病人的醫學數據,應用數據挖掘技術探索醫學的潛在規律,研究各種人體指標在健康中的權重,以及在不同人群中的分布。

2、應用數據挖掘技術研究人體生理指標之間的關聯,更深入的了解人體生理各個指標的綜合意義,探索多個人體生理數據的內在關系以及這種關系健康的關系,可發現綜合因素對健康的影響,從而探究出健康的原因。

3、通過健康體檢數據和病人數據的挖掘分析,發現如何綜合判別健康狀態,分析導致疾病的影響因素,建立評估模型來預測危險度,並進壹步建立疾病的預測模型等。

尤其是在醫學科研方面,數據挖掘大有用武之地。我們在大量的醫學科研支持與服務項目中,深刻體會了科研者面臨的困境、以及他們的需求與尋求的幫助。例如,許多醫學科研工作者時常感到科研思路枯竭,並為缺乏壹個新穎的科研命題而苦惱。因為,科研的關鍵點和難點正是科研創新。有的醫學家在使用精當、嚴謹的統計學進行科研分析方面感覺力不從心,統計學的應用成為科研工作的壹個瓶頸。還有的學者感覺在學術上很難有所突破,他們希望提升科研成果的水平和檔次。以上這些,都可以應用數據挖掘的技術和方法在科研中幫助他們的工作。

另壹方面,醫學工作的領導們也希望本單位的科研工作能蒸蒸日上。但事實上,領導們時常為本單位低落的科研熱情和淡漠的學術氛圍而感到無可奈何,為改變上述狀況缺乏有效的方法和手段,總感到力不從心,為每年科研工作進展不利而心急如焚,為本單位科研成果在質和量上的落後局面而感到如若針氈。而要改變這種狀況,壹方面需要在科研人才上狠下功夫,另壹方面需要在科研的技術和手段方面大力改進。科研人才的改進是在現有的人力、物力的條件下很難在短時間有顯著成效的,科研技術和方法的提升相對來說稍好壹些,而數據挖掘技術的應用正是改進科研技術的壹種方法。

以數據挖掘為核心的智能醫學科研工具

為了提升醫學科研方法,提高醫學科研的數量和質量,我們借鑒了國外的相關技術和經驗,提出並研發了以數據挖掘為核心的智能醫學科研系統。我們為醫學科研提供了壹整套方案,搭建了壹個完整的智能化科研平臺,從日積月累的大量臨床數據中精心提煉所需的科研資料,全方位地提供智能化的科研工具,多、快、好、省地全面提升科研工作。

具體來講,在我們的智能醫學科研系統中,將最新應用數學、計算科學和智能計算等多種學科應用於醫學科研,借鑒了國外的智能醫學科研技術和經驗,將我們在北美多年的成功經驗和業界領先的技術相結合,並融合了中國醫學專家的智慧,為中國醫學用戶量身打造的高端智能科研平臺。智能醫學科研系統是應用醫院現有的電子化醫學數據(HIS/LIS/PACS/電子病例/體檢系統等)以及建設各醫學專科數據庫,開展局網在線共享式的多課題醫學科研,提供智能化的工具使醫學科研工作新穎、科學、嚴謹、高效、低成本,可望全面提升大型醫院和科研單位的整體科研水平。如圖四,智能醫學科研系統的智能統計分析界面。
數據挖掘

智能醫學科研系統具有如下特點:

· 以數據挖掘技術為核心的智能分析系統可以直接挖掘醫學新知識,幫助科研者加速取得科研成果,甚至重大科研發現。

· 運用多種數據挖掘技術探索數據規律,為科研設計提供科學依據,為科研命題指明方向,保證了科研的成功率。

· 直接多課題交叉重復利用積累的現有醫學數據,使科研成本大大降低,使利用節省下的科研經費再爭取更多科研成果。

· 強大易用的樣本篩選系統,使科研數據的收集高效準確,能滿足科研數據的嚴格要求。全在線科研平臺提供科研全過程的壹攬子工具,省去了繁瑣復雜的人工數據處理。

· 基於經典科研設計的智能式科研統計流程,使科研者不必因設計失誤或誤用統計方法而使科研功虧壹簣。系統內嵌的統計算法自動運算結果,使科研者擺脫復雜的專用統計軟件煩惱。

實踐證明,醫院應用智能醫學科研系統,可獲得顯著的工作效益,使得醫院的科研和臨床工作得到良性發展。例如,醫院的整體科研能力加強了,科研水平得到了提高,科研成果和論文數量和質量提高了,發表在國家級、國際級的論文和成果增加了,科研的影響指數也相應提升了,同時,獲取更多的、更重大的國家級、省市級的課題的機會也更多了。總之,整體科研的提升使醫院的學術權威性得到了提高,具有更廣泛的社會的影響度,醫院的軟實力得到增強,同類醫療市場的競爭力加強了,相應地也提高了醫院的經濟效益。

當然,大力提升科研技術和方法是提高科研工作效果的壹個必然手段,但更重要的還是在於發揮科研人員的主觀能動性,以數據挖掘為核心的智能醫學科研工具僅僅是壹個好的工具而已。如果科研人員對於科研創新沒有動力、缺乏積極性、或者急功急利、或者搞偽科研,甚至由於單位內部人事的復雜而爭鬥,即使建設了再好的、再先進的科研工具,也沒人能利用它,科研工作的真正提高也只能是無稽之談!

 

發表在 機器學習 | 留下評論

譜聚類算法(Spectral Clustering)

譜聚類(Spectral Clustering, SC)是壹種基於圖論的聚類方法——將帶權無向圖劃分為兩個或兩個以上的最優子圖,使子圖內部盡量相似,而子圖間距離盡量距離較遠,以達到常見的聚類的目的。其中的最優是指最優目標函數不同,可以是割邊最小分割——如圖1的Smallest cut(如後文的Min cut), 也可以是分割規模差不多且割邊最小的分割——如圖1的Best cut(如後文的Normalized cut)。

clip_image001圖1 譜聚類無向圖劃分——Smallest cut和Best cut

這樣,譜聚類能夠識別任意形狀的樣本空間且收斂於全局最優解,其基本思想是利用樣本數據的相似矩陣(拉普拉斯矩陣)進行特征分解後得到的特征向量進行聚類。

1 理論基礎

對於如下空間向量item-user matrix:

clip_image002

如果要將item做聚類,常常想到k-means聚類方法,復雜度為o(tknm),t為叠代次數,k為類的個數、n為item個數、m為空間向量特征數:

1 如果M足夠大呢?

2 K的選取?

3 類的假設是凸球形的?

4 如果item是不同的實體呢?

5 Kmeans無可避免的局部最優收斂?

……

這些都使常見的聚類問題變得相當復雜。

1.1 圖的表示

如果我們計算出item與item之間的相似度,便可以得到壹個只有item的相似矩陣,進壹步,將item看成了Graph(G)中Vertex(V),歌曲之間的相似度看成G中的Edge(E),這樣便得到我們常見的圖的概念。

對於圖的表示(如圖2),常用的有:

鄰接矩陣:E,eij表示vi和vi的邊的權值,E為對稱矩陣,對角線上元素為0,如圖2-2。

Laplacian矩陣:L = D – E, 其中di (行或列元素的和),如圖2-3。

clip_image004圖2 圖的表示

1.2 特征值與L矩陣

先考慮壹種最優化圖像分割方法,以二分為例,將圖cut為S和T兩部分,等價於如下損失函數cut(S, T),如公式1所示,即最小(砍掉的邊的加權和)。

clip_image006

假設二分成兩類,S和T,用q(如公式2所示)表示分類情況,且q滿足公式3的關系,用於類標識。

那麽:

clip_image008

其中D為對角矩陣,行或列元素的和,L為拉普拉斯矩陣。

由:

clip_image010clip_image011

有:

1、 L為對稱半正定矩陣,保證所有特征值都大於等於0;

2、 L矩陣有唯壹的0特征值,其對應的特征向量為1

離散求解q很困難,如果將問題松弛化為連續實數值,由瑞利熵的性質知其二將妳型的最小值就是L的特征值們(最小值,第二小值,……,最大值分別對應矩陣L的最小特征值,第二小特征值,……,最大特征值,且極值q相應的特征向量處取得,請參見瑞利熵(Rayleigh quotient))。

寫到此,不得不對數學家們致敬,將cut(S,T),巧妙地轉換成拉普拉斯矩陣特征值(向量)的問題,將離散的聚類問題,松弛為連續的特征向量,最小的系列特征向量對應著圖最優的系列劃分方法。剩下的僅是將松弛化的問題再離散化,即將特征向量再劃分開,便可以得到相應的類別,如將圖3中的最小特征向量,按正負劃分,便得類{A,B,C}和類{D,E,F,G}。在K分類時,常將前K個特征向量,采用kmeans分類。

PS:

1、此處雖再次提到kmeans,但意義已經遠非引入概念時的討論的kmeans了,此處的kmeans,更多的是與ensemble learning相關,在此不述;

2、k與聚類個數並非要求相同,可從第4節的相關物理意義中意會;

3、在前k個特征向量中,第壹列值完全相同(叠代算法計算特征向量時,值極其相近),kmeans時可以刪除,同時也可以通過這壹列來簡易判斷求解特征值(向量)方法是否正確,常常問題在於鄰接矩陣不對稱。

clip_image012

圖3 圖的L矩陣的特征值與特征向量

2 最優化方法

在kmeans等其它聚類方法中,很難刻劃類的大小關系,局部最優解也是無法回避的漏病。當然這與kmeans的廣泛使用相斥——原理簡單。

2.1 Min cut方法

如2.2節的計算方法,最優目標函數如下的圖cut方法:

clip_image014

計算方法,可直接由計算L的最小特征值(特征向量),求解。

2.2 Nomarlized cut方法

Normarlized cut,目標是同時考慮最小化cut邊和劃分平衡,以免像圖1中的cut出壹個單獨的H。衡量子圖大小的標準是:子圖各個端點的Degree之和。

clip_image016

2.3 Ratio Cut 方法

Ratio cut的目標是同時考慮最小化cut邊和劃分平衡,以免像圖1中的cut出壹個單獨的H。

最優目標函數為:

clip_image018

2.4 Normalized相似變換

歸壹化的L矩陣有:

clip_image020

因而L的最小特征值與D-(1/2)E D-(1/2)的最大特征值對應。

而計算的L相比計算L要稍具優勢,在具體實用中,常以L替代L,但是min cut和ratio cut不可以。

PS:這也是常常在人們的博客中,A說譜聚類為求最大K特征值(向量),B說譜聚類為求最小K個特征值(向量的原因)。

3 譜聚類步驟

第壹步:數據準備,生成圖的鄰接矩陣;

第二步:歸壹化普拉斯矩陣;

第三步:生成最小的k個特征值和對應的特征向量;

第四步:將特征向量kmeans聚類(少量的特征向量);

4 譜聚類的物理意義

譜聚類中的矩陣:

clip_image022

可見不管是L、L都與E聯系特別大。如果將E看成壹個高維向量空間,也能在壹定程度上反映item之間的關系。將E直接kmeans聚類,得到的結果也能反映V的聚類特性,而譜聚類的引入L和L是使得G的分割具有物理意義。

而且,如果E的item(即n)足夠大,將難計算出它的kmeans,我們完全可以用PCA降維(仍為top的特征值與向量)。

上述對將E當成向量空間矩陣,直觀地看符合我們的認知,但缺乏理論基礎;而L(L等)的引入,如第2節所述,使得計算具有理論基礎,其前k個特征向量,也等價於對L(L等)的降維。

因而聚類就是為圖的劃分找了理論基礎,能達到降維的目的。

其中不少圖出源於Mining of Massive Datasets,對於同仁們的布道授業,壹並感謝。

推薦相關相關文檔:Wen-Yen Chen, Yangqiu Song, Hongjie Bai, Chih-Jen Lin, Edward Y. Chang. Parallel Spectral Clustering in Distributed Systems.

推薦相關源碼:https://code.google.com/p/pspectralclustering/ (真心很贊)

——

只能永遠把艱辛的勞動看作是生命的必要;即使沒有收獲的指望,也能心平氣和的繼續耕種。
發表在 算法分析 | 標簽為 | 留下評論

自己動手寫壹個推薦系統

廢話:

最近朋友在學習推薦系統相關,說是實現完整的推薦系統,於是我們三不之壹會有壹些討論和推導,想想索性整理出來。

在文中主要以工程中做推薦系統的流程著手,穿插壹些經驗之談,並對於推薦系統的算法的學術界最新的研究進展和流派作壹些介紹。當然由於我做推薦系統之時還年幼,可能有很多偏頗甚至錯誤的見解,就當拋磚引玉,還請各位大大指點。

Reading lists

雖然很多人覺得作為AI的分支之壹,推薦跟自然語言處理等問題的難度不可同日而語。但所謂磨刀不誤砍柴工,我覺得,至少在開工前先應該閱讀這樣基本書,起碼要看看目錄,以對於推薦系統有個初步的了解。

中文書籍:

1.《推薦系統實踐》項亮http://book.douban.com/subject/10769749/

這本書妳說他好吧,不如recommend handbook;妳說他不好吧,確實又把很多基礎而簡單的問題講的很詳細,而且還是中文的。薄薄的壹本書,分分鐘可以翻完,總而言之,是壹本入門的好書。

 

外文書籍

1.《Recommender Systems Handbook》Paul B. Kantor  http://book.douban.com/subject/3695850/

其實所有敢自稱handbook的書都是神書。這本書寫的非常細,而且非常全,如果妳去看壹些推薦系統的壹些比較冷門的topic的paper,比如fighting spam的,甚至能發現很多paper就是直接引用這本書裏相關章節的內容。可以說這本書是做推薦同學必備的枕邊書,沒看過這本書出去吹牛逼時妳都不好意思說自己是做推薦的,不過說實在,真正看完的沒幾個,壹般是用到哪裏查哪裏,我剛才就去豆瓣驗證了,幾個做推薦的都是在讀,壹群文藝青年都是想讀。此書唯壹的缺點是沒有出新版,有些地方已經成為時代的眼淚了。

 

2.《Recommender Systems – An Introduction》 Dietmar Jannach

http://book.douban.com/subject/5410320/

跟上面壹本差不多,學院派的綜述型的書,厚厚壹本,不看的時候當枕頭用。

 

3.《mahout in action》Sean Owen http://book.douban.com/subject/4893547/

上面的壹中壹外的書都是理論基礎的書,這本書就和工程有些沾邊。如果妳要用mahout框架來做推薦系統,那麽是必須要掃壹遍的;如果妳不用mahout,看看其中的流程和代碼組織也是有壹定好處的。

 

Paper

由於《Recommender Systems Handbook》很多地方已經成為了時代的眼淚,這裏推薦壹些綜述,以便開闊眼界。

壹篇是physics report上面的recommend system這篇綜述,可以說是最新最全的綜述了,看完後學術界都在折騰啥分分鐘就清楚了。http://arxiv.org/pdf/1202.1112v1.pdf

比較經典的是recommend system的state of art這篇綜述,很多老壹輩的同誌喜歡推薦的,說實在這篇因為年代久遠,也已經成為時代的眼淚了。

開工:

上面給了壹些reading lists,並不是說要讀完所有的才能開工,只是說,先看完個目錄,哪裏不懂查哪裏。在下面介紹的做推薦系統的流程中,我只是想給大家介紹個普通的推薦系統該怎麽做,所以很多地方都有偷懶,還請大家見諒。而且由於我不是做的在線的推薦系統,而是屬於隔天推薦的那種離線的,所以敘述工程的時候就是只敘述離線的推薦。

數據準備:

壹般來說,做推薦系統的數據壹般分兩種,壹種從在線的讀取,比如用戶產生壹個行為,推薦系統就反應下(傳說豆瓣fm就是這麽做的?),還有壹種就是從數據庫裏讀。

我個人壹般是這樣做的:跟做反作弊的人打個招呼,讓他們在記用戶行為數據的時候順便存到各個線上服務器上,再寫個php腳本,從各個服務器上把我需要的日誌抓過來,然後當日要的最新的數據就來了。

但是這種地方其實存儲的數據是加了壹些判斷的,也就是說是分類記錄的(因為很多記錄是別人刷的,比如丟壹個鏈接到qq群裏讓別人幫忙投票什麽的),這裏不細說,到後面fighting spam的地方再討論。

數據過濾:

當我們得到了每天產生的數據後,說實在這些數據實在是太多了,我們當然用不到這麽多,就要寫個過濾模塊,把壹些我們用不到的數據過濾掉。

我壹般是這樣做的:寫個python的腳本,把過濾器放到壹個單獨的模塊,要用的過濾器就到責任鏈裏面註冊下。這樣別人和自己維護起來也方便點,順便壹說,過濾的東西壹般來說有這樣幾種:壹種是壹個item只有壹個user打過分的,而且以前沒有人打分的,這樣的數據放到推薦的模型裏去跑雖然mahout會自動無視它,但其實按照power law來說是有不少的,內存能省就省吧;還有壹種是有些黑名單的,有item和user各自的黑名單,這些也是事先要去掉的。

數據存儲:

這個就是大家仁者見仁,智者見智的時候了,因為壹般來說,是妳選用的算法和算法具體的實現方式以及基礎架構決定了妳的存儲方式,就不多說了。

我壹般是這樣做的:壹般做成增量處理的方式,然後每天壹計算,壹周壹回滾。由於算法實現的特殊性,每40個item user對存儲在壹起,有點類似於bitmap吧。

推薦系統算法部分:

這部分以前寫過類似的小記錄和心得筆記之類的東西,就直接貼了_(:з」∠)_

這裏的推薦系統的核心算法主要用mahout實現。

各種算法對於推薦都有著自己的特定的假設,對於什麽時候什麽樣的算法會有比較好的performance應該對於假設反復驗證。說白了就是做實驗。

然後我們壹般用什麽算法呢,看看mahout給的算法吧,花樣繁多,什麽item based,user based,slop-one,SVD等等,常用的都有了,那我們要用什麽算法呢。

先簡單說下user based的算法在mahout中的壹些實現:

第壹步應該先算出所有人的相似度矩陣W,再去對於item進行遍歷,事實上mahout也是這樣做的。

相似度矩陣也許可以保留下來,這樣可以用來做譜聚類來驗證。

UserSimilarity 封裝了用戶之間的相似性

UserSimilarity similarity = new PearsonCorrelationSimilarity (model);

UserNeighborhood封裝了最相似的用戶組

UserNeighborhood neighborhood = new NearestNUserNeighborhood (2, similarity, model);

總而言之,用DataModel來生成data model,用UserSimilarity生成User-user之間的相似度矩陣,用戶的鄰居的定義用UserNeighborhood定義,推薦引擎使用Recommender實現。

對於推薦的評判是使用evaluator來進行評判

double score = evaluator.evaluate(recommenderBuilder, null, model, 0.95, 0.05);

用95%的數據構建模型,用5%的數據進行test

Fixed-size neighborhoods

對於到底用多少人作為用戶周圍的壹圈,我們事實上沒有壹個確定的值,就像做生物實驗壹樣需要不斷在特定的數據集裏跑出來。

Threshold-based neighborhood

當然,我們也可以定義個threshold去找出最相似的用戶群。

Threshold定義為-1到1(相似度矩陣返回的相似度就是在這個範圍)

new ThresholdUserNeighborhood(0.7, similarity, model)

我們對於各個算法做個簡單的比(吐)較(槽):

(假設我們是要像亞馬遜壹樣對商品做推薦,然後我們最終是要做top k的推薦)

Item based

壹般來說item-based要跑得快壹些,因為item比user少

Slop one

說實在話我覺得在對於壹些個人品味比較看重的東西上這個算法不是很靠譜

但是它在GroupLens 10 million數據的結果是0.65

當然,對於股票系統這種還是可取的

這個算法的假設是對於不同item的preference有種線性關系

不過slope-one有個好處是它的online算的很快,並且它的性能不由用戶的數量決定

在mahout中的調用方法是new SlopeOneRecommender(model)

這個方法提供了兩種weight:weighting based on count and on standard deviation

count 是越多的user的給越多的權重,對出的是壹個加權的平均數

standard deviation則是越低的deviation給予越高的權重

這兩個weight是默認采用的,當然disable它們只會讓結果變得稍微壞壹點0.67

不過這個算法有個很明顯的缺點是比較占內存

但是幸運的是我們可以把它存在數據庫裏:MySQLJDBCDataModel

Singular value decomposition–based recommenders

事實上,盡管SVD失去了壹些信息,但是有時候它可以改善推薦的結果。

這個過程在有用的方式平滑了輸入

new SVDRecommender(model, new ALSWRFactorizer(model, 10, 0.05, 10))

第壹個參數10是我們的目標屬性個數

第二個屬性是lambda->regularization

最後壹個參數是training step跑的次數

KnnItemBasedRecommender

囧,事實上這個是用的knn的方式來做的算法,和前面的選擇壹個threshold然後圈畫用戶的算法是比較像的

但是用knn代價是非常高的,因為它要去比較所有的items的對

ItemSimilarity similarity = new LogLikelihoodSimilarity(model);

Optimizer optimizer = new NonNegativeQuadraticOptimizer();

return new KnnItemBasedRecommender(model, similarity, optimizer, 10);

結果也還不算差,是0.76

Cluster-based recommendation

基於聚類的推薦可以說是基於用戶的推薦的算法的變體中最好的壹種思路

對於每壹個聚類裏面的用戶進行推薦

這個算法在推薦裏面是非常快的,因為什麽都事先算好了。

這個算法對於冷啟動還是挺不錯的

感覺mahout裏面用的聚類算法應該類似於Kmeans?

TreeClusteringRecommender

UserSimilarity similarity = new LogLikelihoodSimilarity(model);

ClusterSimilarity clusterSimilarity =

new FarthestNeighborClusterSimilarity(similarity);

return new TreeClusteringRecommender(model, clusterSimilarity, 10);

註意的是兩個cluster之間的相似度是用ClusterSimilarity來定義的

其中cluster之間的相似度還有NearestNeighborClusterSimilarity可選

吐槽:

對於算法的選擇,其實我們是要和我們要推薦的目標掛鉤的。為什麽最近學術界搞SVD那壹系的算法這麽火,什麽LDA,plsa各種算法層出不窮,事實上因為netflix的要求是要優化RMSE,在機器學習的角度來看,類似於回歸問題,而工業界的角度來說,我們壹般的需求是做top k的推薦,更加類似於分類問題。所以為什麽相比用SVD系列的算法,用item based這種更加ad hoc的算法要表現的更好壹些。當然2012年的KDD cup第壹名的組用的是item based+SVD的算法,這是後話。

那麽我就假設解我們這個top k的商品推薦的問題就用item based好了(速度快,結果又不算差),接下來就是確定相似度了。

相似度確定:

我們對於各個相似度做壹些比(吐)較(槽):

PearsonCorrelationSimilarity

Pearson correlation:

coeff = corr(X , Y);

function coeff = myPearson(X , Y)

% 本函數實現了皮爾遜相關系數的計算操作

%

% 輸入:

%   X:輸入的數值序列

%   Y:輸入的數值序列

%

% 輸出:

%   coeff:兩個輸入數值序列X,Y的相關系數

%

if length(X) ~= length(Y)

    error(‘兩個數值數列的維數不相等’);

    return;

end

fenzi = sum(X .* Y) – (sum(X) * sum(Y)) / length(X);

fenmu = sqrt((sum(X .^2) – sum(X)^2 / length(X)) * (sum(Y .^2) – sum(Y)^2 / length(X)));

coeff = fenzi / fenmu;

end %函數myPearson結束

當兩個變量的標準差都不為零時,相關系數才有定義,皮爾遜相關系數適用於:

(1)、兩個變量之間是線性關系,都是連續數據。

(2)、兩個變量的總體是正態分布,或接近正態的單峰分布。

(3)、兩個變量的觀測值是成對的,每對觀測值之間相互獨立。

1.沒有考慮到用戶偏好重合的items的數量

2,只有壹個item是相交錯的話是不能得到correlation的,對於比較稀疏或者小的數據集這是個要註意的問題。不過壹般來說兩個用戶之間只有壹個item重疊從直覺上來說也不那麽相似

Pearson correlation壹般出現在早期的推薦的論文和推薦的書裏,不過並不總是好的。

在mahout中使用了壹個增加的參數Weighting.WEIGHTED,適當使用可以改善推薦結果

EuclideanDistanceSimilarity

Return 1 / (1 + d)

CosineMeasureSimilarity

當two series of input values each have a mean of 0(centered)時和PearsonCorrelation是有相同結果的

所以在mahout中我們只要簡單的使用PearsonCorrelationSimilarity就好

Spearman correlation

這個方法用rank的方式,雖然失去了具體的打分信息,不過卻保留了item的order

Return的結果是-1和1兩個值,不過和pearson壹樣,對於只有壹個item重疊的也算不出。

而且這個算法比較慢,因為它要算和存儲rank的信息。所以paper多而實際用的少,對於小數據集才值得考慮

CachingUserSimilarity

UserSimilarity similarity = new CachingUserSimilarity(

new SpearmanCorrelationSimilarity(model), model);

Ignoring preference values in similarity with the Tanimoto coefficient

TanimotoCoefficientSimilarity

如果壹開始就有preference value,當數據中signal比noise多的時候可以用這個方法。

不過壹般來說有preference信息的結果要好。

log-likelihood

Log-likelihood try to access how unlikely 這些重疊的部分是巧合

結果的值可以解釋為他們的重合部分並不是巧合的概念

算法的結果可能比tanimoto要好,是壹個更加聰明的metric

Inferring preferences

對於數據量比較小的數據,pearson很難handle,比如壹個user只express壹個preference

於是要估計相似度麽………

AveragingPreferenceInferrer

setPreferenceInferrer().

不過這種辦法在實際中並不是有用的,只是在很早的paper中mention到

通過現在的信息來估計並不能增加什麽東西,並且很大的降低了計算速度

最終我們要通過實驗來比較上面的相似度,壹般來說是用準確率,召回率,覆蓋率評測。

這裏有壹篇Building Industrial-scale Real-world Recommender Systems

http://vdisk.weibo.com/s/rMSj-

寫netflex的,非常好,我就不獻醜多說了,所以上面只是吐槽下常見的算法和相似度。

其實算法按流派分是分為下面這些類別的,大家有興趣也可以了解下,我這裏就不多做介紹:

Similarity-based methods

Dimensionality Reduction Techniques

Dimensionality-based methods

Diffusion-based methods

Social fltering

Meta approaches

我上面所說的相似度和推薦算法,只能算是Similarity-based methods和Dimensionality Reduction Techniques裏的非常小的壹小部分,只當拋磚引玉了。

Ps:剛在豆瓣上問了下,他們說就用前兩種,事實上我也是覺得協同過濾+SVD 偶爾做做topic model就夠了 如果沒事幹再上點social trusted的東西

增加規則:

記得hulu在做presentation的時候說過“不能做規則定制的推薦系統不是壹個好的推薦系統”(好像是這樣吧……)事實上我們做出來的推薦的結果是需要做很多處理再展現給用戶的,這時候就是需要增加規則的時候了。

1.改善推薦效果:有些協同過濾的算法,做出來的結果不可避免的產生壹些讓人啼笑皆非的結果,比如用戶什麽都買,導致妳有可能跟姑娘們推薦的時候在佛祖下面推薦泳裝什麽的(真實的故事)。這時候就有兩種辦法,壹種就是調整模型,壹種就是增加規則做壹定的限制。再舉個常見的例子就是有時候會在推薦冬裝的時候出現夏裝什麽的,這時候壹般我的處理方式是給這種季節性商品做壹個隨時間的衰退。

2.增加廣告和導向:插入廣告,我們的最愛,這個就不多說了,靠規則。而所謂用戶喜歡的,其實不壹定就是最好的,比如用戶壹般來說就喜歡便宜的,還有什麽韓流爆款之流,如果妳推出來的東西都是這樣的,整個系統就變成洗剪吹大集合了,非常影響定位,這時候也要上規則。

3.做壹些數據挖掘和fighting spam的工作:這個在fighting spam的地方細說

可視化參數調整:

做完上面的工作,壹般來說推薦系統的基礎架構就差不多了,但是往往各個算法以及妳自己上的規則都有多如牛毛的參數要調整,這時候壹般要自己寫個測試腳本,將調整的結果可視化下壹下,我個人推薦的是highchart,看參數以及比較各個指標非常清爽, 還可以自己做壹些比如是取log之類的定制,很是方便。http://www.highcharts.com/

 

調整參數以及上線:

上線前有兩個事要做,壹般來說就是離線測試和AB test。

離線測試就是把數據抽樣壹部分,分為train data和test data,然後評估壹些準確率,召回率以及coverage之類的指標,用上面的可視化工具觀測比較下,感覺差不多了把pm叫過來讓她給小編們看看,看看審美和效果之類的。這是比較粗糙的,有的地方做的比較過細,還有用戶調研和請壹些人來實際使用,這是後話。

AB test也是大家最喜歡的地方了。因為說實在,評估推薦系統學術界是看準確率那壹些東西,但是工業界還是看pv uv轉化率這種實打實帶來效益的東西,而AB test就是評估這些的。我個人是比較推薦這種方法,說不上好,只是拋磚引玉,就是按壹般的做法先空跑壹個星期,然後再把系統上線實際做算法pk,然後選取的實驗用戶壹半的幾率進入原來的算法的推薦,壹半的幾率進入妳的算法的推薦,每天看看轉化率之間的比較,順便還可以調下參數做做實驗。如果算法穩定表現較好,就差不多了。

Fighting spam:

俗話說,有人的地方就有江湖,有推薦的地方就有人刷。刷子壹般分三種類型的:average random和nuke。壹般來說,average和random比較好對付,只要妳的系統魯棒性好點,基本影響不大。但是nuke的就非常煩,壹般來說有兩種思路解決,壹種是提高系統魯棒性,另外就是上規則。我們從這張圖看看兩種思路分布對應的解決效果:

 

其實魯棒性的系統做的就是把efficient attack的曲線降低,其實效果不算太好。

規則就是做到提前檢測,將危險扼殺在搖籃之中,就是做的藍色的那塊detectable的部分。

Fighting spam是個博大精深的問題,俗話說,與人鬥,其樂無窮,就是說的這個意思。

我們從規則說來,壹般來說規則可以放到最前面的數據收集和過濾的階段,比如在收集數據的時候看看這個人是否是多個賬號但是是壹個ip,或者有些人用戶名或者註冊郵箱有群體相似性質,或者有沒有出現pv等不正常的情況。有時候我們也可以從推薦的結果裏上規則來查,比如有些人刷的過火了,導致推薦結果出現壹些問題,我們就可以用叠代的方式按照先驗的刷子的比例來排出刷子排行榜之類的東西。這些都是經驗之談,上不了臺面,大家也可以自己摸索。

結束:

上面啰嗦了半天,大體上做壹個完整的簡單推薦系統就是涉及到上面這些步驟。壹些地方說的不夠詳細,有些是因為我懶,有些是不方便說。大家覺得我說的不對或者不妥的地方,可以直接在下面跟帖噴,或者有大大指導我也是很歡迎的,大家多交流經驗。我的郵箱是flclain@gmail.com 豆瓣是http://www.douban.com/people/45119625/ 有什麽問題也可以豆瓣或者郵件交流。

其實我是覺得,要是有個大大說“妳個傻缺,寫的狗屁不通,讓我來教妳我是怎麽做推薦的”就更好了。

發表在 推薦系統 | 留下評論

推薦系統中的常用算法

在推薦系統簡介中,我們給出了推薦系統的壹般框架。很明顯,推薦方法是整個推薦系統中最核心、最關鍵的部分,很大程度上決定了推薦系統性能的優劣。目前,主要的推薦方法包括:基於內容推薦、協同過濾推薦、基於關聯規則推薦、基於效用推薦、基於知識推薦和組合推薦。

壹、基於內容推薦

基 於內容的推薦(Content-based Recommendation)是信息過濾技術的延續與發展,它是建立在項目的內容信息上作出推薦的,而不需要依據用戶對項目的評價意見,更多地需要用機 器學習的方法從關於內容的特征描述的事例中得到用戶的興趣資料。在基於內容的推薦系統中,項目或對象是通過相關的特征的屬性來定義,系統基於用戶評價對象 的特征,學習用戶的興趣,考察用戶資料與待預測項目的相匹配程度。用戶的資料模型取決於所用學習方法,常用的有決策樹、神經網絡和基於向量的表示方法等。 基於內容的用戶資料是需要有用戶的歷史數據,用戶資料模型可能隨著用戶的偏好改變而發生變化。

基於內容推薦方法的優點是:
? 1)不需要其它用戶的數據,沒有冷開始問題和稀疏問題。
? 2)能為具有特殊興趣愛好的用戶進行推薦。
? 3)能推薦新的或不是很流行的項目,沒有新項目問題。
? 4)通過列出推薦項目的內容特征,可以解釋為什麽推薦那些項目。
? 5)已有比較好的技術,如關於分類學習方面的技術已相當成熟。

缺點是要求內容能容易抽取成有意義的特征,要求特征內容有良好的結構性,並且用戶的口味必須能夠用內容特征形式來表達,不能顯式地得到其它用戶的判斷情況。

二、協同過濾推薦

協 同過濾推薦(Collaborative Filtering Recommendation)技術是推薦系統中應用最早和最為成功的技術之壹。它壹般采用最近鄰技術,利用用戶的歷史喜好信息計算用戶之間的距離,然後 利用目標用戶的最近鄰居用戶對商品評價的加權評價值來預測目標用戶對特定商品的喜好程度,系統從而根據這壹喜好程度來對目標用戶進行推薦。協同過濾最大優 點是對推薦對象沒有特殊的要求,能處理非結構化的復雜對象,如音樂、電影。

協 同過濾是基於這樣的假設:為壹用戶找到他真正感興趣的內容的好方法是首先找到與此用戶有相似興趣的其他用戶,然後將他們感興趣的內容推薦給此用戶。其基本 思想非常易於理解,在日常生活中,我們往往會利用好朋友的推薦來進行壹些選擇。協同過濾正是把這壹思想運用到電子商務推薦系統中來,基於其他用戶對某壹內 容的評價來向目標用戶進行推薦。

基於協同過濾的推薦系統可以說是從用戶的角度來進行相應推薦的,而且是自動的,即用戶獲得的推薦是系統從購買模式或瀏覽行為等隱式獲得的,不需要用戶努力地找到適合自己興趣的推薦信息,如填寫壹些調查表格等。

和基於內容的過濾方法相比,協同過濾具有如下的優點:

  • 1) 能夠過濾難以進行機器自動內容分析的信息,如藝術品,音樂等。
  • 2) 共享其他人的經驗,避免了內容分析的不完全和不精確,並且能夠基於壹些復雜的,難以表述的概念(如信息質量、個人品味)進行過濾。
  • 3) 有推薦新信息的能力。可以發現內容上完全不相似的信息,用戶對推薦信息的內容事先是預料不到的。這也是協同過濾和基於內容的過濾壹個較大的差別,基於內容的過濾推薦很多都是用戶本來就熟悉的內容,而協同過濾可以發現用戶潛在的但自己尚未發現的興趣偏好。
  • 4) 能夠有效的使用其他相似用戶的反饋信息,較少用戶的反饋量,加快個性化學習的速度。

雖然協同過濾作為壹種典型的推薦技術有其相當的應用,但協同過濾仍有許多的問題需要解決。最典型的問題有稀疏問題(Sparsity)和可擴展問題(Scalability)。

三、基於關聯規則推薦

基 於關聯規則的推薦(Association Rule-based Recommendation)是以關聯規則為基礎,把已購商品作為規則頭,規則體為推薦對象。關聯規則挖掘可以發現不同商品在銷售過程中的相關性,在零 售業中已經得到了成功的應用。管理規則就是在壹個交易數據庫中統計購買了商品集X的交易中有多大比例的交易同時購買了商品集Y,其直觀的意義就是用戶在購 買某些商品的時候有多大傾向去購買另外壹些商品。比如購買牛奶的同時很多人會同時購買面包。

算法的第壹步關聯規則的發現最為關鍵且最耗時,是算法的瓶頸,但可以離線進行。其次,商品名稱的同義性問題也是關聯規則的壹個難點。

四、基於效用推薦

基 於效用的推薦(Utility-based Recommendation)是建立在對用戶使用項目的效用情況上計算的,其核心問題是怎麽樣為每壹個用戶去創建壹個效用函數,因此,用戶資料模型很大 程度上是由系統所采用的效用函數決定的。基於效用推薦的好處是它能把非產品的屬性,如提供商的可靠性(Vendor Reliability)和產品的可得性(Product Availability)等考慮到效用計算中。

五、基於知識推薦

基 於知識的推薦(Knowledge-based Recommendation)在某種程度是可以看成是壹種推理(Inference)技術,它不是建立在用戶需要和偏好基礎上推薦的。基於知識的方法因 它們所用的功能知識不同而有明顯區別。效用知識(Functional Knowledge)是壹種關於壹個項目如何滿足某壹特定用戶的知識,因此能解釋需要和推薦的關系,所以用戶資料可以是任何能支持推理的知識結構,它可以 是用戶已經規範化的查詢,也可以是壹個更詳細的用戶需要的表示。

六、組合推薦

由 於各種推薦方法都有優缺點,所以在實際中,組合推薦(Hybrid Recommendation)經常被采用。研究和應用最多的是內容推薦和協同過濾推薦的組合。最簡單的做法就是分別用基於內容的方法和協同過濾推薦方法 去產生壹個推薦預測結果,然後用某方法組合其結果。盡管從理論上有很多種推薦組合方法,但在某壹具體問題中並不見得都有效,組合推薦壹個最重要原則就是通 過組合後要能避免或彌補各自推薦技術的弱點。

在組合方式上,有研究人員提出了七種組合思路:

  • 1)加權(Weight):加權多種推薦技術結果。
  • 2)變換(Switch):根據問題背景和實際情況或要求決定變換采用不同的推薦技術。
  • 3)混合(Mixed):同時采用多種推薦技術給出多種推薦結果為用戶提供參考。
  • 4)特征組合(Feature combination):組合來自不同推薦數據源的特征被另壹種推薦算法所采用。
  • 5)層疊(Cascade):先用壹種推薦技術產生壹種粗糙的推薦結果,第二種推薦技術在此推薦結果的基礎上進壹步作出更精確的推薦。
  • 6)特征擴充(Feature augmentation):壹種技術產生附加的特征信息嵌入到另壹種推薦技術的特征輸入中。
  • 7)元級別(Meta-level):用壹種推薦方法產生的模型作為另壹種推薦方法的輸入。

七、主要推薦方法的對比

各種推薦方法都有其各自的優點和缺點,見表1。

 

表1 主要推薦方法對比
推薦方法
優點
缺點
基於內容推薦
推薦結果直觀,容易解釋;
不需要領域知識
稀疏問題;新用戶問題;
復雜屬性不好處理;
要有足夠數據構造分類器
協同過濾推薦
新異興趣發現、不需要領域知識;
隨著時間推移性能提高;
推薦個性化、自動化程度高;
能處理復雜的非結構化對象
稀疏問題;
可擴展性問題;
新用戶問題;
質量取決於歷史數據集;
系統開始時推薦質量差;
基於規則推薦
能發現新興趣點;
不要領域知識
規則抽取難、耗時;
產品名同義性問題;
個性化程度低;
基於效用推薦
無冷開始和稀疏問題;
對用戶偏好變化敏感;
能考慮非產品特性
用戶必須輸入效用函數;
推薦是靜態的,靈活性差;
屬性重疊問題;
基於知識推薦
能把用戶需求映射到產品上;
能考慮非產品屬性
知識難獲得;
推薦是靜態的
發表在 推薦系統 | 標簽為 | 留下評論

推薦系統相關算法(1):SVD

1. SVD簡介

假如要預測Zero君對壹部電影M的評分,而手上只有Zero君對若幹部電影的評分和風炎君對若幹部電影的評分(包含M的評分)。那麽能預測出Zero君對M的評分嗎?答案顯然是能。最簡單的方法就是直接將預測分定為平均分。不過這時的準確度就難說了。本文將介紹壹種比這個最簡單的方法要準上許多,並且也不算復雜的算法。
SVD(Singular Value Decomposition)的想法是根據已有的評分情況,分析出評分者對各個因子的喜好程度以及電影包含各個因子的程度,最後再反過來根據分析結果預測評分。電影中的因子可以理解成這些東西:電影的搞笑程度,電影的愛情愛得死去活來的程度,電影的恐怖程度。。。。。。SVD的想法抽象點來看就是將壹個N行M列的評分矩陣R(R[u][i]代表第u個用戶對第i個物品的評分),分解成壹個N行F列的用戶因子矩陣P(P[u][k]表示用戶u對因子k的喜好程度)和壹個M行F列的物品因子矩陣Q(Q[i][k]表示第i個物品的因子k的程度)。用公式來表示就是
R = P * T(Q)               //T(Q)表示Q矩陣的轉置

下面是將評分矩陣R分解成用戶因子矩陣P與物品因子矩陣Q的壹個例子。R的元素數值越大,表示用戶越喜歡這部電影。P的元素數值越大,表示用戶越喜歡對應的因子。Q的元素數值越大,表示物品對應的因子程度越高。分解完後,就能利用P,Q來預測Zero君對《七夜》的評分了。按照這個例子來看,Zero君應該會給《七夜》較低的分數。因為他不喜歡恐怖片。註意不要糾結圖中的具體數值,因為那些數值是我隨便填上去的。

實際上,我們給壹部電影評分時,除了考慮電影是否合自己口味外,還會受到自己是否是壹個嚴格的評分者和這部電影已有的評分狀況影響。例如:壹個嚴格評分者給的分大多數情況下都比壹個寬松評分者的低。妳看到這部電影的評分大部分較高時,可能也傾向於給較高的分。在SVD中,口味問題已經有因子來表示了,但是剩下兩個還沒有相關的式子表示。因此有必要加上相關的部分,提高模型的精準度。改進後的SVD的公式如下:
R = OverallMean + biasU + biasI + P * T(Q)    (1)
其中OverallMean表示所有電影的平均分,biasU表示用戶評分偏離OverallMean的程度,biasI表示電影評分偏離OverallMean的程度,P,Q意思不變。特別註意,這裏除了OverallMean之後,其它幾個都是矩陣。

分解完後,即(1)式中的五個參數都有了正確的數值後,就可以用來預測分數了。假設我們要預測用戶u對電影i的評分:

bu表示第u個用戶的偏離程度,bi表示第i部電影的偏離程度,pu表示第u個用戶的因子愛好程度,qi表示第i部電影的因子程度。

 

2. SVD實現

在第壹部分的例子中,妳也許會有疑問:明明評分矩陣有壹個元素的值是空的,為什麽還能得到兩個完整的矩陣P和Q呢?原因是那兩個矩陣是通過學習(learning)得到的。SVD使用隨機梯度下降(stochastic gradient descent)學習(1)式中除了OverallMean之外的參數。學習過程可以概括成這樣:先給各個參數壹個初值,然後利用這些參數進行預測,並將預測結果與已知評分進行對比,最後根據對比結果修正各個參數。更準確點的說法是調整參數的值,使得以下式子能取到最小值:

ALPHA表示所有訓練樣本。被第壹個圓括號括著的部分表示當前的預測結果與實際值的偏差。被第二個圓括號括著的部分是為了防止過擬合(overfitting)。

以上就是SVD實現時的主要思想了,至於具體實現可以參考我的代碼。這個實現版本在movielens 1M上的效果比《A Guide to Singular Value Decomposition for Collaborative Filtering》中提到的要好壹點點。這裏,我主要提壹下實現SVD時要註意的地方:
a. 更新qi時,要先保存
b. 預測分數時,範圍要限制在最小值和最大值內

此外,這是我找到的壹些有用的建議:
a. 所有參數的regularization 值是壹樣的,不用特別區分bu, bi和 p,q
b. bu, bi不需要初始化,全部設成0
c. P,Q應該的初始化,壹般使用  0.1 * rand(0,1) / sqrt(dim)  dim指特征的維數

 

3. 擴展閱讀

下面的幾篇文章盡管是英文的,但對SVD的講解非常好,強烈推薦給對SVD感興趣的人。

1. Netflix Update: Try This at Home

2. A Guide to Singular Value Decomposition for Collaborative Filtering

3. Matrix Factorization Techniques for Recommender Systems

發表在 推薦系統 | 標簽為 | 留下評論

Meanshift,聚類算法

Mean Shift算法,壹般是指壹個叠代的步驟,即先算出當前點的偏移均值,移動該點到其偏移均值,然後以此為新的起始點,繼續移動,直到滿足壹定的條件結束.

 1. Meanshift推導

給定d維空間Rd的n個樣本點 ,i=1,…,n,在空間中任選壹點x,那麽Mean Shift向量的基本形式定義為:

Sk是壹個半徑為h的高維球區域,滿足以下關系的y點的集合,

k表示在這n個樣本點xi中,有k個點落入Sk區域中.

以上是官方的說法,即書上的定義,我的理解就是,在d維空間中,任選壹個點,然後以這個點為圓心,h為半徑做壹個高維球,因為有d維,d可能大於2,所以是高維球。落在這個球內的所有點和圓心都會產生壹個向量,向量是以圓心為起點落在球內的點位終點。然後把這些向量都相加。相加的結果就是Meanshift向量。

如圖所以。其中黃色箭頭就是Mh(meanshift向量)。

再以meanshift向量的終點為圓心,再做壹個高維的球。如下圖所以,重復以上步驟,就可得到壹個meanshift向量。如此重復下去,meanshift算法可以收斂到概率密度最大得地方。也就是最稠密的地方。

最終的結果如下:

Meanshift推導:

把基本的meanshift向量加入核函數,核函數的性質在這篇博客介紹:

那麽,meanshift算法變形為

(1)

解釋壹下K()核函數,h為半徑,Ck,d/nh為單位密度,要使得上式f得到最大,最容易想到的就是對上式進行求導,的確meanshift就是對上式進行求導.

(2)

令:

K(x)叫做g(x)的影子核,名字聽上去聽深奧的,也就是求導的負方向,那麽上式可以表示

對於上式,如果才用高斯核,那麽,第壹項就等於fh,k

第二項就相當於壹個meanshift向量的式子:

那麽(2)就可以表示為

下圖分析的構成,如圖所以,可以很清晰的表達其構成。

要使得=0,當且僅當=0,可以得出新的圓心坐標:

(3)

 

上面介紹了meanshift的流程,但是比較散,下面具體給出它的算法流程。

  1. 選擇空間中x為圓心,以h為半徑為半徑,做壹個高維球,落在所有球內的所有點xi
  2. 計算,如果<ε(人工設定),推出程序。如果>ε, 則利用(3)計算x,返回1.

 

2.meanshift在圖像上的聚類:

真正大牛的人就能創造算法,例如像meanshift,em這個樣的算法,這樣的創新才能推動整個學科的發展。還有的人就是把算法運用的實際的運用中,推動整個工業進步,也就是技術的進步。下面介紹meashift算法怎樣運用到圖像上的聚類核跟蹤。

壹般壹個圖像就是個矩陣,像素點均勻的分布在圖像上,就沒有點的稠密性。所以怎樣來定義點的概率密度,這才是最關鍵的。

如果我們就算點x的概率密度,采用的方法如下:以x為圓心,以h為半徑。落在球內的點位xi   定義二個模式規則。

(1)x像素點的顏色與xi像素點顏色越相近,我們定義概率密度越高。

(2)離x的位置越近的像素點xi,定義概率密度越高。

所以定義總的概率密度,是二個規則概率密度乘積的結果,可以(4)表示

(4)

其中:代表空間位置的信息,離遠點越近,其值就越大,表示顏色信息,顏色越相似,其值越大。如圖左上角圖片,按照(4)計算的概率密度如圖右上。利用meanshift對其聚類,可得到左下角的圖。

 

發表在 算法分析 | 標簽為 | 留下評論