❶ 聚類分析(cluster analysis)
我們這里來看看聚類分析。
比較流行的有聚類方法有k均值聚類,屬於分割式聚類的方法。
K-Means演算法的思想很簡單,對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大。目的是最小化E=sum(x-\miu_i), 其中\miu_i是每個簇的均值。
直接求上式的最小值並不容易,這是一個NP難的問題,因此採用啟發式的迭代方法K-Means。
K-Means很簡單,用下面一組圖就可以形象的描述。上圖a表達了初始的數據集,假設k=3。在圖b中,我們隨機選擇了三個k類所對應的類別質心,即圖中的紅綠和草綠色質心,然後分別求樣本中所有點到這三個質心的距離,並標記每個樣本的類別為和該樣本距離最小的質心的類別,如圖c所示,經過計算樣本和紅綠和草綠色質心的距離,我們得到了所有樣本點的第一輪迭代後的類別。此時我們對我們當前標記為紅綠和草綠色點分別求襲埋其新的質心,重復了這個過程,將所有點的類別標記為距離最近的質心的類別並求新的質心。最終我們得到的三個類別如圖。
首先我們看看K-Means演算法的一些要點。
1 對於K-Means演算法,首先要注意的是k值的選擇,一般來說,我們會根據對數據的先驗經驗選擇一個合適的k值,如果沒有什麼先驗知識,則可以通過交叉驗證選擇一個合適的k值。
2 在確定了k的個數後,我們需要選擇k個初始化的質心,就像上圖b中的隨機質心。由於我們是啟發式方法,k個初始化的質心的位置選擇對最後的聚類結果和運行時間都有很大的影響,因此需要選擇合適的k個質心,最好這些質心不能太近。
傳統的K-Means演算法流程。
輸入樣本集合,然後劃分成k 人為分類,憑經驗將樣品進行初步的分類
選擇凝聚點後,求均值,求距離,歸類
更新質心
重新求均值和距離,再重新歸類
大樣本優化Mini Batch K-Means
在統的K-Means演算法中,要計算所有的樣本點到所有的質心的距離。如果樣本量非常大,比如達到10萬以上,特徵有100以上,此時用傳統的K-Means演算法非常的耗時,就算加上elkan K-Means優化也依舊。在大數據時代,這樣的場景越來越多。此時Mini Batch K-Means應運而生。
顧名思義,Mini Batch,也就是用樣本集中的一部分的樣本來做傳統的K-Means,這樣可以避免樣本量太大時的計算難題,演算法收斂速度大大加快。當然此時的代價就是我們的聚類的精確度也會洞伏有一些降低。一般來說這個降低的幅度在可以接受的范圍之內。
在Mini Batch K-Means中,我們會選擇一個合適的批樣本大小batch size,我們僅僅用batch size個樣本來做K-Means聚類。那麼這batch size個樣本怎麼來的?一般是通過無放回的隨機采樣得到的。
為了增加演算法的准確性,我們一般會多跑幾次Mini Batch K-Means演算法,用得到不同的隨機采樣集來得到聚類簇,選擇其中最優的聚類簇。
K-Means與KNN
K-Means是無監督學習的聚類演算法,沒有樣本輸出;而KNN是監督學習的分類演算法,有對應的類別輸出。KNN基本不需要訓練,對測試集裡面的點,只需要找到在訓練集中最近的k個點,用這最近的k個點的類別來決定測試點的類別。而K-Means則有明顯的訓練過程,找到k個類別的最佳質心,從而決定樣本的簇類別。
兩者也有一些相似點,兩個演算法都包含一個過程,即找出和某一個點最近的點。兩者都利用了最近鄰(nearest neighbors)的思想。
KNN(K-NearestNeighbor)分類演算法是數據挖掘分類技術中最簡單的方法之一。所謂K最近鄰,就是K個最近的鄰居的意思,說的是每個樣本都可以用它最接近的K個鄰近值來代表。近鄰演算法就是將數據集合中每一個記錄進行分類的方法。
總體來說,KNN分類演算法包括以下4個步驟:
1准備數據,對數據進行預處理
2計算測試樣本點(也就是待分類點)到其他每個樣本點的距離
3對每個距離進行排序,然後選擇出距離最小的K個點
4對K個點所屬的類別進行比較,根據少數服從多數的原則,將測試樣本點歸入在K個點中佔比最高的那一類
該演算法在分類時有個主要納禪攜的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數 , 該方法的另一個不足之處是計算量較大,因為對每一個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點 。
K-Means小結
K-Means的主要優點有:
1)原理比較簡單,實現也是很容易,收斂速度快。
2)聚類效果較優。
3)演算法的可解釋度比較強。
4)主要需要調參的參數僅僅是簇數k。
K-Means的主要缺點有:
1)K值的選取不好把握
2)對於不是凸的數據集比較難收斂
3)如果各隱含類別的數據不平衡,比如各隱含類別的數據量嚴重失衡,或者各隱含類別的方差不同,則聚類效果不佳。
4) 採用迭代方法,得到的結果只是局部最優。
5) 對噪音和異常點比較的敏感。
PAM演算法。 PAM法和K-means法很相似,但是它保證跑出來你的數據是最優的,和k-means不一樣的是,雖然它也隨機選擇群中心,但是群中心的選擇並非虛擬的,而是選取真正的數據點作為群中心。比如一開始選擇3和20兩個點作為群中心,並得到SS值。然後用不同的點去替換3或者20,選擇最小SS值的點作為新的群中心,依次類推,直到SS值不能進一步優化。然後根據最後的群中心去聚類。PAM演算法能夠處理非數值類型的欄位,但是其效率很慢,難以處理大數據量的情況。
除了分割聚類的方法,還有階層式聚類的方法。我們看看ward方法。
華德法( Ward』s Method ): 華德法是階層式聚類分析法中效果最好的,但是其運算速度較慢。理論差平方是判斷聚類效果好不好的一個指標(每個資料點同群中心距離的平方和),其計算方式如下,SS值最小則說明聚類效果最好。華德法採用了一個取巧的方法,保證效果最好,仍然以上述例子示範。第一次聚類(聚成4類)有十種可能性,選擇AB使得SS值最小,第二次(聚成3類)選擇DE使得SS最小,第三次(聚成2類)選擇CDE使得SS最小,直到聚成一類。
聚類分析是非常有用的,比如在公司可以給客戶分類,或者說客戶畫像。如何了解用戶的需求,把握用戶的期望,對迅速對用戶作出精準的投放這些手段已經成為企業能否的關鍵了。
某移動運營商在5月發展了19999個新用戶,在新用戶入網後一個月後,1、希望通過提供一些優惠提高用戶的忠誠度 2、希望通過推薦一些產品提升客單價。
為達到這一目的,我們需要對新用戶進行洞察,弄清楚以下的問題: a、應該給客戶提供什麼優惠? 我們的優惠能否給客戶帶來驚喜?不同的客戶是否該根據他們的喜好提供不同的優惠?b、客戶對我們的什麼產品感興趣?不同的客戶是否應該推薦不同的產品?
這個時候就可以使用聚類分析。
❷ 八:聚類演算法K-means(20191223-29)
學習內容:無監督聚類演算法K-Means
k-means:模型原理、收斂過程、超參數的選擇
聚類分析是在數據中發現數據對象之間的關系,將數據進行分組,組內的相似性越大,組間的差別越大,則聚類效果越好。
不同的簇類型: 聚類旨在發現有用的對象簇,在現實中我們用到很多的簇的類型,使用不同的簇類型劃分數據的結果是不同的。
基於原型的: 簇是對象的集合,其中每個對象到定義該簇的 原型 的距離比其他簇的原型距離更近,如(b)所示的原型即為中心點,在一個簇中的數據到其中心點比到另一個簇的中心點更近。這是一種常見的 基於中心的簇 ,最常用的K-Means就是這樣的一種簇類型。 這樣的簇趨向於球形。
基於密度的 :簇是對象的密度區域,(d)所示的是基於密度的簇,當簇不規則或相互盤繞,並且有早上和離群點事,常常使用基於密度的簇定義。
關於更多的簇介紹參考《數據挖掘導論》。
基本的聚類分析演算法
1. K均值: 基於原型的、劃分的距離技術,它試圖發現用戶指定個數(K)的簇。
2. 凝聚的層次距離: 思想是開始時,每個點都作為一個單點簇,然後,重復的合並兩個最靠近的簇,直到嘗試單個、包含所有點的簇。
3. DBSCAN: 一種基於密度的劃分距離的演算法,簇的個數有演算法自動的確定,低密度中的點被視為雜訊而忽略,因此其不產生完全聚類。
不同的距離量度會對距離的結果產生影響,常見的距離量度如下所示:
優點:易於實現
缺點:可能收斂於局部最小值,在大規模數據收斂慢
演算法思想:
選擇K個點作為初始質心
repeat
將每個點指派到最近的質心,形成K個簇
重新計算每個簇的質心
until 簇不發生變化或達到最大迭代次數
這里的「重新計算每個簇的質心」,是根據目標函數來計算的,因此在開始時要考慮 距離度量和目標函數。
考慮歐幾里得距離的數據,使用 誤差平方和(Sum of the Squared Error,SSE) 作為聚類的目標函數,兩次運行K均值產生的兩個不同的簇集,使用SSE最小的那個。
k表示k個聚類中心,ci表示第幾個中心,dist表示的是歐幾里得距離。
這里有一個問題就是為什麼,我們更新質心是讓所有的點的平均值,這里就是SSE所決定的。
k均值演算法非常簡單且使用廣泛,但是其有主要的兩個缺陷:
1. K值需要預先給定 ,屬於預先知識,很多情況下K值的估計是非常困難的,對於像計算全部微信用戶的交往圈這樣的場景就完全的沒辦法用K-Means進行。對於可以確定K值不會太大但不明確精確的K值的場景,可以進行迭代運算,然後找出Cost Function最小時所對應的K值,這個值往往能較好的描述有多少個簇類。
2. K-Means演算法對初始選取的聚類中心點是敏感的 ,不同的隨機種子點得到的聚類結果完全不同
3. K均值演算法並不是很所有的數據類型。 它不能處理非球形簇、不同尺寸和不同密度的簇,銀冠指定足夠大的簇的個數是他通常可以發現純子簇。
4. 對離群點的數據進行聚類時,K均值也有問題 ,這種情況下,離群點檢測和刪除有很大的幫助。
下面對初始質心的選擇進行討論:
當初始質心是隨機的進行初始化的時候,K均值的每次運行將會產生不同的SSE,而且隨機的選擇初始質心結果可能很糟糕,可能只能得到局部的最優解,而無法得到全局的最優解。
多次運行,每次使用一組不同的隨機初始質心,然後選擇一個具有最小的SSE的簇集。該策略非常的簡單,但是效果可能不是很好,這取決於數據集合尋找的簇的個數。
關於更多,參考《數據挖掘導論》
為了克服K-Means演算法收斂於局部最小值的問題,提出了一種 二分K-均值(bisecting K-means)
將所有的點看成是一個簇
當簇小於數目k時
對於每一個簇
計算總誤差
在給定的簇上進行K-均值聚類,k值為2 計算將該簇劃分成兩個簇後總誤差
選擇是的誤差最小的那個簇進行劃分
在原始的K-means演算法中,每一次的劃分所有的樣本都要參與運算,如果數據量非常大的話,這個時間是非常高的,因此有了一種分批處理的改進演算法。
使用Mini Batch(分批處理)的方法對數據點之間的距離進行計算。
Mini Batch的好處:不必使用所有的數據樣本,而是從不同類別的樣本中抽取一部分樣本來代表各自類型進行計算。n 由於計算樣本量少,所以會相應的減少運行時間n 但另一方面抽樣也必然會帶來准確度的下降。
聚類試圖將數據集中的樣本劃分為若干個通常是不相交的子集,每個子集成為一個「簇」。通過這樣的劃分,每個簇可能對應於一些潛在的概念(也就是類別);需說明的是,這些概念對聚類演算法而言事先是未知的,聚類過程僅能自動形成簇結構,簇對應的概念語義由使用者來把握和命名。
聚類是無監督的學習演算法,分類是有監督的學習演算法。所謂有監督就是有已知標簽的訓練集(也就是說提前知道訓練集里的數據屬於哪個類別),機器學習演算法在訓練集上學習到相應的參數,構建模型,然後應用到測試集上。而聚類演算法是沒有標簽的,聚類的時候,需要實現的目標只是把相似的東西聚到一起。
聚類的目的是把相似的樣本聚到一起,而將不相似的樣本分開,類似於「物以類聚」,很直觀的想法是同一個簇中的相似度要盡可能高,而簇與簇之間的相似度要盡可能的低。
性能度量大概可分為兩類: 一是外部指標, 二是內部指標 。
外部指標:將聚類結果和某個「參考模型」進行比較。
內部指標:不利用任何參考模型,直接考察聚類結果。
對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大
初學者會很容易就把K-Means和KNN搞混,其實兩者的差別還是很大的。
K-Means是無監督學習的聚類演算法,沒有樣本輸出;而KNN是監督學習的分類演算法,有對應的類別輸出。KNN基本不需要訓練,對測試集裡面的點,只需要找到在訓練集中最近的k個點,用這最近的k個點的類別來決定測試點的類別。而K-Means則有明顯的訓練過程,找到k個類別的最佳質心,從而決定樣本的簇類別。
當然,兩者也有一些相似點,兩個演算法都包含一個過程,即找出和某一個點最近的點。兩者都利用了最近鄰(nearest neighbors)的思想。
優點:
簡單, 易於理解和實現 ;收斂快,一般僅需5-10次迭代即可,高效
缺點:
1,對K值得選取把握不同對結果有很大的不同
2,對於初始點的選取敏感,不同的隨機初始點得到的聚類結果可能完全不同
3,對於不是凸的數據集比較難收斂
4,對噪點過於敏感,因為演算法是根據基於均值的
5,結果不一定是全局最優,只能保證局部最優
6,對球形簇的分組效果較好,對非球型簇、不同尺寸、不同密度的簇分組效果不好。
K-means演算法簡單理解,易於實現(局部最優),卻會有對初始點、雜訊點敏感等問題;還容易和監督學習的分類演算法KNN混淆。
參考閱讀:
1.《 深入理解K-Means聚類演算法 》
2.《 K-Means 》
❸ 聲紋識別 | 快速概覽 + 了解N:N聚類演算法是如何應用的
關於聲紋識別的N:N聚類演算法
本文將從如下方面為你一一解讀:
聲紋(Voiceprint),是用電聲學儀器顯示的攜帶言語信息的聲波頻譜,是由波長、頻率以及強度等百餘種特徵維度組成的生物特徵,具有穩定性、可測量性、唯一性等特點。
人類語言的產生是人體語言中樞與發音器官之間一個復雜的生理物理過程,發聲器官--舌、牙齒、喉頭、肺、鼻腔在尺寸和形態方面每個人的差異很大,所以任何兩個人的聲紋圖譜都有差異。每個人的語音聲學特徵既有相對穩定性,又有變異性,不是一成不變的。這種變異可來自生理、病理、心理、模擬、偽裝,也與環境干擾有關。盡管如此,由於每個人的發音器官都不盡相同,因此在一般情況下,人們仍能區別不同的人的聲音或判斷是否是同一人的聲音。
1. 1:1 說話人確認
1:1 說話人確認是確認說話人身份的方法,針對「對於同樣的文本內容,有兩段錄音,這兩段錄音到底是不是出自一人之口」這樣的問題,也就是「兩句話到底是不是一個人說「的問題;該類場景相對簡單,主要應用於用戶的注冊和驗證,以及APP內的聲紋核身;
2. 1:N 說話人確認
1:N說話人辨認是辨認說話人身份的方法,針對「對於一段語音,需要迅速在樣本庫中進行搜尋比對,以確認這段語音與樣本庫中哪段語音相似度最高」,也就是說「給定的一段語音屬於樣本庫中誰說的」的問題;該類場景比較常見,主要應用於黑名單用戶進線檢測,提高安防能力等。
3. N:N說話人聚類
對於千億級別的無標簽錄音文件,如何做有效的處理?舉個例子,假如說你有很多的語音片段(語音的文本內容是相同的),這些語音片段分別歸屬於甲乙丙丁等人,僅憑人耳辨識是無法分辨出哪些語音片段屬於甲,哪些語音片段屬於乙,通過N:N聚類的演算法,進行聲紋的相似度檢測,將屬於同一個人說話的語音片段不斷進行合並歸類,最後屬於甲說話的語音片段全部被歸為一類,屬於乙說話的語音片段全部被歸為一類,以此類推,類內語音的相似度極高,類間語音的相似度較低,達到將這些語音片段分人整理的目的;
簡單介紹一下聚類分析:聚類分析是根據在數據中發現的描述對象及其關系的信息,將數據對象分組。目的是,組內的對象相互之間是相似的(相關的),而不同組中的對象是不同的(不相關的)。組內相似性越大,組間差距越大,說明聚類效果越好。聚類效果的好壞依賴於兩個因素:1.衡量距離的方法(distance measurement) 2.聚類演算法(algorithm)
目前主流的說話人聚類演算法是在說話人分割的基礎上,基於貝葉斯信息判據,採用凝聚分層聚類演算法,直接對說話人分割後的語音段進行判決,將屬於同一個說話人的語音段合並為一類。其基本思想是從每個語片段中提取特徵參數,例如梅爾倒譜參數,計算每兩個語音段之間特徵參數的相似度,並利用BIC判斷相似度最高的兩個語音段是否合並為同一類。對任意兩段語音都進行上述判決,直到所有的語音段不再合並。 ---摘自「說話人聚類的初始類生成方法」
聚類&聲紋識別的主要場景 :在跨渠道,跨場景收集語音同時建立聲紋庫的時候,由於各場景應用的客戶賬號或許不同,說話人在不同場景中分別注冊過聲紋,難以篩除重復注冊語音,建立統一聲紋庫;我們如何快速的去篩除屬於某一個人在不同情況下錄制的多條錄音文件?也就是如何保證最終留下的錄音文件(聲紋庫)是唯一的?每一個人只對應一條音頻,這就要用到聚類的演算法;利用聲紋識別N:N說話人聚類,對所有收集到的語音進行語音相似度檢測,將同一說話人在不同場景中的多次錄制的語音篩選出來,並只保留其中一條,從而保證了聲紋庫的獨特性,節省了大量的人力成本,資源成本。
對於目前的場景,我們選擇 凝聚層次聚類演算法 ,在這種場景下,我們是要篩除重復人說話,那麼我們可以將每一個錄音文件都當作一個獨立的數據點,看最後有凝聚出多少個獨立的數據簇,此時可以理解為類內都是同一個人在說話;
1. 我們首先將每個數據點(每一條錄音文件)視為一個單一的類,即如果我們的數據集中有 X 個數據點,那麼我們就有 X 個類。然後,我們選擇一個測量兩個類之間距離的距離度量標准。作為例子,我們將用 average linkage,它將兩個類之間的距離定義為第一個類中的數據點與第二個類中的數據點之間的平均距離。 (這個距離度量標准可以選擇其他的)
2. 在每次迭代中,我們將兩個類合並成一個。這兩個要合並的類應具有最小的 average linkage。即根據我們選擇的距離度量標准,這兩個類之間的距離最小,因此是最相似的,應該合並在一起。
3. 重復步驟 2 直到我們到達樹根,即我們只有一個包含所有數據點的類。這樣我們只需要選擇何時停止合並類,即何時停止構建樹,來選擇最終需要多少個類--- 摘自知乎
按照實際的場景,如果我們最終要得到1000個不重復的錄音文件,為了防止過度合並,定義的退出條件是最後想要得到的錄音文件數目;
1. 錄音重放攻擊 : 攻擊者錄制目標說話人的語音進行播放,以目標人身份試圖通過聲紋識別系統的認證。
策略:基於隨機內容聲紋的檢測技術:利用隨機數字的不確定性,用戶在規定的時間內(5-10S)需要念出指定的隨機內容,如果超時,則隨機內容更新; 因為對於錄音重放的內容是固定的,很不靈活,所以比較容易做限制
2. 波形拼接攻擊
攻擊者將目標說話人的語音錄制下來,通過波形編輯工具,拼接出指定內容的語音數據,以放音的方式假冒目標說話人,試圖以目標人身份通過聲紋識別系統的認證。
策略:同錄音重放
3.語音合成攻擊
攻擊者用語音合成技術生成目標說話人的語音,以放音的方式假冒目標說話人,試圖以目標人的身份通過聲紋識別系統的認證。
策略:1. 同錄音重放
2. 利用活體檢測技術,加強演算法的識別度
❹ 聚類演算法的演算法用途
聚類的用途是很廣泛的。
在商業上,聚類可以幫助市場分析人員從消費者資料庫中區分出不同的消費群體來,並且概括出每一類消費者的消費模式或者說習慣。它作為數據挖掘中的一個模塊,可以作為一個單獨的工具以發現資料庫中分布的一些深層的信息,並且概括出每一類的特點,或者把注意力放在某一個特定的類上以作進一步的分析;並且,聚類分析也可以作為數據挖掘演算法中其他分析演算法的一個預處理步驟。
聚類分析的演算法可以分為劃分法(Partitioning Methods)、層次法(Hierarchical Methods)、基於密度的方法(density-based methods)、基於網格的方法(grid-based methods)、基於模型的方法(Model-Based Methods)。