K-means問題小記

K-means

k-means 聚類的原理以及缺點及對應的改進;kmeans 算法的優缺點。。。。
k均值聚類算法嘗試將給定的匿名數據集(一個不包含有關類標識的信息的集合)拆分爲固定數量(k)的簇。

最初,選擇k個所謂的質心。質心是羣集中心的數據點(虛部或實部)。每個質心都是給定輸入數據集中的現有數據點,是隨機選取的,因此所有質心都是唯一的(即,對於所有質心ci和cj,ci≠cj)。這些質心用於訓練kNN分類器。所得分類器用於對數據進行分類(使用k = 1),從而產生初始的隨機聚類集。此後,將每個質心設置爲其定義的羣集的算術平均值。重複分類和質心調整的過程,直到質心的值穩定爲止。最終的質心將用於生成輸入數據的最終分類/聚類,從而有效地將一組最初的匿名數據點轉換爲一組數據點,每個數據點都具有類標識

https://editor.csdn.net/md/?articleId=106042978
https://blog.csdn.net/u010536377/article/details/50884416

k-均值:優點和缺點
優點
•易於實施
•對於大量變量,K均值的計算速度可能比
•k-Means可能比分層聚類產生更強的聚類
•重新計算質心時,實例可以更改羣集(移至另一個羣集)。
缺點
•難以預測簇數(K值)
•種子種子對最終結果有很大影響
•數據順序會影響最終結果

em 與 kmeans 的關係;
EM和K-means在允許迭代過程的模型優化以找到最佳擁塞的意義上相似。 但是,K-means算法在計算兩個數據項之間的距離時,用於計算歐幾里得距離的方法有所不同。 EM使用統計方法。
K均值的過程類似於將每個觀察值分配給一個聚類,而EM(期望最大化)的過程則是尋找一個觀察值屬於一個聚類的可能性(概率)。這是這兩個過程都不​​同的地方。

例如,假設大多數觀測值確實屬於少數(未知)子組,並且觀測值的一小部分彼此之間以及與所有其他觀測值完全不同。然後,由於K-均值將每個觀測值強制進入一個聚類,因此,存在不屬於任何聚類的離羣值,發現的聚類可能會嚴重失真。混合模型是解決此類異常值的一種有吸引力的方法。這些相當於K均值聚類的軟版本。
k均值的其他假設是通過使用均值找到聚類的質心,這意味着它假設聚類在運動中必須是圓形的。在EM中,我們假設數據點可以是高斯分佈的。

https://blog.csdn.net/u010159842/article/details/45954961?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

kmeans 代碼;

print(__doc__)

from time import time
import numpy as np
import matplotlib.pyplot as plt

from sklearn import metrics
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.preprocessing import scale

np.random.seed(42)

X_digits, y_digits = load_digits(return_X_y=True)
data = scale(X_digits)

n_samples, n_features = data.shape
n_digits = len(np.unique(y_digits))
labels = y_digits

sample_size = 300

print("n_digits: %d, \t n_samples %d, \t n_features %d"
      % (n_digits, n_samples, n_features))


print(82 * '_')
print('init\t\ttime\tinertia\thomo\tcompl\tv-meas\tARI\tAMI\tsilhouette')


def bench_k_means(estimator, name, data):
    t0 = time()
    estimator.fit(data)
    print('%-9s\t%.2fs\t%i\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f'
          % (name, (time() - t0), estimator.inertia_,
             metrics.homogeneity_score(labels, estimator.labels_),
             metrics.completeness_score(labels, estimator.labels_),
             metrics.v_measure_score(labels, estimator.labels_),
             metrics.adjusted_rand_score(labels, estimator.labels_),
             metrics.adjusted_mutual_info_score(labels,  estimator.labels_),
             metrics.silhouette_score(data, estimator.labels_,
                                      metric='euclidean',
                                      sample_size=sample_size)))

bench_k_means(KMeans(init='k-means++', n_clusters=n_digits, n_init=10),
              name="k-means++", data=data)

bench_k_means(KMeans(init='random', n_clusters=n_digits, n_init=10),
              name="random", data=data)

# in this case the seeding of the centers is deterministic, hence we run the
# kmeans algorithm only once with n_init=1
pca = PCA(n_components=n_digits).fit(data)
bench_k_means(KMeans(init=pca.components_, n_clusters=n_digits, n_init=1),
              name="PCA-based",
              data=data)
print(82 * '_')

# #############################################################################
# Visualize the results on PCA-reduced data

reduced_data = PCA(n_components=2).fit_transform(data)
kmeans = KMeans(init='k-means++', n_clusters=n_digits, n_init=10)
kmeans.fit(reduced_data)

# Step size of the mesh. Decrease to increase the quality of the VQ.
h = .02     # point in the mesh [x_min, x_max]x[y_min, y_max].

# Plot the decision boundary. For that, we will assign a color to each
x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1
y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

# Obtain labels for each point in mesh. Use last trained model.
Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure(1)
plt.clf()
plt.imshow(Z, interpolation='nearest',
           extent=(xx.min(), xx.max(), yy.min(), yy.max()),
           cmap=plt.cm.Paired,
           aspect='auto', origin='lower')

plt.plot(reduced_data[:, 0], reduced_data[:, 1], 'k.', markersize=2)
# Plot the centroids as a white X
centroids = kmeans.cluster_centers_
plt.scatter(centroids[:, 0], centroids[:, 1],
            marker='x', s=169, linewidths=3,
            color='w', zorder=10)
plt.title('K-means clustering on the digits dataset (PCA-reduced data)\n'
          'Centroids are marked with white cross')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()

說說 Kmeans 算法, Kmeans 算法 K 怎麼設置、適用什麼樣數據集、怎麼評價 Kmeans 聚類結果、 Kmeans 有什麼優缺點?你的項目中使用 Kmeans 遇到哪些問題,怎麼解決的 ?

K 設置的方法:Elbow Method and Silihouette Method

Elbow Method
這可能是確定最佳羣集數的最著名方法。 它的方法也有點天真。
針對不同的k值計算平方誤差的組內平方和(WSS),然後選擇WSS首次開始減小的k。 在WSS vs-k的圖中,這是一個彎頭。

羣集內平方誤差之和聽起來有點複雜。 讓我們分解一下:
每個點的平方誤差是該點與其表示形式(即其預測的聚類中心)之間的距離的平方。
WSS分數是所有分數的平方誤差之和。
可以使用諸如歐幾里得距離或曼哈頓距離的任何距離度量。

在這裏插入圖片描述
正如預期的那樣,該圖看起來像一條手臂,肘部清晰,k = 3。
不幸的是,我們並不總是擁有如此清晰的聚類數據。 這意味着肘部可能不清晰銳利。

在這裏插入圖片描述

對於數據集A,彎頭在k = 3時清晰可見。但是,對於數據集B,此選擇不明確。我們可以選擇k爲3或4。
在這種模棱兩可的情況下,我們可以使用Silhouette方法。

Silihouette Method
輪廓值測量的是一個點與其自身的羣集(內聚)相比其他羣集(分隔)的相似程度。

Silhouette值的範圍介於+1和-1之間。 較高的值是理想的,它指示該點位於正確的羣集中。 如果許多點的Silhouette值均爲負,則可能表明我們創建的簇太多或太少。
每個數據點i的輪廓值s(i)定義如下:

在這裏插入圖片描述
如果i是羣集中的唯一點,則s(i)定義爲等於零。 這是爲了防止許多單點羣集的羣集數量顯着增加。
在這裏,a(i)是點i與它自己的羣集的相似性的度量。 度量爲i與羣集中其他點的平均距離。

在這裏插入圖片描述

同樣,b(i)是i與其他聚類中的點的相異度的量度
在這裏插入圖片描述
d(i,j)是點i和j之間的距離。 通常,歐幾里得距離用作距離度量。
我之前提到過,高輪廓分數是可取的。 輪廓分數在最佳k處達到其全局最大值。 理想情況下,它應顯示爲“輪廓值-k”圖中的峯值。
這是我們自己的數據集的圖:

在這裏插入圖片描述

在k = 3處有一個清晰的峯值。因此,它是最佳的。
最後,可以將數據最佳地聚類爲3個聚類,如下所示。
在這裏插入圖片描述

用 EM 算法推導解釋 Kmeans
k-means是EM的一種變體,假設簇是球形的。

K-Means實際上只是應用於特定樸素貝葉斯模型的EM(期望最大化)算法。

爲了證明這一點,我們首先考慮經典的樸素貝葉斯模型,該模型具有一個可以採用離散值(域大小爲 k )和一組特徵變量的類變量,每個特徵變量都可以採用連續值(見圖2)。
P(f_i = x | C = c)的條件概率分佈將與通常情況略有不同。與其將這種條件概率存儲爲表格,不如將其存儲爲單個正態(高斯)分佈,其均值和標準偏差爲1。具體地說,這意味着:
P(f_i = x | C = c)\ sim \ mathcal {N}(\ mu_ {c,i},1)

在給定具有特徵值的數據集而不是類變量的情況下,學習$ \ mu_ {c,i} $的值證明與在該數據集上運行k-means相同。

在這裏插入圖片描述
圖2:K-Means算法是應用於該貝葉斯網絡的EM算法。

如果我們知道這是貝葉斯網絡的結構,但是我們不知道任何條件概率分佈,則必須先運行參數學習,然後才能運行推理。

在給出的數據集中,觀察到了所有特徵變量(對於每個數據點),但是類變量被隱藏了。由於我們在無法觀察到某些變量的貝葉斯網絡上運行參數學習,因此應使用EM。

讓我們回顧一下EM。在EM中,我們隨機初始化模型參數,然後在(E)根據參數將值分配給隱藏變量和(M)根據完全觀察到的數據計算參數之間進行交替。

E-Step:根據參數得出隱藏變量的值。如果您根據數據集中給定數據的特徵來計算爲類變量選擇最佳值的數學方法,那麼結果就是“對於每個數據點,選擇最接近的質心,歐幾里得距離,並指定該質心的標籤。”

M-Step:根據完整的分配得出參數。如果您根據數據集中給定數據的特徵計算出最佳參數值的數學方法,那麼結果就是“取所有標爲c的數據點的平均值”。

所以呢?好吧,這使您對k均值的質量有了一個概念。像EM一樣,它證明會找到局部最優值。像EM一樣,不一定要找到全局最優值。事實證明,那些隨機初始值確實很重要。

KMeans的算法僞代碼

在這裏插入圖片描述

如何優化kmeans算法
K-Means優化算法

爲了克服K-Means算法收斂於局部最小值的問題,提出了一種二分K-均值(bisecting K-means)

二分K-Means(Bisecting KMeans)算法的主要思想是:首先將所有點作爲一個簇,然後將該簇一分爲二。之後選擇能最大限度降低聚類代價函數(也就是誤差平方和)的簇劃分爲兩個簇。以此進行下去,直到簇的數目等於用戶給定的數目k爲止。以上隱含的一個原則就是:因爲聚類的誤差平方和能夠衡量聚類性能,該值越小表示數據點越接近於他們的質心,聚類效果就越好。所以我們就需要對誤差平方和最大的簇進行再一次劃分,因爲誤差平方和越大,表示該簇聚類效果越不好,越有可能是多個簇被當成了一個簇,所以我們首先需要對這個簇進行劃分。

比如要分成5個組,第一次分裂產生2個組,然後從這2個組中選一個目標函數產生的誤差比較大的,分裂這個組產生2個,這樣加上開始那1個就有3個組了,然後再從這3個組裏選一個分裂,產生4個組,重複此過程,產生5個組。這算是一中基本求精的思想。二分k均值不太受初始化的困擾,因爲它執行了多次二分試驗並選取具有最小誤差的試驗結果,還因爲每步只有兩個質心。

https://blog.csdn.net/xiedelong/article/details/79696514

手寫k-means的僞代碼(就6行)
bagging和boosting是怎麼做的和他們的比較
Bagging和Boosting如何獲得N個學習者?

Bagging和Boosting在培訓階段通過生成其他數據來吸引N名學習者。通過隨機抽樣生成N個新的訓練數據集,並從原始數據集中進行替換。通過替換採樣,可以在每個新的訓練數據集中重複一些觀察。

對於Bagging,任何元素都有相同的可能性出現在新數據集中。但是,對於Boosting,將對觀察值進行加權,因此其中一些觀察值會更頻繁地參與新集合:單次裝袋和Boosting訓練集多個集合帶有替換的隨機抽樣過加權數據算法比較與這些多個集合用於訓練同一學習者算法,因此產生了不同的分類器。

爲什麼要對數據元素加權?

至此,我們開始處理兩種方法之間的主要區別。 雖然Bagging的訓練階段是並行的(即,每個模型都是獨立構建的),但Boosting會以一種順序的方式構建新的學習者:

Single Bagging和Boosting並行順序算法比較VersusIn在Boosting算法中,每個分類器都根據數據進行訓練, 並且和之前的合併計算。 在每個訓練步驟之後,權重將重新分配。 錯誤分類的數據會增加其權重,以強調最困難的情況。 這樣,後續的學習者將在培訓過程中專注於他們。

分類階段如何工作?

爲了預測新數據的類別,我們只需要將N個學習者應用於新觀察值即可。在袋裝中,通過平均N個學習者的回答(或多數投票)來獲得結果。但是,Boosting這次爲N個分類器分配了第二組權重,以便對其估計進行加權平均。單次裝袋和Boosting單估計簡單平均加權平均算法比較與結果在Boosting訓練階段,算法將權重分配給每個結果模型。在訓練數據上具有良好分類結果的學習者將被分配給較差的學習者更高的權重。因此,在評估新學習者時,Boosting還需要跟蹤學習者的錯誤。讓我們看看程序上的差異:單次裝袋和強化訓練階段訓練和保持訓練和評估更新樣本權重更新學習者權重算法比較與

一些Boosting技術包括保留或丟棄單個學習者的額外條件。例如,在最著名的AdaBoost中,維護模型所需的誤差小於50%。否則,重複該迭代,直到獲得比隨機猜測更好的學習能力爲止。

上一張圖片顯示了Boosting方法的一般過程,但是存在幾種選擇方法,它們具有不同的方法來確定在下一訓練步驟和分類階段中使用的權重。如果您想詳細瞭解,請單擊此處:AdaBoost,LPBoost,XGBoost,GradientBoost,BrownBoost。

Bagging和Boosting

沒有一個徹底的贏家。它取決於數據,仿真和環境。
Bagging和Boosting組合了來自不同模型的多個估計,從而減少了單個估計的方差。因此結果可能是具有更高穩定性的模型。

如果問題在於單個模型的性能非常低,那麼Bagging幾乎不會獲得更好的偏差。但是,Boosting可以生成誤差較小的組合模型,因爲它可以優化優勢並減少單個模型的陷阱。

相反,如果單個模型的難度過大,那麼Bagging是最佳選擇。提升本身並不能避免過度擬合;實際上,這種技術本身就面臨着這個問題。因此,Bagging比Boosting更有效。

區別:
Bagging技術可以是減少模型差異,防止過度擬合併提高不穩定模型準確性的有效方法。
另一方面,Boosting使我們可以通過將多個弱模型組合在一起來實現強模型。
與Bagging相比,從訓練數據集中抽取的樣本不會在強化練習中重新放回到訓練集中。
如果分析與決策樹進行比較時由Adaptive Boosting算法計算的決策邊界(稱爲樹樁),您將注意到AdaBoost計算的決策邊界可能非常複雜。
儘管這可以幫助我們實現強大的預測模型,但是與單個分類器相比,集成學習增加了計算複雜性。

詳細討論了樣本採樣和bagging的問題
請參考我下面一個單獨的文章

聊的比較多的是如何知道一個特徵的重要性,如何做ensemble哪些方法比較好。聊了聊計算廣告方面FM,embedding。

可以使用模型的特徵重要性屬性來獲取數據集中每個特徵的特徵重要性。 特徵重要性爲您提供數據中每個特徵的得分,得分越高,該特徵對您的輸出變量的重要性或相關性就越高。
具體同樣參考另一篇文章

常見融合框架原理,優缺點,bagging,stacking,boosting,爲什麼融合能提升效果
Bagging

Bootstrap 是一種集成生成方法,該方法使用用於訓練基本分類器的樣本變體。對於要生成的每個分類器,Bagging從大小爲N的訓練集中選擇(重複)N個樣本,並訓練一個基本分類器。重複此過程,直到達到所需的合奏大小。

bagging應與不穩定的分類器(即對訓練集的變化敏感的分類器)一起使用,例如決策樹和感知器。

隨機子空間是一種有趣的類似方法,它使用特徵的變化而不是樣本的變化,通常在具有多個維度和稀疏特徵空間的數據集上指出。

Boosting
Boosting通過添加正確分類“困難樣本”的分類器來生成整體。對於每次迭代,boosting會更新樣本的權重,這樣,由於整體錯誤分類的樣本可能具有較高的權重,因此有較高的被選擇用於訓練新分類器的可能性。

增強是一種有趣的方法,但是對噪聲非常敏感,並且僅在使用弱分類器時纔有效。 Boosting技術有多種變體,AdaBoost,BrownBoost(…),每一種都有自己的權重更新規則,以避免某些特定的問題(噪音,類不平衡……)。

stacking

stacking的思想是學習幾個不同的弱學習者,並通過訓練一個元模型以基於這些弱模型返回的多個預測來輸出預測來組合它們。因此,我們需要定義兩件事以構建我們的堆棧模型:我們要適合的L個學習者和將它們組合在一起的元模型。
例如,對於分類問題,我們可以選擇KNN分類器,邏輯迴歸和SVM作爲弱學習者,並決定學習神經網絡作爲元模型。然後,神經網絡將以我們三個弱學習者的輸出爲輸入,並將學習基於此返回最終預測。
因此,假設我們要適合由L個弱學習者組成的堆疊合奏。然後,我們必須遵循以下步驟:
將訓練數據分爲兩部分
選擇L個學習能力較弱的人,並使他們適合第一階段的數據
對L個弱學習者中的每個學習者,進行第二次觀察的預測
使用弱學習者的預測作爲輸入,在第二折上擬合元模型

在前面的步驟中,我們將數據集分爲兩部分,因爲對用於訓練弱學習者的數據的預測與對元模型的訓練無關。因此,將數據集分爲兩部分的一個明顯缺點是,我們只有一半的數據用於訓練基本模型,一半的數據用於訓練元模型。爲了克服這一侷限性,我們可以採用某種“ k折交叉訓練”方法(類似於k折交叉驗證中的方法),以便可以將所有觀察值用於訓練元數據。模型:對於任何觀察,對弱學習者的預測都是通過在不包含考慮的觀察值的k-1倍上訓練的這些弱學習者的實例完成的。換句話說,它包括對k-1折進行訓練,以便對其餘折進行預測,並進行迭代,以便獲得任何折的觀察預測。這樣做,我們可以爲數據集的每次觀察產生相關的預測,然後在所有這些預測上訓練我們的元模型。

K-means起始點http://www.cnki.com.cn/Article/CJFDTotal-DNZS200832067.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章