Mô hình hỗn hợp gaussian python

Mô hình cụm cụm K-Means được khám phá trong phần trước rất đơn giản và tương đối dễ hiểu, nhưng tính đơn giản của nó dẫn đến những thức thức kỳ lạ thực tế trong ứng dụng của nó. Cụ thể, bản chất không xác định của K-MEAN và việc sử dụng trung tâm từ xa cụm từ xa đơn giản để chỉ định thành viên cụm dẫn đến hiệu suất thấp cho nhiều vấn đề trong thế giới thực. Trong phần này, chúng tôi sẽ xem xét các mô hình hỗn hợp Gaussian [GMM], có thể được coi là một phần mở rộng của ý tưởng đằng sau K-MEAN, nhưng cũng có thể là một công cụ mạnh mẽ để chống lại

Nội dung chính Hiển thị

  • Động lực GMM. Điểm yếu của K-Means¶
  • Tổng số hóa ETHER M. Mô hình hỗn hợp Gaussian
  • Select type phương sai
  • GMM as a password mode
  • Có bao nhiêu thành phần?
  • Ví dụ. GMM to create new data

Chúng tôi bắt đầu với tiêu chuẩn nhập khẩu

Trong 1]

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns; sns.set[]
import numpy as np

Động lực GMM. Điểm yếu của K-Means¶

Chúng ta hãy xem một số điểm yếu của K-MEAN và suy nghĩ về cách chúng ta có thể cải thiện cụm từ thiện mô hình. Như chúng ta đã thấy trong phần trước, được cung cấp dữ liệu đơn giản, được phân tách tốt, K-MEANS tìm thấy kết quả phân cụm phù hợp

Ví dụ. Nếu chúng ta có những dữ liệu đơn giản, thuật toán K-MEAN có thể nhanh chóng gắn nhãn các cụm từ đó theo cách phù hợp với những gì chúng ta có thể làm bằng mắt

Trong 2]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting

Trong 3]

# Plot the data with K Means Labels
from sklearn.cluster import KMeans
kmeans = KMeans[4, random_state=0]
labels = kmeans.fit[X].predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];

Từ quan điểm trực quan, chúng ta có thể hy vọng rằng việc phân cụm cụm cho một số điểm chắc chắn hơn những điểm khác. Ví dụ, cảm giác như có một sự chồng chéo rất nhỏ giữa hai cụm từ giữa, do đó chúng ta không thể hoàn toàn tự tin trong việc điều chỉnh cụm từ các điểm giữa chúng. Thật không may, mô hình K-MEAN không có kích thước đo lường nội dung về xác định hoặc mức độ không chắc chắn của các cụm bài tập [mặc dù có thể sử dụng phương pháp bootstrap để ước tính mức độ không chắc chắn này]. Đối mặt với điều này, chúng ta phải suy nghĩ về công việc khái quát hóa mô hình

Một cách để suy nghĩ về mô hình K-Mean là nó đặt một hình tròn [hoặc, theo kích thước cao hơn, một hình cầu siêu] ở trung tâm của mỗi cụm, với bán kính được xác định bởi điểm xa nhất trong cụm. Việc bán kính này hoạt động như một điểm cắt cứng để chỉ định cụm từ trong tập huấn luyện. bất kỳ điểm nào bên ngoài vòng tròn này không được coi là thành viên của cụm từ. Chúng ta có thể trực tiếp hóa cụm từ mô hình này với chức năng sau

Trong [4]

from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist

def plot_kmeans[kmeans, X, n_clusters=4, rseed=0, ax=None]:
    labels = kmeans.fit_predict[X]

    # plot the input data
    ax = ax or plt.gca[]
    ax.axis['equal']
    ax.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis', zorder=2]

    # plot the representation of the KMeans model
    centers = kmeans.cluster_centers_
    radii = [cdist[X[labels == i], [center]].max[]
             for i, center in enumerate[centers]]
    for c, r in zip[centers, radii]:
        ax.add_patch[plt.Circle[c, r, fc='#CCCCCC', lw=3, alpha=0.5, zorder=1]]

Trong [5]

kmeans = KMeans[n_clusters=4, random_state=0]
plot_kmeans[kmeans, X]

Một điều quan trọng đối với K-MEAN là các cụm từ mô hình này phải là hình tròn. K-Means không có cách tính toán tổng hợp cho các cụm hình chữ hoặc hình elip. Vì vậy, ví dụ, nếu chúng ta lấy cùng một dữ liệu và biến đổi nó, thì các bài tập của cụm cuối cùng sẽ trở nên rối rắm

Trong [6]

rng = np.random.RandomState[13]
X_stretched = np.dot[X, rng.randn[2, 2]]

kmeans = KMeans[n_clusters=4, random_state=0]
plot_kmeans[kmeans, X_stretched]

Bằng mắt thường, chúng tôi nhận thấy rằng các cụm biến đổi này là không mạch, và do đó các cụm biến tròn sẽ phù hợp. Tuy nhiên, K-Means không đủ linh hoạt để giải thích cho công việc này và cố gắng buộc dữ liệu thành cụm từ tròn. Điều này dẫn đến sự kết hợp của các cụm bài tập trong đó các vòng tròn kết quả chồng chéo. đặc biệt là xem đặc biệt là dưới cùng bên phải của cốt truyện này. Người ta có thể tưởng tượng việc giải quyết vấn đề cụ thể này bằng cách xử lý dữ liệu tiền tệ với PCA [xem theo chiều sâu. Phân tích thành phần chính], nhưng trong thực tế không có gì đảm bảo rằng hoạt động toàn cầu như vậy sẽ bao quát dữ liệu riêng lẻ

Hai nhược điểm này của K-MEANS, thiếu tính linh hoạt trong cụm hình dạng và thiếu sự gán cụm từ xác nhận, có nghĩa là đối lập với nhiều bộ dữ liệu [đặc biệt là bộ dữ liệu chiều thấp] nó không thể thực hiện được

Bạn có thể tưởng tượng để giải quyết các điểm yếu này bằng cách đánh lừa tiêu chuẩn hóa mô hình K-MEANS. ví dụ, bạn có thể đo lường sự thật không chắc chắn trong việc gán cụm bằng cách so sánh khoảng cách của từng điểm với tất cả các cụm trung tâm, thay vì tập trung vào gần nhất. Bạn cũng có thể tưởng tượng để cho phép các khoảng cách giữa các cụm là hình elip hơn là các vòng tròn, để giải thích cho các cụm không tròn. Hóa ra đây là hai thành phần thiết yếu của một loại mô hình phân cụm khác nhau, các mô hình hỗn hợp Gaussian

Tổng số hóa ETHER M. Mô hình hỗn hợp Gaussian

Một mô hình hỗn hợp Gaussian [GMM] đang cố gắng tìm một mô hình hỗn hợp phân phối Gaussian đa chiều mà mô hình hóa tốt nhất bất kỳ bộ dữ liệu nào được đưa vào bất kỳ bộ dữ liệu nào. Trong trường hợp đơn giản nhất, GMMS có thể được sử dụng để tìm các cụm từ theo cách tương tự như K-MEANS

Trong [7]

from sklearn.mixture import GMM
gmm = GMM[n_components=4].fit[X]
labels = gmm.predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];

Nhưng vì GMM chứa một mô hình xác minh bên dưới mui xe, nên bạn cũng có thể tìm thấy các phân cụm cụm từ xác định, trong Scikit-learning, điều này được thực hiện bằng phương pháp

# Plot the data with K Means Labels
from sklearn.cluster import KMeans
kmeans = KMeans[4, random_state=0]
labels = kmeans.fit[X].predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];
5. Điều này trả về một trận đấu có kích thước ____26, đo lường chính xác rằng bất kỳ điểm nào thuộc về cụm đã cho

Trong [8]

probs = gmm.predict_proba[X]
print[probs[:5].round[3]]

________số 8

Chúng ta có thể hình dung sự không chắc chắn này bằng cách, ví dụ, làm cho kích thước của từng điểm tỷ lệ thuận với sự chắc chắn của dự đoán của nó;

Trong [9]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
0

Dưới mui xe, một mô hình hỗn hợp Gaussian rất giống với K-MEANS. nó sử dụng phương pháp tối đa hóa kỳ vọng mà thực hiện một cách định tính như sau

  1. Chọn khởi động dự đoán cho vị trí và định dạng

  2. lặp lại cho đến khi hội tụ

    1. Bước điện tử. Đối với mỗi điểm, tìm trọng số mã hóa xác thực thành viên trong mỗi cụm
    2. M-bước. Đối với mỗi cụm từ, cập nhật vị trí của nó, chuẩn hóa và định dạng dựa trên tất cả các điểm dữ liệu, sử dụng các số quan trọng

Kết quả của điều này là mỗi cụm từ được liên kết không phải với một quả cầu phần cứng, mà với mô hình Gaussian mượt mà. Giống như trong phương pháp tối đa hóa kỳ vọng của K-MEANS, thuật toán sử dụng này đôi khi có thể bỏ lỡ giải pháp tối ưu hóa toàn cầu, và do đó trong thực tế nhiều lần khởi tạo ngẫu nhiên được áp dụng

Chúng ta hãy tạo một hàm sẽ giúp chúng ta trực quan hóa các vị trí và hình dạng của các cụm từ GMM bằng cách vẽ các hình elip dựa trên đầu ra GMM

Trong [10]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
0

Với điều này, chúng ta có thể xem xét những gì GMM bốn thành phần cung cấp cho chúng ta để ban đầu dữ liệu của chúng ta

Trong [11]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
1

Tương tự như vậy, chúng ta có thể sử dụng phương pháp GMM để phù hợp với bộ dữ liệu kéo dài của chúng ta;

Trong [12]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
2

Điều này cho thấy rõ rằng GMM giải quyết hai vấn đề thực tế chính xác với K-Means đã gặp phải trước đó

Select type phương sai

Nếu bạn nhìn vào thông tin chi tiết của các phù hợp trước đó, bạn sẽ thấy rằng tùy chọn

# Plot the data with K Means Labels
from sklearn.cluster import KMeans
kmeans = KMeans[4, random_state=0]
labels = kmeans.fit[X].predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];
7 được đặt khác nhau trong mỗi. Siêu tham số này kiểm soát mức độ tự do trong định dạng của từng cụm từ; . Mặc dù định nghĩa là ____28, có nghĩa là kích thước của cụm dọc theo mỗi chiều có thể được đặt độc lập, với kết quả là hình elip bị giới hạn chế độ để căn cứ vào việc điều chỉnh các bộ phận. Một mô hình đơn giản hơn và nhanh hơn là
# Plot the data with K Means Labels
from sklearn.cluster import KMeans
kmeans = KMeans[4, random_state=0]
labels = kmeans.fit[X].predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];
9, điều này hạn chế hình dạng của cụm từ sao cho tất cả các kích thước đều bằng nhau. Kết quả phân cụm sẽ có các đặc điểm tương tự như của K-MEAN, mặc dù nó không hoàn toàn tương thích. Một mô hình phức tạp và tốn kém hơn về mặt tính toán [đặc biệt là khi số lượng kích thước tăng lên] được sử dụng ______30, cho phép mỗi cụm được mô hình hóa như một hình elip với ý định hướng tùy chọn

Chúng ta có thể thấy một biểu diễn trực quan của ba lựa chọn này cho một cụm từ duy nhất trong hình sau

GMM as a password mode

Mặc dù GMM thường được phân loại là một thuật toán phân cụm, về cơ bản nó là một thuật toán để ước tính mật độ. Điều đó có nghĩa là, kết quả của GMM phù hợp với một số dữ liệu về mặt kỹ thuật không phải là một mô hình phân cụm, mà là một mô hình xác minh tổng hợp mô tả phân tích dữ liệu

Ví dụ, hãy xem xét một số dữ liệu được tạo ra từ chức năng

from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist

def plot_kmeans[kmeans, X, n_clusters=4, rseed=0, ax=None]:
    labels = kmeans.fit_predict[X]

    # plot the input data
    ax = ax or plt.gca[]
    ax.axis['equal']
    ax.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis', zorder=2]

    # plot the representation of the KMeans model
    centers = kmeans.cluster_centers_
    radii = [cdist[X[labels == i], [center]].max[]
             for i, center in enumerate[centers]]
    for c, r in zip[centers, radii]:
        ax.add_patch[plt.Circle[c, r, fc='#CCCCCC', lw=3, alpha=0.5, zorder=1]]
1 của Scikit-LEARN, mà chúng ta đã thấy ở độ sâu. K-nghĩa là phân cụm

Trong 

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
3

Nếu chúng ta cố gắng phù hợp với điều này với GMM hai thành phần được xem như một cụm mô hình phân tích, kết quả sẽ không đặc biệt hữu ích

Trong [14]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
4

Nhưng nếu chúng ta thay vào đó sử dụng nhiều thành phần hơn và bỏ qua các cụm nhãn, chúng ta sẽ thấy một sự phù hợp gần với dữ liệu đầu vào hơn nhiều

Trong [15]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
5

Ở đây, sự kết hợp của 16 Gaussian phục vụ không tìm thấy các cụm dữ liệu được phân tách, mà là để mô hình hóa phân phối tổng hợp dữ liệu bắt đầu vào. Đây là một mô hình tổng thể của phân phối, có nghĩa là GMM cung cấp cho chúng tôi công thức để tạo dữ liệu ngẫu nhiên mới được phân phối tương tự như đầu vào của chúng tôi. Ví dụ. đây là 400 điểm mới được rút ra từ GMM 16 thành phần này phù hợp với dữ liệu gốc của chúng tôi

Trong [16]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
6

GMM thuận tiện như một phương tiện linh hoạt để mô hình hóa phân phối dữ liệu đa chiều tùy ý

Có bao nhiêu thành phần?

Thực tế là GMM là một mô hình tổng thể cung cấp cho chúng tôi một phương tiện thuận tiện tự nhiên để xác định số lượng thành phần tối ưu cho một bộ dữ liệu nhất định. Một mô hình tổng quát vốn là phân phối xác thực cho bộ dữ liệu và do đó chúng ta có thể chỉ cần đánh giá khả năng dữ liệu theo mô hình, sử dụng xác thực chéo để tránh đối sánh quá mức. Một phương tiện khác để sửa chữa quá mức là điều chỉnh khả năng mô hình bằng cách sử dụng một số tiêu chí phân tích như Tiêu chí Thông tin Akaike [AIC] hoặc Tiêu chí Thông tin Bayes [BIC]. Công cụ ước tính

from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist

def plot_kmeans[kmeans, X, n_clusters=4, rseed=0, ax=None]:
    labels = kmeans.fit_predict[X]

    # plot the input data
    ax = ax or plt.gca[]
    ax.axis['equal']
    ax.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis', zorder=2]

    # plot the representation of the KMeans model
    centers = kmeans.cluster_centers_
    radii = [cdist[X[labels == i], [center]].max[]
             for i, center in enumerate[centers]]
    for c, r in zip[centers, radii]:
        ax.add_patch[plt.Circle[c, r, fc='#CCCCCC', lw=3, alpha=0.5, zorder=1]]
2 của Scikit-Learn thực sự bao gồm các phương pháp tích hợp tính toán cả hai, và làm điều đó, rất dễ dàng để hành động vận tải trên phương pháp này

Chúng ta hãy xem AIC và BIC là một hàm giống như số lượng thành phần GMM cho bộ dữ liệu mặt trăng của chúng ta

Trong [17]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
7

Cụm từ số lượng tối ưu là giá trị giảm thiểu AIC hoặc BIC, tùy theo mức độ xấp xỉ mà chúng ta muốn sử dụng. AIC cho chúng ta biết rằng sự lựa chọn 16 thành phần của chúng ta ở trên có thể là quá nhiều. khoảng 8-12 thành phần sẽ là một lựa chọn tốt hơn. Như một điển hình với loại vấn đề này, BIC khuyến nghị một mô hình đơn giản hơn

Save the important point. Sự lựa chọn số lượng thành phần này đo lường mức độ hoạt động của GMM như một công cụ ước tính mức độ mật, chứ không phải nó hoạt động tốt như thế nào như một cụm thuật toán toán học. Tôi khuyến khích bạn nghĩ về GMM chủ yếu là công cụ ước tính mức độ mật khẩu và chỉ sử dụng nó để phân cụm khi được bảo hành trong các bộ dữ liệu đơn giản

Ví dụ. GMM to create new data

Chúng tôi chỉ thấy một ví dụ đơn giản về việc sử dụng GMM làm mô hình dữ liệu tổng thể để tạo các mẫu mới từ phân phối được xác định bởi dữ liệu đầu vào. Ở đây chúng tôi sẽ chạy với ý tưởng này và tạo ra các chữ số viết tay mới từ kho mục tiêu chuẩn mà chúng tôi đã sử dụng trước đây

Để bắt đầu, hãy tải xuống chữ số bằng công cụ dữ liệu của Scikit-LEARN

Trong [18]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
8

Tiếp theo, chúng ta hãy vẽ 100 trong số này để nhớ lại chính xác những gì chúng ta đang xem

Trong 19]

# Generate some data
from sklearn.datasets.samples_generator import make_blobs
X, y_true = make_blobs[n_samples=400, centers=4,
                       cluster_std=0.60, random_state=0]
X = X[:, ::-1] # flip axes for better plotting
9

We are near 1. 800 chữ số trong 64 chiều và chúng tôi có thể xây dựng một GMM trên đỉnh này để tạo ra nhiều thứ hơn. GMM có thể gặp khó khăn trong cuộc hội tụ trong một không gian có chiều cao như vậy, vì vậy chúng tôi sẽ bắt đầu với một thuật toán giảm kích thước không thể đảo ngược trên dữ liệu. Ở đây chúng tôi sẽ sử dụng PCA đơn giản, yêu cầu nó bảo đảm tồn tại 99% phương sai trong dữ liệu dự kiến

Trong 20]

# Plot the data with K Means Labels
from sklearn.cluster import KMeans
kmeans = KMeans[4, random_state=0]
labels = kmeans.fit[X].predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];
0

Kết quả là 41 chiều, giảm gần 1/3 mà hầu như không mất thông tin. Với dữ liệu dự kiến ​​này, chúng ta hãy sử dụng AIC để có được thước đo cho lượng thành phần GMM chúng ta nên sử dụng

Trong [21]

# Plot the data with K Means Labels
from sklearn.cluster import KMeans
kmeans = KMeans[4, random_state=0]
labels = kmeans.fit[X].predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];
1

AIC size as interval 110 thành phần giảm thiểu; . Hãy nhanh chóng phù hợp với dữ liệu này và xác nhận rằng nó đã hội tụ

Trong [22]

# Plot the data with K Means Labels
from sklearn.cluster import KMeans
kmeans = KMeans[4, random_state=0]
labels = kmeans.fit[X].predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];
2

Bây giờ chúng ta có thể vẽ các mẫu bao gồm 100 điểm mới trong không gian dự kiến ​​41 chiều này, sử dụng GMM làm mô hình tổng thể

Trong [23]

# Plot the data with K Means Labels
from sklearn.cluster import KMeans
kmeans = KMeans[4, random_state=0]
labels = kmeans.fit[X].predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];
3

Cuối cùng, chúng ta có thể sử dụng các biến nghịch đảo của các đối tượng PCA để xây dựng các số mới

Trong [24]

# Plot the data with K Means Labels
from sklearn.cluster import KMeans
kmeans = KMeans[4, random_state=0]
labels = kmeans.fit[X].predict[X]
plt.scatter[X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis'];
4

Kết quả cho hầu hết các phần trông giống như các chữ số hợp lý từ bộ dữ liệu

Vui lòng xem xét những gì chúng tôi đã làm ở đây. Đưa ra một mẫu chữ số viết tay, chúng tôi đã mô hình hóa phân phối dữ liệu theo cách mà chúng tôi có thể tạo ra các mẫu chữ số mới từ dữ liệu. đó là "chữ số viết tay" không riêng Xuất hiện trong bộ dữ liệu ban đầu, nhưng thay vào đó nắm bắt các tính năng chung của dữ liệu đầu vào theo mô hình của mô hình hỗn hợp. Một mô hình tổng thể của các chữ số như vậy có thể chứng minh rất hữu ích như là một phần của một phân loại tổng hợp Bayes, như chúng ta sẽ thấy trong phần tiếp theo

Chủ Đề