① python怎麼用sklearn包進行聚類
#-*-coding:utf-8-*-
fromsklearn.clusterimportKMeans
fromsklearn.externalsimportjoblib
importnumpy
final=open('c:/test/final.dat','r')
data=[line.strip().split(' ')forlineinfinal]
feature=[[float(x)forxinrow[3:]]forrowindata]
#調用kmeans類
clf=KMeans(n_clusters=9)
s=clf.fit(feature)
prints
#9個中心
printclf.cluster_centers_
#每個樣本所屬的簇
printclf.labels_
#用來評估簇的個數是否合適,距離越小說明簇分的越好,選取臨界點的簇個數
printclf.inertia_
#進行預測
printclf.predict(feature)
#保存模型
joblib.mp(clf,'c:/km.pkl')
#載入保存的模型
clf=joblib.load('c:/km.pkl')
'''
#用來評估簇的個數是否合適,距離越小說明簇分的越好,選取臨界點的簇個數
foriinrange(5,30,1):
clf=KMeans(n_clusters=i)
s=clf.fit(feature)
printi,clf.inertia_
'''
② 如何使用sklearn k-mean對數據進行聚類分析
#-*-coding:utf-8-*-
fromsklearn.clusterimportKMeans
fromsklearn.externalsimportjoblib
importnumpy
final=open('c:/test/final.dat','r')
data=[line.strip().split(' ')forlineinfinal]
feature=[[float(x)forxinrow[3:]]forrowindata]
#調用kmeans類
clf=KMeans(n_clusters=9)
s=clf.fit(feature)
prints
#9個中心
printclf.cluster_centers_
#每個樣本所屬的簇
printclf.labels_
#用來評估簇的個數是否合適,距離越小說明簇分的越好,選取臨界點的簇個數
printclf.inertia_
#進行預測
printclf.predict(feature)
#保存模型
joblib.mp(clf,'c:/km.pkl')
#載入保存的模型
clf=joblib.load('c:/km.pkl')
'''
#用來評估簇的個數是否合適,距離越小說明簇分的越好,選取臨界點的簇個數
foriinrange(5,30,1):
clf=KMeans(n_clusters=i)
s=clf.fit(feature)
printi,clf.inertia_
'''
③ sklearn的PCA
1.1 維度
對於數組和series來說,維度就是shape返回的結果,shape中返回幾個數字就是幾維。對圖像來說,維度就是圖像中特徵向量的數量。降維演算法中的」降維「,指的是降低特徵矩陣中特徵的數量。
1.2 sklearn中的降維演算法
sklearn中的降維演算法在模塊decomposition中,這個模塊的本質是一個矩陣分解模塊。矩陣分解可以用在降維,深度學習,聚類分析,數據預處理,低緯度特徵學習,推薦系統,大數據分析等領域。 SVD和主成分分析PCA都是通過分解特徵矩陣來進行降維的 。
1.3 PCA
在降維的過程中,將會減少特徵的數量,這意味著刪除部分數據,數據量變少則表示模型可獲取的信息變少了,模型的表現可能會因此受到影響。同時,在高維數據中,必然也有一些特徵是不帶有效信息的(噪音),或是有一些特徵帶有的信息和其他一些特徵是重復的(一些特徵之間可能會線性相關)。我們希望在降維的過程中,既能減少特徵的數量又保留大部分有效信息,那就將帶有重復信息的特徵合並,並刪除那些帶有無效信息的特徵,創建出一個能攜帶大部分信息,特徵更少的特徵矩陣。
在降維中,PCA使用的信息量衡量指標是樣本方差,又稱可解釋性方差,方差越大,特徵攜帶的信息量越多。
var代表一個特徵的方差,n代表樣本量,xi代表一個特徵中每個樣本的取值,xhat代表這一列樣本的均值。
1.4 降維的實現
步驟3中,我們用來找出n個新特徵向量,讓數據能夠被壓縮到少數特徵上並且中信息量不損失太多的技術就是矩陣分解,PCA與SVD是兩種不同的降維演算法,但是都遵從上面的過程來降維,只是兩種演算法的矩陣分解的方法不同,信息量的衡量指標不同。PCA使用方差作為信息量的衡量指標,並且使用特徵值分解來找出空間V。降維時,它會產生協方差矩陣 將特徵矩陣分解為以下三個矩陣,其中Q和 是輔助的矩陣, 是一個對角矩陣(除對角線上有值,其他位置都是0的矩陣),其對角線上的元素就是方差,降維完成之後,PCA找到的每個新特徵向量就叫做「主成分」,而被丟棄的特徵向量被認為信息量很少,這些信息很可能就是噪音。
SVD使用奇異值分解來找出空間V,其中Σ也是一個對角矩陣,不過它對角線上的元素是奇異值,這也是SVD中用來衡量特徵上的信息量的指標。U和V^{T}分別是左奇異矩陣和右奇異矩陣,也都是輔助矩陣。
在數學原理中,無論是PCA還是SVD都需要遍歷所有的特徵和樣本來計算信息量指標,並且在矩陣分解的過程中,會產生比原來更大的矩陣,比如原數據的結構是(m,n),在矩陣分解中為了找出最佳新特徵空間V,可能需要產生(n,n),(m,m)大小的矩陣,還需要產生協方差矩陣去計算更多的信息,因此,降維演算法的計算量很大,運行比較緩慢。
PAC數據特徵創造並不屬於特徵選擇,特徵選擇只是從已經存在的特徵中選取攜帶信息量最多的,選完之後特徵依然具有可解釋性,仍然能解釋改特徵在原數據集上的含義。而PCA是將已經存在的特徵進行壓縮,降維後的特徵不是原特徵矩陣中的任何一個特徵,而是通過某些方式組合起來的新特徵。在新的特徵矩陣生成之前,我們無法得知PCA是建立在怎麼樣的新特徵向量上,所以新特徵矩陣生成之後不再具有可讀性,我們無法判斷新特徵矩陣的特徵是從原數據中的什麼特徵組合而來,新特徵雖然帶有原始數據的信息,卻已經不是原數據上代表著的含義了。PCA一般不適用於探索特徵和標簽之間的關系的模型(如線性回歸),因為無法解釋的新特徵和標簽之間的關系不具有意義。
1.5 sklearn.decomposition.PCA
class sklearn.decomposition.PCA (n_components=None, =True, whiten=False, svd_solver=』auto』, tol=0.0,iterated_power=』auto』, random_state=None)
n_components就是降維後需要保留的特徵數量,即降維流程中第二步裡面需要確認的k值,一般輸入[0,min(X.shape)]范圍中的整數,k的值會影響到模型的表現,如果k值太大,留下的特徵太多,達不到降維的效果,如果k值太小,留下的特徵太少,那新特徵向量可能無法容納原始數據集中的大部分信息。n_components取值如何選呢?
a. 選擇最好的n_components:累積可解釋方差貢獻率曲線。
當參數n_components中不填寫任何值,則默認返回min(X.shape)個特徵,一般來說,樣本量都會大於特徵數目,所以什麼都不填就相當於轉換了新特徵空間,但沒有減少特徵的個數。一般來說,不會使用這種輸入方式。但我們卻可以使用這種輸入方式來畫出累計可解釋方差貢獻率曲線,以此選擇最好的n_components的整數取值。累計可解釋方差貢獻率曲線是一天以降維後保留的特徵個數為橫坐標,降維後新特徵捕捉到的可解釋方差貢獻率為縱坐標的曲線,能幫助我們決定n_components的最好取值.
b.最大似然估計自選超參數
PCA用最大似然估計(maximum likelihoodestimation)自選超參數的方法,輸入「mle」作為n_components的參數輸入,就可以調用這種方法。
c.按信息量佔比選超參數
輸入[0,1]之間的浮點數,並且讓參數svd_solver =='full',表示希望降維後的總解釋性方差佔比大於n_components指定的百分比,即是說,希望保留百分之多少的信息量。比如說,如果我們希望保留97%的信息量,就可以輸入n_components = 0.97,PCA會自動選出能夠讓保留的信息量超過97%的特徵數量
svd_solver是奇異值分解器的意思,PCA中為什麼會有關奇異值分解的參數呢?SVD有一個驚人的數學性質,它能跳過數學神秘宇宙,不計算協方差矩陣,直接找出一個新特徵向量組成的n維空間,而這個n維空間就是奇異值分解後的右矩陣 (就是降維過程中所說的生成新特徵向量組成的空間V,並非巧合,而特指奇異值分解中的矩陣 )
右奇異矩陣 有著如下性質:
k就是n_compoents,是我們降維後希望得到的維度。若X為(m,n)的特徵矩陣, 就是結構為(n,n)的矩陣,取這個矩陣的前k行(進行切片),即將V轉化為結構是(k,n)的矩陣。而 與原矩陣X相乘,即可得到降維後的特徵矩陣X_dr, 這是說,奇異值分解可以不計算協方差矩陣等等結構復雜計算冗長的矩陣,就直接求出新特徵空間和降維後的特徵矩陣。
簡而言之,SVD在矩陣分解中的過程比PCA簡單快速,但是遺憾的是,SVD的信息量衡量指標比較復雜,要理解」奇異值「遠不如理解」方差「來得容易,因此,sklearn將降維流程拆分為了兩部分,一部分是計算特徵空間的V,由奇異值分解完成,另一部分是映射數據和求解新特徵矩陣,由主成分分析完成,實現了用SVD的性質減少計算量,卻讓信息量的評估指標是方差,具體的流程如下圖:
1.6 重要參數 svd_solver與random_state
參數svd_solver是在降維過程中,用來控制矩陣分解的一些細節的參數。有四種模式可選:"auto", "full", "arpack","randomized",默認」auto"。
1.'auto':基於X.shape和n_compoents的默認策略來選擇分解器,如果輸入數據的尺寸大於500X500且要提取的特徵小於數據最小維度的min(X.shape)的80%,就用效果更高的『randomized』方法,否則就精確完整的SVD將被計算,截斷將會在矩陣被分解完成後有選擇的發生。
2.『full』:從scipy.linalg.svd中調用標準的LAPACK分解器來生成精確完整的SVD,適合數據量比較適中,計算時間充足的情況,生成的精確完整的SVD的結構為:
3.『arpack』:從scipy.sparse.linalg.svds調用ARPACK分解器來運行截斷奇異值分解(SVD truncated),分解時就將特徵數量降到n_components中輸入的數值k,可以加快運算速度,適合特徵矩陣很大的時候,但一般用於特徵矩陣為稀疏矩陣的情況,此過程包含一定的隨機性。截斷後的SVD分解出的結構為:
4.『randomized』:通過Halko等人的隨機方法進行隨機SVD。在"full"方法中,分解器會根據原始數據和輸入的n_components值去計算和尋找符合需求的新特徵向量,但是在"randomized"方法中,分解器會先生成多個隨機向量,然後一一去檢測這些隨機向量中是否有任何一個符合我們的分解需求,如果符合,就保留這個隨機向量,並基於這個隨機向量來構建後續的向量空間。這個方法已經被Halko等人證明,比"full"模式下計算快很多,並且還能夠保證模型運行效果。適合特徵矩陣巨大,計算量龐大的情況。
而參數random_state在參數svd_solver的值為"arpack" or "randomized"的時候生效,可以控制這兩種SVD模式中的隨機模式。通常我們就選用」auto「,不必對這個參數糾結太多。
④ sklearn.cluster.DBSCAN聚類後的結果集怎麼樣獲取
運用聚類分析法主要做好分析表達數據:1、通過一系列的檢測將待測的一組基因的變異標准化,然後成對比較線性協方差。2、通過把用最緊密關聯的譜來放基因進行樣本聚類,例如用簡單的層級聚類(hierarchicalclustering)方法。
⑤ 使用 sklearn 庫中的 KMeans 實現彩色圖像聚類分割
sklearn 庫是最為常用且經典的機器學習庫,裡面封裝了許多機器學習演算法,此篇文章使用此庫中的 KMeans 演算法,從而實現圖像的聚類分割。
本文不講理論,只談應用。
除了 sklearn 庫之外,還需要一些圖像處理的庫,我引入了如下幾個庫:
我使用了 pylab 庫來讀入圖片:
此時讀入的 img 是一個三維 numpy 數組,其形狀為 (height, width, 3) ,其中3是指通道數,即 RGB 三個通道。
但是, KMeans 傳入的參數必須是二維數組,故,還需要將其打散為二維:
在此構建時,只需要使用最簡單的方法即可:
參數有很多,我在構建的時候除了 n_clusters 都使用的默認值:
然後,使用 fit() 進行訓練:
聚類之後,有很多參數,比較重要的,以及此處需要用到的主要有倆:
聚類完成之後,需要將每個像素點重新填色,將同一類的像素點均填為此類聚類中心的顏色。
在此之前,首先需要得到圖片的高度和寬度:
首先用 image.new() 重新創建一個圖片,其語法如下:
然後需要用 putpixel() 方法來填充像素,但是在此之前,還需要處理幾個小細節:
RGB圖中,每個通道都是 0-255 之間的整數,但是, kmeans.cluster_centers_ 中元素類型卻是 float64 ,故在填充之前,還需要小小處理一番,將元素變為 int32 類型的。
直接轉變類型不太合適,因為 kmeans.cluster_centers_ 畢竟是類似於一個屬性值的東西,而且這個名字太長,換一個簡短的也是好的。故重新復制一份再使用 astype 更改數據類型即可。
上面便提到, kmeans.labels_ 是一個一維數組,但是圖片是二維的,所以將其恢復過來即可:
然後便可以 填充像素 了:
這里需要注意 putpixel() 方法,其的兩個參數:
最後保存圖片即可:
我使用了王者榮耀大喬的圖片來做測試:
⑥ python怎麼用sklearn包進行聚類
# -*- coding: utf-8 -*-from sklearn.cluster import KMeansfrom sklearn.externals import joblibimport numpyfinal = open('c:/test/final.dat' , 'r')data = [line.strip().split('\t') for line in final]feature = [[float(x) for x in ro...
⑦ 常用聚類(K-means,DBSCAN)以及聚類的度量指標:
一年前需要用聚類演算法時,自己從一些sklearn文檔和博客粗略整理了一些相關的知識,記錄在電子筆記里備忘,現在發到網上,當時就整理的就很亂,以後有空慢慢把內容整理、完善,用作備忘。之前把電影標簽信息的聚類結果作為隱式反饋放進SVD++中去訓練,裡面有兩個小例子
利用條件熵定義的同質性度量:
sklearn.metrics.homogeneity_score:每一個聚出的類僅包含一個類別的程度度量。
sklearn.metrics.completeness:每一個類別被指向相同聚出的類的程度度量。
sklearn.metrics.v_measure_score:上面兩者的一種折衷:
v = 2 * (homogeneity * completeness) / (homogeneity + completeness)
可以作為聚類結果的一種度量。
sklearn.metrics.adjusted_rand_score:調整的蘭德系數。
ARI取值范圍為[-1,1],從廣義的角度來講,ARI衡量的是兩個數據分布的吻合程度
sklearn.metrics.adjusted_mutual_info_score:調整的互信息。
利用基於互信息的方法來衡量聚類效果需要實際類別信息,MI與NMI取值范圍為[0,1],AMI取值范圍為[-1,1]。
在scikit-learn中, Calinski-Harabasz Index對應的方法是metrics.calinski_harabaz_score.
CH指標通過計算類中各點與類中心的距離平方和來度量類內的緊密度,通過計算各類中心點與數據集中心點距離平方和來度量數據集的分離度,CH指標由分離度與緊密度的比值得到。從而,CH越大代表著類自身越緊密,類與類之間越分散,即更優的聚類結果。
silhouette_sample
對於一個樣本點(b - a)/max(a, b)
a平均類內距離,b樣本點到與其最近的非此類的距離。
silihouette_score返回的是所有樣本的該值,取值范圍為[-1,1]。
這些度量均是越大越好
K-means演算法應該算是最常見的聚類演算法,該演算法的目的是選擇出質心,使得各個聚類內部的inertia值最小化,計算方法如下:
inertia可以被認為是類內聚合度的一種度量方式,這種度量方式的主要缺點是:
(1)inertia假設數據內的聚類都是凸的並且各向同性( convex and isotropic),
各項同性是指在數據的屬性在不同方向上是相同的。數據並不是總能夠滿足這些前提假設的,
所以當數據事細長簇的聚類,或者不規則形狀的流形時,K-means演算法的效果不理想。
(2)inertia不是一種歸一化度量方式。一般來說,inertia值越小,說明聚類效果越好。
但是在高維空間中,歐式距離的值可能會呈現迅速增長的趨勢,所以在進行K-means之前首先進行降維操作,如PCA等,可以解決高維空間中inertia快速增長的問題,也有主意提高計算速度。
K-means演算法可以在足夠長的時間內收斂,但有可能收斂到一個局部最小值。
聚類的結果高度依賴質心的初始化,因此在計算過程中,採取的措施是進行不止一次的聚類,每次都初始化不同的質心。
sklearn中可以通過設置參數init='kmeans++'來採取k-means++初始化方案,
即初始化的質心相互之間距離很遠,這種方式相比於隨機初始質心,能夠取得更好的效果。
另外,sklearn中可以通過參數n_job,使得K-means採用並行計算的方式。
##sklearn 中K-means的主要參數:
1) n_clusters: 設定的k值
2)max_iter: 最大的迭代次數,一般如果是凸數據集的話可以不管這個值,如果數據集不是凸的,可能很難收斂,此時可以指定最大的迭代次數讓演算法可以及時退出循環。
3)n_init:用不同的初始化質心運行演算法的次數。由於K-Means是結果受初始值影響的局部最優的迭代演算法,因此需要多跑幾次以選擇一個較好的聚類效果,默認是10。如果你的k值較大,則可以適當增大這個值。
4)init: 即初始值選擇的方式,可以為完全隨機選擇'random',優化過的'k-means++'或者自己指定初始化的k個質心。一般建議使用默認的'k-means++'。
5)algorithm:有「auto」, 「full」 or 「elkan」三種選擇。"full"就是我們傳統的K-Means演算法, 「elkan」elkan K-Means演算法。默認的"auto"則會根據數據值是否是稀疏的,來決定如何選擇"full"和「elkan」。一般來說建議直接用默認的"auto"
聚類的中心
print clf.cluster_centers_
每個樣本所屬的簇
print clf.labels_
用來評估簇的個數是否合適,距離越小說明簇分的越好,選取臨界點的簇個數
print clf.inertia_
Sum of distances of samples to their closest cluster center.
兩個小例子(很久以前弄的,寫得比較簡略比較亂,有空再改,數據是movielen中的電影標簽信息):
例1:
例2,在區間[2,200]上遍歷k,並生成兩個聚類內部評價指標CH分、輪廓系數以及kmeans自帶inertia分和對應的k值的圖片來選擇k:
其中兩點相似度s(i, j)的度量默認採用負歐氏距離。
sklearn.cluster.AffinityPropagation
有參數preference(設定每一個點的偏好,將偏好於跟其他節點的相似性進行比較,選擇
高的作為exmplar,未設定則使用所有相似性的中位數)、damping (阻尼系數,
利用阻尼系數與1-阻尼系數對r 及 a進行有關迭代步數的凸組合,使得演算法收斂
default 0.5 可以取值與[0.5, 1])
cluster_centers_indices_:中心樣本的指標。
AP演算法的主要思想是通過數據點兩兩之間傳遞的信息進行聚類。
該演算法的主要優點是能夠自主計算聚類的數目,而不用人為制定類的數目。
其缺點是計算復雜度較大 ,計算時間長同時空間復雜度大,
因此該演算法適合對數據量不大的問題進行聚類分析。
數據點之間傳遞的信息包括兩個,吸引度(responsibility)r(i,k)和歸屬度(availability)a(i,k)。
吸引度r(i,k)度量的是質心k應當作為點i的質心的程度,
歸屬度a(i,k)度量的是點i應當選擇質心k作為其質心的程度。
其中t是迭代的次數,λ是阻尼因子,其值介於[0,1],在sklearn.cluster.AffinityPropagation中通過參數damping進行設置。
每次更新完矩陣後,就可以為每個數據點分配質心,分配方式?是針對數據點i,遍歷所有數據點k(包括其自身),
找到一個k使得r(i,k)+a(i,k)的值最大,則點k就是點i所屬的質心,迭代這個過程直至收斂。
所謂收斂就是所有點所屬的質心不再變化
首先說明不引入核函數時的情況。
演算法大致流程為:隨機選取一個點作為球心,以一定半徑畫一個高維球(數據可能是高維的),
在這個球范圍內的點都是這個球心的鄰居。這些鄰居相對於球心都存在一個偏移向量,
將這些向量相加求和再平均,就得到一個mean shift,起點在原球心,重點在球內的其他位置。
以mean shift的重點作為新的球心,重復上述過程直至收斂。
這個計算過程中,高維球內的點,無論其距離球心距離多遠,對於mean shift的計算權重是一樣的。
為了改善這種情況,在迭代計算mean shift的過程中引入了核函數
sklearn中相關實現是sklearn.cluster.MeanShift。
sklearn中實現的是自底向上的層次聚類,實現方法是sklearn.cluster.AgglomerativeClustering。
初始時,所有點各自單獨成為一類,然後採取某種度量方法將相近的類進行合並,並且度量方法有多種選擇。
合並的過程可以構成一個樹結構,其根節點就是所有數據的集合,葉子節點就是各條單一數據。
sklearn.cluster.AgglomerativeClustering中可以通過參數linkage選擇不同的度量方法,用來度量兩個類之間的距離,
可選參數有ward,complete,average三個。
ward:選擇這樣的兩個類進行合並,合並後的類的離差平方和最小。
complete:兩個類的聚類被定義為類內數據的最大距離,即分屬兩個類的距離最遠的兩個點的距離。
選擇兩個類進行合並時,從現有的類中找到兩個類使得這個值最小,就合並這兩個類。
average:兩個類內數據兩兩之間距離的平均值作為兩個類的距離。
同樣的,從現有的類中找到兩個類使得這個值最小,就合並這兩個類。
Agglomerative cluster有一個缺點,就是rich get richer現象,
這可能導致聚類結果得到的類的大小不均衡。
從這個角度考慮,complete策略效果最差,ward得到的類的大小最為均衡。
但是在ward策略下,affinity參數只能是「euclidean」,即歐式距離。
如果在歐氏距離不適用的環境中,average is a good alternative。
另外還應該注意參數affinity,這個參數設置的是計算兩個點之間距離時採用的策略,
注意和參數linkage區分,linkage設置的是衡量兩個類之間距離時採用的策略,
而點之間的距離衡量是類之間距離衡量的基礎。
affinity的可選數值包括 「euclidean」, 「l1」, 「l2」, 「manhattan」, 「cosine」,
『precomputed』. If linkage is 「ward」, only 「euclidean」 is accepted.
DBSCAN演算法的主要思想是,認為密度稠密的區域是一個聚類,各個聚類是被密度稀疏的區域劃分開來的。
也就是說,密度稀疏的區域構成了各個聚類之間的劃分界限。與K-means等演算法相比,該演算法的主要優點包括:可以自主計算聚類的數目,不需要認為指定;不要求類的形狀是凸的,可以是任意形狀的。
DBSCAN中包含的幾個關鍵概念包括core sample,non-core sample,min_sample,eps。
core samle是指,在該數據點周圍eps范圍內,至少包含min_sample個其他數據點,則該點是core sample,
這些數據點稱為core sample的鄰居。與之對應的,non-sample是該點周圍eps范圍內,所包含的數據點個數少於min_sample個。從定義可知,core sample是位於密度稠密區域的點。
一個聚類就是一個core sample的集合,這個集合的構建過程是一個遞歸的構成。
首先,找到任意個core sample,然後從它的鄰居中找到core sample,
接著遞歸的從這些鄰居中的core sample的鄰居中繼續找core sample。
要注意core sample的鄰居中不僅有其他core sample,也有一些non-core smaple,
也正是因為這個原因,聚類集合中也包含少量的non-core sample,它們是聚類中core sample的鄰居,
但自己不是core sample。這些non-core sample構成了邊界。
在確定了如何通過單一core sample找到了一個聚類後,下面描述DBSCAN演算法的整個流程。
首先,掃描數據集找到任意一個core sample,以此core sample為起點,按照上一段描述的方法進行擴充,確定一個聚類。然後,再次掃描數據集,找到任意一個不屬於以確定類別的core sample,重復擴充過程,再次確定一個聚類。
迭代這個過程,直至數據集中不再包含有core sample。
這也是為什麼DBSCAN不用認為指定聚類數目的原因。
DBSCAN演算法包含一定的非確定性。數據中的core sample總是會被分配到相同的聚類中的,哪怕在統一數據集上多次運行DBSCAN。其不確定性主要體現在non-core sample的分配上。
一個non-core sample可能同時是兩個core sample的鄰居,而這兩個core sample隸屬於不同的聚類。
DBSCAN中,這個non-core sample會被分配給首先生成的那個聚類,而哪個聚類先生成是隨機的。
sklearn中DBSCAN的實現中,鄰居的確定使用的ball tree和kd-tree思想,這就避免了計算距離矩陣。
⑧ 用sklearn進行降維的七種方法
在實際的應用中,有時候我們會遇到數據的維度太少,我們需要新生成新的維度,可以用我們之前的分享( 如何自動化進行特徵工程 );有時候維度太多,這時候我們就需要降維了。降維的方法有許多,我們這里介紹了sklearn中介紹的7種,供大家學習和收藏。
主成分分析(PCA)用於將多維的數據集分解為一組具有最大方差的連續正交分量。在sklearn這個包中,PCA是一個transformer對象,使用fit方法可以選擇前n個主成分,並且用於投射到新的數據中。
PCA有兩種實現方式,一種是特徵值分解去實現,一種是奇異值分解去實現。特徵值分解是一個提取矩陣特徵很不錯的方法,但是它只是對方陣而言的,如果不使用SVD,PCA只會尋找每個特徵的中心,但並不會對數據進行縮放(scaled)。使用參數whiten=True ,可以將數據投射到奇異空間中,並且將每個組分縮放到方差為1,這個對於後續分析中,假設每個特徵是isotropy 是很有幫助的,例如SVM和Kmeans聚類。
PCA不僅僅是對高維數據進行降維,更重要的是經過降維去除了雜訊,發現了數據中的模式。PCA把原先的n個特徵用數目更少的m個特徵取代,新特徵是舊特徵的線性組合,這些線性組合最大化樣本方差,盡量使新的m個特徵互不相關。
SVD是一種矩陣分解法,把一個大矩陣分解成易於處理的形式,這種形式可能是兩個或多個矩陣的乘積。
參數
例子2:獲取每個主成分與特徵的關系
PCA雖然很有用,但是需要將數據全部都存入內存,因此當當要分解的數據集太大,會導致內存很大。這時候,增量主成分分析(IPCA)通常用作主成分分析(PCA)的替代,可以通過部分計算的方式,獲得跟PCA一樣的結果。
IPCA使用與輸入數據樣本數無關的內存量為輸入數據建立低秩近似。它仍然依賴於輸入數據功能,但更改批量大小可以控制內存使用量。
該函數,增加了一個batch_size的參數,用來控制批次,其餘都一樣,至此不再贅述。
實例
對於大型矩陣的分解,我們往往會想到用SVD演算法。然而當矩陣的維數與奇異值個數k上升到一定程度時,SVD分解法往往因為內存溢出而失敗。因此,Randomized SVD演算法,相比於SVD,它更能適應大型矩陣分解的要求,且速度更快。
此外,在某些場景下,我們期望丟掉某些lower sigular values,來達到減少噪音,保留盡可能多的方差,從而達到更好的預測效果。比如人臉的識別,如果是64X64的像素,那麼整個維度有4096個。我們利用這個方法,可以保留重要的維度,從而利於後續的分析。
使用 svd_solver='randomized' 可以實現隨機化的SVD,來去掉部分的奇異矩陣。
主成分分析(Principal Components Analysis, PCA)適用於數據的線性降維。而核主成分分析(Kernel PCA,KPCA)可實現數據的非線性降維,用於處理線性不可分的數據集。kernel的選擇有 {'linear', 'poly', 'rbf', 'sigmoid', 'cosine', 'precomputed'},默認是'linear'。
詳細說明見官方說明,與普通的PCA差不多。
SparsePCA 期望找到一組可以最優地重構數據的稀疏主成分。稀疏性的大小由參數alpha給出的L1懲罰系數來控制。Mini-batch sparse PCA是sparsePCA的變種,提高了速度,但是降低了精度。
主成分分析(PCA)的缺點是,該方法提取的成分是一種密集表達式,即用原始變數的線性組合表示時,它們的系數是非零的。這可能會使解釋模型變得困難。在許多情況下,真實的基礎分量可以更自然地想像為稀疏向量;例如,在人臉識別中,主成分會只包含部分的圖像,映射到人臉的某些部分。稀疏主成分產生了一種更簡潔的、可解釋的表示,清楚地強調是哪些原始特徵導致了樣本之間的差異。
通過調節alpha來調整懲罰度,alpha越大,越導致許多系數為0。
TruncatedSVD是普通SVD的一個變種,只計算用戶指定的前K個奇異值。TSVD通常用於語義分析中,是LSA的其中的一部分,可以解決一詞多義和一義多詞的問題。
LSA潛在語義分析的目的,就是要找出詞(terms)在文檔和查詢中真正的含義,也就是潛在語義,從而解決上節所描述的問題。具體說來就是對一個大型的文檔集合使用一個合理的維度建模,並將詞和文檔都表示到該空間,比如有2000個文檔,包含7000個索引詞,LSA使用一個維度為100的向量空間將文檔和詞表示到該空間,進而在該空間進行信息檢索。而將文檔表示到此空間的過程就是SVD奇異值分解和降維的過程。降維是LSA分析中最重要的一步,通過降維,去除了文檔中的「噪音」,也就是無關信息(比如詞的誤用或不相關的詞偶爾出現在一起),語義結構逐漸呈現。相比傳統向量空間,潛在語義空間的維度更小,語義關系更明確。
使用例子如下:
用事先預定義好的字典來對矩陣進行稀疏化編碼,達到降維和簡化的目的。就像人類的所有語言都是由單片語成一樣,因此使用已知的詞典可以減少維度;其次,稀疏化可以減少計算的成本,讓後續的計算更快。
這個對象沒有fit的方法,transformation方法會將數據表示為盡可能少的字典原子的線性組合。可以用transform_method來控制初始化參數,有以下幾種:
使用的函數為sklearn.decomposition.DictionaryLearning,會找到一個可以將fitted data足夠好稀疏化的字典。
將數據表示為一個overcomplete的字典這個過程,同大腦處理數據的過程類似。這個方法在圖像補丁的字典學習已被證明在諸如圖像完成、修復和去噪以及監督識別任務的圖像處理任務中給出良好的結果。
使用函數為sklearn.decomposition.MiniBatchDictionaryLearning,是一種快速的,但是精確度降低的版本,適應於大數據集合。
默認情況下,MiniBatchDictionaryLearning將數據分成小批量,並通過在指定次數的迭代中循環使用小批量,以在線方式進行優化。但是,目前它沒有退出迭代的停止條件。也可以用partial_fit來實現小批次的fit。
從變數中提取共性因子。
因子分析要求原有變數間具有較強的相關性,否則,因子分析無法提取變數間的共性特徵,如果相關系數小於0.3,則變數間的共線性較小,不適合因子分析;因子分析得到因子和原變數的關系,因此能夠對因子進行解釋。
因子分析可以產生與 PCA 相似的特徵(載荷矩陣的列)。不過,不能對這些特徵做出任何一般性的說明(例如他們是否正交)。
使用的函數為sklearn.decomposition.FactorAnalysis。
使用的函數為sklearn.decomposition.FastICA,ICA可以提取出一系列的主成分,彼此最大的獨立。因此,ICA一般不用於降維,而用於區分疊加信號。ICA不考慮noise,為了使模型正確,必須使用whitening,可以使用whiten這個參數。
ICA 通常用於分離混合信號(稱為盲源分離的問題),也可以作為一種非線性降維方法,可以找到具有一些稀疏性的特徵。
主成分分析假設源信號間彼此非相關,獨立成分分析假設源信號間彼此獨立。
主成分分析認為主元之間彼此正交,樣本呈高斯分布;獨立成分分析則不要求樣本呈高斯分布。
非負矩陣分解,顧名思義就是,將非負的大矩陣分解成兩個非負的小矩陣。在數據矩陣不包含負值的情況下,應用NMF而不是PCA或其變體。
NMF可以產生可以代表數據的主成分,從而可以來解釋整個模型。
參數init,可以用來選擇初始化的方法,不同的方法對結果會有不同的表現。
在PCA處理中,假使將特徵降維為600個,那麼降維後的每個人臉都包含了600個特徵(所以我們看到降維後的人臉有種「伏地魔」的感覺 ,這是因為降維處理相當於刪去了部分細節特徵,導致一部分信息丟失,在圖片中最直觀的體現就是變模糊)。而在NMF的處理中,這1000個特徵相當於是被分離了。相當於,一張人臉是由鼻子、耳朵等這些獨立的特徵疊加出來的。
LDA是文檔主題生成模型,對離散數據集(如文本語料庫)的集合的生成概率模型。它也是一個主題模型,用於從文檔集合中發現抽象主題。LDA是一種非監督機器學習技術,可以用來識別大規模文檔集(document collection)或語料庫(corpus)中潛藏的主題信息。
sklearn.decomposition.LatentDirichletAllocation是用於進行LDA的函數。
1、 https://www.jianshu.com/p/1adef2d6dd88
2、 https://www.jianshu.com/p/e574e91070ad
3、 https://scikit-learn.org/stable/moles/decomposition.html#decompositions
4、 https://shankarmsy.github.io/posts/pca-sklearn.html
5、 https://mp.weixin.qq.com/s/Tl9ssjmGdeyNrNuIReo1aw
6、 https://www.cnblogs.com/eczhou/p/5433856.html
7、 https://scikit-learn.org/stable/auto_examples/applications/plot_face_recognition.html#sphx-glr-auto-examples-applications-plot-face-recognition-py
8、 https://blog.csdn.net/fkyyly/article/details/84665361 LSA(Latent semantic analysis)
9、 https://blog.csdn.net/fjssharpsword/article/details/74964127
10、 https://www.jianshu.com/p/e90900a3d03a
⑨ 聚類分析之KNN
我們先用一個例子體會下。
假設,我們想對電影的類型進行分類,統計了電影中打鬥次數、接吻次數,當然還有其他的指標也可以被統計到,如下表所示。
我們很容易理解《戰狼》《紅海行動》《碟中諜 6》是動作片,《前任 3》《春嬌救志明》《泰坦尼克號》是愛情片,但是有沒有一種方法讓機器也可以掌握這個分類的規則,當有一部新電影的時候,也可以對它的類型自動分類呢?
我們可以把打鬥次數看成 X 軸,接吻次數看成 Y 軸,然後在二維的坐標軸上,對這幾部電影進行標記,如下圖所示。對於未知的電影 A,坐標為 (x,y),我們需要看下離電影 A 最近的都有哪些電影,這些電影中的大多數屬於哪個分類,那麼電影 A 就屬於哪個分類。實際操作中,我們還需要確定一個 K 值,也就是我們要觀察離電影 A 最近的電影有多少個。
KNN 的工作原理
「近朱者赤,近墨者黑」可以說是 KNN 的工作原理。整個計算過程分為三步:
計算待分類物體與其他物體之間的距離;
統計距離最近的 K 個鄰居;
對於 K 個最近的鄰居,它們屬於哪個分類最多,待分類物體就屬於哪一類。
K 值如何選擇
你能看出整個 KNN 的分類過程,K 值的選擇還是很重要的。那麼問題來了,K 值選擇多少是適合的呢?
如果 K 值比較小,就相當於未分類物體與它的鄰居非常接近才行。這樣產生的一個問題就是,如果鄰居點是個雜訊點,那麼未分類物體的分類也會產生誤差,這樣 KNN 分類就會產生過擬合。
如果 K 值比較大,相當於距離過遠的點也會對未知物體的分類產生影響,雖然這種情況的好處是魯棒性強,但是不足也很明顯,會產生欠擬合情況,也就是沒有把未分類物體真正分類出來。
所以 K 值應該是個實踐出來的結果,並不是我們事先而定的。在工程上,我們一般採用交叉驗證的方式選取 K 值。
交叉驗證的思路就是,把樣本集中的大部分樣本作為訓練集,剩餘的小部分樣本用於預測,來驗證分類模型的准確性。所以在 KNN 演算法中,我們一般會把 K 值選取在較小的范圍內,同時在驗證集上准確率最高的那一個最終確定作為 K 值。
距離如何計算
在 KNN 演算法中,還有一個重要的計算就是關於距離的度量。兩個樣本點之間的距離代表了這兩個樣本之間的相似度。距離越大,差異性越大;距離越小,相似度越大。
關於距離的計算方式有下面五種方式:
歐氏距離;
曼哈頓距離;
閔可夫斯基距離;
切比雪夫距離;
餘弦距離。
其中前三種距離是 KNN 中最常用的距離,我給你分別講解下。
歐氏距離是我們最常用的距離公式,也叫做歐幾里得距離。在二維空間中,兩點的歐式距離就是:
同理,我們也可以求得兩點在 n 維空間中的距離:
曼哈頓距離在幾何空間中用的比較多。以下圖為例,綠色的直線代表兩點之間的歐式距離,而紅色和黃色的線為兩點的曼哈頓距離。所以曼哈頓距離等於兩個點在坐標繫上絕對軸距總和。用公式表示就是:
閔可夫斯基距離不是一個距離,而是一組距離的定義。對於 n 維空間中的兩個點 x(x1,x2,…,xn) 和 y(y1,y2,…,yn) , x 和 y 兩點之間的閔可夫斯基距離為:
其中 p 代表空間的維數,當 p=1 時,就是曼哈頓距離;當 p=2 時,就是歐氏距離;當 p→∞時,就是切比雪夫距離。
那麼切比雪夫距離怎麼計算呢?二個點之間的切比雪夫距離就是這兩個點坐標數值差的絕對值的最大值,用數學表示就是:max(|x1-y1|,|x2-y2|)。
餘弦距離實際上計算的是兩個向量的夾角,是在方向上計算兩者之間的差異,對絕對數值不敏感。在興趣相關性比較上,角度關系比距離的絕對值更重要,因此餘弦距離可以用於衡量用戶對內容興趣的區分度。比如我們用搜索引擎搜索某個關鍵詞,它還會給你推薦其他的相關搜索,這些推薦的關鍵詞就是採用餘弦距離計算得出的。
KD 樹
其實從上文你也能看出來,KNN 的計算過程是大量計算樣本點之間的距離。為了減少計算距離次數,提升 KNN 的搜索效率,人們提出了 KD 樹(K-Dimensional 的縮寫)。KD 樹是對數據點在 K 維空間中劃分的一種數據結構。在 KD 樹的構造中,每個節點都是 k 維數值點的二叉樹。既然是二叉樹,就可以採用二叉樹的增刪改查操作,這樣就大大提升了搜索效率。
在這里,我們不需要對 KD 樹的數學原理
了解太多,你只需要知道它是一個二叉樹的數據結構,方便存儲 K 維空間的數據就可以了。而且在 sklearn 中,我們直接可以調用 KD 樹,很方便。
用 KNN 做回歸
KNN 不僅可以做分類,還可以做回歸。首先講下什麼是回歸。在開頭電影這個案例中,如果想要對未知電影進行類型劃分,這是一個分類問題。首先看一下要分類的未知電影,離它最近的 K 部電影大多數屬於哪個分類,這部電影就屬於哪個分類。
如果是一部新電影,已知它是愛情片,想要知道它的打鬥次數、接吻次數可能是多少,這就是一個回歸問題。
那麼 KNN 如何做回歸呢?
對於一個新電影 X,我們要預測它的某個屬性值,比如打鬥次數,具體特徵屬性和數值如下所示。此時,我們會先計算待測點(新電影 X)到已知點的距離,選擇距離最近的 K 個點。假設 K=3,此時最近的 3 個點(電影)分別是《戰狼》,《紅海行動》和《碟中諜 6》,那麼它的打鬥次數就是這 3 個點的該屬性值的平均值,即 (100+95+105)/3=100 次。
總結
今天我給你講了 KNN 的原理,以及 KNN 中的幾個關鍵因素。比如針對 K 值的選擇,我們一般採用交叉驗證的方式得出。針對樣本點之間的距離的定義,常用的有 5 種表達方式,你也可以自己來定義兩個樣本之間的距離公式。不同的定義,適用的場景不同。比如在搜索關鍵詞推薦中,餘弦距離是更為常用的。
另外你也可以用 KNN 進行回歸,通過 K 個鄰居對新的點的屬性進行值的預測。
KNN 的理論簡單直接,針對 KNN 中的搜索也有相應的 KD 樹這個數據結構。KNN 的理論成熟,可以應用到線性和非線性的分類問題中,也可以用於回歸分析。
不過 KNN 需要計算測試點與樣本點之間的距離,當數據量大的時候,計算量是非常龐大的,需要大量的存儲空間和計算時間。另外如果樣本分類不均衡,比如有些分類的樣本非常少,那麼該類別的分類准確率就會低很多。
當然在實際工作中,我們需要考慮到各種可能存在的情況,比如針對某類樣本少的情況,可以增加該類別的權重。
同樣 KNN 也可以用於推薦演算法,雖然現在很多推薦系統的演算法會使用 TD-IDF、協同過濾、Apriori 演算法,不過針對數據量不大的情況下,採用 KNN 作為推薦演算法也是可行的。
⑩ python代碼如何應用系統聚類和K-means聚類法進行聚類分析 然後選擇變數,建立適當的模型
-Means聚類演算法
k-means演算法以k為參數,把n個對象分成k個簇,使簇內具有較高的相似度,而簇間的相似度較低。
隨機選擇k個點作為初始的聚類中心。
對於剩下的點,根據其與聚類中心的距離,將其歸入最近的簇。
對每個簇,計算所有點的均值作為新的聚類中心。
重復2,3直到聚類中心不再發生改變
Figure 1
K-means的應用
數據介紹:
現有1999年全國31個省份城鎮居民家庭平均每人全年消費性支出的八大主要變數數據,這八大變數分別是:食品、衣著、家庭設備用品及服務、醫療保健、交通和通訊、娛樂教育文化服務、居住以及雜項商品和服務。利用已有數據,對31個省份進行聚類。
實驗目的:
通過聚類,了解1999年各個省份的消費水平在國內的情況。
技術路線:
sklearn.cluster.Kmeans
數據實例: