Sơ đồ lưới trong python

Lĩnh vực học máy có thể được chia thành ba loại học tập. học tập có giám sát, học tập không giám sát và học cố. Mặc dù học tập được giám sát có thể được sử dụng để phân loại hoặc phân tích dữ liệu phản hồi quy định, việc học tập không giám sát được sử dụng để tìm cấu trúc ẩn trong dữ liệu. Dữ liệu được sử dụng trong tập tin học tập không giám sát không chứa bất kỳ nhãn nào. Phân tích thành phần nguyên tắc [PCA], phân tách giá trị số ít [SVD], phân cụm K-MEANS, phân cụm K-Medoid và phân cụm tối đa hóa kỳ vọng [EM] là một số thuật toán học tập được

Thuật toán EM mô hình dữ liệu được tạo ra bởi sự kết hợp Gaussian. Thuật toán EM ước tính các tham số của ma trận trung bình và hiệp phương sai] của mỗi Gaussian. Mỗi Gaussian định nghĩa một cụm dữ liệu duy nhất. Sự khác biệt chính giữa thuật toán EM và K-means là, trong tư cách thành viên thuật toán EM cho một cụm từ là một phần

Giả sử chúng ta có hàm f như vậy,

Sau đó, biểu đồ của hàm mật độ này và Gaussian được trang bị sẽ trông giống như thế này

Hình 1. F[x] và Gaussian đã được trang bị.

Trong hình trên, nó hiển thị Gaussian được trang cho dữ liệu đã cho. Và rõ ràng, đó là một sự phù hợp rất đáng tiếc. Nhìn chung, Gaussian có các thuộc tính dẫn đến tính toán như chỉ học hai tham số [và], và do đó, nó yêu cầu đào tạo số liệu để tính toán. Tuy nhiên, đối với một số dữ liệu, Gaussian chỉ không phù hợp. sự hợp nhất của Gaussian thường là một giải pháp tốt hơn. Họ vẫn yêu cầu tham số tương đối ít để ước lượng và do đó có thể được học từ lượng dữ liệu tương đối nhỏ. Chúng có thể phù hợp với phân phối dữ liệu thực tế khá tốt. Hỗn hợp của Gaussian đôi khi là một giải pháp tốt hơn. Chúng vẫn yêu cầu tương đối ít tham số để ước tính và do đó có thể học được từ lượng dữ liệu tương đối nhỏ. Chúng có thể phù hợp với phân phối dữ liệu thực tế khá tốt. Hỗn hợp của Gaussian đôi khi là một giải pháp tốt hơn. Chúng vẫn yêu cầu tương đối ít tham số để ước tính và do đó có thể học được từ lượng dữ liệu tương đối nhỏ. Chúng có thể phù hợp với phân phối dữ liệu thực tế khá tốt

Thuật toán tối đa hóa kỳ vọng bao gồm ba bước. Khởi tạo, E-Step, M-bước. Đầu tiên, chúng tôi phân chia ngẫu nhiên bộ dữ liệu thành K khác nhau và chúng tôi bắt đầu bằng Mstep để tìm trọng số, trung bình và ma trận hiệp phương sai. Chúng tôi sử dụng các giá trị đó và áp dụng E-Step. Chúng tôi tiếp tục lặp qua hai bước này cho đến khi một số điều kiện ngưỡng đã trả lời

Giả sử chúng ta có một bộ dữ liệu với N hàng và thuộc tính D. Đặt k là cụm số. Set x_1, x_2, xông, x_n là màn d-. Sau đó, x_i = [x_i, 1, x_i, 2, phạm vi, x_i, d], trong đó mỗi x_i, j là một số thực

Khởi tạo

Đầu tiên, chúng tôi khởi động việc tạo ra một tầm nhìn trọng lượng với kích thước K. Sau đó, chúng tôi tạo một mảng 2D bao gồm các giá trị trung bình với kích thước k x d. Trong đó mỗi hàng chứa giá trị trung bình cho mỗi Gaussian. Sau đó, chúng tôi tạo một mảng 3D để lưu trữ các giá trị cho ma trận hiệp phương sai với kích thước k x d x d. Trong đó, mỗi đại diện cho một ma trận hiệp phương sai d x d cho mỗi Gaussian. Bây giờ, chúng tôi chỉ định ngẫu nhiên dữ liệu cho mỗi Gaussian với ma trận xác định 2D là N X K. At where, n is a number of data we have. Mã Python cho giai đoạn khởi tạo được hiển thị bên dưới

Khởi tạo

M-Bước

Đầu tiên, chúng tôi khởi động việc tạo ra một tầm nhìn trọng lượng với kích thước K. Sau đó, chúng tôi tạo một mảng 2D bao gồm các giá trị trung bình với kích thước k x d. Trong đó mỗi hàng chứa giá trị trung bình cho mỗi Gaussian. Sau đó, chúng tôi tạo một mảng 3D để lưu trữ các giá trị cho ma trận hiệp phương sai với kích thước k x d x d. Trong đó, mỗi đại diện cho một ma trận hiệp phương sai d x d cho mỗi Gaussian. Bây giờ, chúng tôi chỉ định ngẫu nhiên dữ liệu cho mỗi Gaussian với ma trận xác định 2D là N X K. At where, n is a number of data we have. Mã Python cho giai đoạn khởi tạo được hiển thị bên dưới

Trong bước M, chúng tôi sử dụng các thông số xác thực mà chúng tôi đã khởi tạo trước đó để tìm trọng số, trung bình và ma trận hiệp phương sai của mỗi Gaussian bằng các phương pháp sau. 2. Ý nghĩa của một Gaussian 3. Trọng lượng của một Guassian2. Ý nghĩa của một Gaussian 3. Trọng lượng của một Gaussian

1. Ma trận sai lầm của Gaussian2. Trung bình của Gaussian 3. Trọng lượng của một người đàn ông

bước điện tử

Sử dụng việc thực hiện các phương trình trên, chúng tôi sẽ nhận được giá trị cập nhật của các trọng số, trung bình và ma trận hiệp phương sai cho tất cả Gaussian. Mã Python cho m-bước được hiển thị bên dưới

Trong bước điện tử, chúng tôi sẽ sử dụng ma trận trọng số, trung bình và hiệp phương sai để điều chỉnh các giá trị hiệu suất bằng công thức tính toán Gaussian được hiển thị bên dưới

Trong phương thức trên, E là hiệp phương sai và U là giá trị trung bình. Bây giờ hiệu suất mới sẽ được tính như sau

Specify data x in I Gaussian

Mã Python cho E-Step được hiển thị bên dưới

Thress điều kiện

Cuối cùng, chúng tôi tính toán khả năng ký nhật ký của dữ liệu sau mỗi lần lặp lại bằng phương thức sau và chúng tôi tiếp tục lặp lại M-Step và E-Step cho đến khi Last_Log_Likelihad = log_likelihip

Kết luận

Giới thiệu người

Director, Christopher M. Get the pattern and learning machine. Springer-Verlag New York, 2016

By Tobias Schlagenhauf. Edit the end of the end. 22 tháng 2 năm 2022. Tobias Schlagenhauf. Sửa đổi lần cuối. 22 Th02 2022

Trên trang này

Bối cảnh và khái niệm chính

Thuật toán mô hình hỗn hợp Gaussian [GMM] là một thuật toán học không được giám sát vì chúng tôi không biết bất kỳ giá trị nào của tính năng đích. Hơn nữa, GMM được phân loại thành các thuật toán phân cụm thuật toán, bởi vì nó có thể được sử dụng để tìm kiếm các cụm từ trong dữ liệu. Các khái niệm chính mà bạn nên nghe về là

  • Gaussian multi-distribution
  • sai hiệp phương ma trận
  • Vectơ trung bình của dữ liệu đa biến

Các mô hình hỗn hợp Gaussian là gì

Chúng tôi muốn sử dụng các mô hình hỗn hợp Gaussian để tìm các cụm từ trong bộ dữ liệu mà chúng tôi biết [hoặc giả sử dụng để biết] số lượng cụm từ được đặt trong bộ dữ liệu này, nhưng chúng tôi cũng không biết các cụm từ này. . Tìm kiếm các cụm từ này là nhiệm vụ của GMM và bởi vì chúng tôi không có bất kỳ thông tin nào thay vì số lượng cụm từ, GMM là một cách tiếp cận không giám sát. Để thực hiện điều đó, chúng tôi cố gắng phù hợp với hỗn hợp Gaussian vào bộ dữ liệu của chúng tôi. Đó là, chúng tôi cố gắng tìm một số phân phối Gaussian có thể được sử dụng để mô tả hình dạng của bộ dữ liệu của chúng tôi. Một điểm quan trọng cho sự hiểu biết là các cụm hình Gaussian này không được định hình tròn như trong cách tiếp cận KNN nhưng có thể có tất cả các hình dạng phân phối Gaussian đa biến có thể thực hiện được. Đó là, một vòng tròn chỉ có thể thay đổi trong đường kính của nó khi mô hình GMM có thể [vì ma trận hiệp phương sai của nó] cũng là tất cả các dạng elipsoid. Xem hình minh họa sau đây để chọn một ví dụ trong không gian hai chiều

Những thứ tôi đã loại bỏ trong hình minh họa này là vị trí trong không gian của các mô hình KNN và GMM được xác định bởi tầm nhìn trung bình của họ. Do đó, kênh trung bình cho không gian trong khi đường kính tương ứng, tạo ra hiệp định sai định dạng của các mô hình KNN và GMM

Vì vậy, nếu chúng ta xem xét một bộ dữ liệu tùy chọn như sau

Làm thế nào chính xác chúng ta có thể phù hợp với một mô hình KNN với loại dữ liệu này, nếu chúng ta cho rằng có hai cụm từ trong bộ dữ liệu? . Điều này thực tế là các cụm từ KNN có hình tròn khi dữ liệu có hình elipsoid. Thậm chí có thể xảy ra trường hợp KNN hoàn toàn thất bại như được minh họa trong hình sau

Nếu chúng ta phù hợp với ellipsoids với dữ liệu, như chúng ta thực hiện với phương pháp GMM, chúng ta sẽ có thể mô hình hóa dữ liệu tốt, như được minh họa trong hình sau

Một điểm khác của KNN ở dạng ban đầu là mỗi điểm được phân bổ cho một cụm, nghĩa là mỗi điểm thuộc cụm một hoặc hai trong ví dụ của chúng tôi. Vì vậy, giả sử, chúng tôi thêm một số dữ liệu khác vào giữa hai cụm trong hình minh họa của chúng tôi ở trên. Như bạn có thể thấy, chúng ta vẫn có thể cho rằng có hai cụm, nhưng trong khoảng trống giữa hai cụm là một số điểm mà chúng không hoàn toàn rõ ràng về những cụm mà chúng thuộc về. Việc giải quyết bộ dữ liệu này bằng cách tiếp cận KNN cổ điển sẽ dẫn đến kết quả, rằng mỗi DataPoint được phân bổ để phân cụm một hoặc cụm hai tương ứng và theo đó thuật toán KNN sẽ tìm thấy một đường cắt phần cứng giữa . Mặc dù, như bạn có thể thấy, điều này có thể không chính xác đối với tất cả các dữ liệu vì chúng tôi sẽ nói rằng ví dụ DataPoint 1 có xác suất 60% thuộc về cụm từ một và quan trọng là 40% thuộc về cụm từ hai. Do đó, chúng tôi muốn gán hiệu suất cho các điểm dữ liệu

Trong trường hợp như vậy, một cách tiếp cận KNN cổ điển là khá vô dụng và chúng ta cần một cái gì đó, hãy nói linh hoạt hơn hoặc tốt hơn. trong đó thêm nhiều khả năng vào cụm từ của chúng tôi. May mắn thay, GMM là một mô hình như vậy. Bởi vì chúng tôi không chỉ đơn giản là cố gắng mô hình hóa dữ liệu bằng các vòng tròn mà còn thêm Gaussian vào dữ liệu của chúng tôi, điều này cho phép chúng tôi phân bổ cho từng điểm có khả năng thuộc về mỗi người Gaussian. Rõ ràng, và chúng tôi biết rằng một Datapoint càng gần với một Gaussian, khả năng điểm này thực sự thuộc về Gaussian này càng cao và càng ít xác thực rằng điểm này thuộc về Gaussian khác. Do đó, hãy xem phần đánh giá minh họa sau đó chúng tôi đã thêm GMM vào dữ liệu và điểm được sáng tạo 2. Điểm này có nhiều khả năng thuộc về cụm/Gaussian [C1] hơn so với cụm/Gaussian hai [C2]. Do đó, nếu chúng ta tính toán xác định điểm này cho từng cụm, chúng ta sẽ nhận được smth. Same as. với xác suất 99%, điểm này thuộc về một cụm từ và với xác suất 1% cho cụm từ hai

Vì vậy, hãy nhanh chóng tóm tắt và tóm tắt lại trong trường hợp mà chúng tôi muốn sử dụng GMM theo cách tiếp cận KNN cổ điển. Nếu chúng ta có dữ liệu trong đó chúng ta giả sử rằng các cụm từ không được xác định bởi các vòng tròn đơn giản mà bởi các hình dạng ellipsoid phức tạp hơn, chúng ta thích cách tiếp cận GMM theo cách tiếp cận KNN. Ngoài ra, nếu chúng ta muốn có các đường cắt phần mềm và theo hiệu suất, nghĩa là, nếu chúng ta muốn biết hiệu suất của một điểm dữ liệu để thuộc về từng cụm từ của chúng ta, chúng ta sẽ thích GMM hơn phương pháp KNN. Do đó, nếu phát sinh hai xác định Buzz từ và không mạch trong cuộc thảo luận tranh luận lựa chọn mô hình của chúng tôi, chúng tôi nên kiểm tra mạnh mẽ việc sử dụng GMM

Vì vậy, bây giờ chúng ta biết rằng chúng ta nên kiểm tra cách sử dụng phương pháp GMM nếu chúng ta muốn phân tích bổ sung cho các cụm từ của mình hoặc nếu có các cụm từ không mạch, chúng ta nên xem chúng ta có thể làm như thế nào . Điều này được bắt nguồn trong phần tiếp theo của hướng dẫn này. Too many for that. chúng tôi đang làm theo một cách tiếp cận được gọi là tối đa hóa kỳ vọng [EM]

Toán học phía sau các mô hình hỗn hợp Gaussian [GMM]

Để hiểu các thuật toán học đằng sau khái niệm GMM, tôi thực sự khuyên bạn nên xem video của Giáo sư Alexander Ihler về các mô hình hỗn hợp Gaussian và EM. Video này cung cấp một cái nhìn sâu sắc và hoàn hảo về những gì đang diễn ra trong quá trình tính toán GMM và tôi muốn xây dựng các bước sau trên video đầu tiên đó. Sau khi bạn có phần màu đỏ trên và xem video này, bạn sẽ hiểu mã giả sau

Vì vậy, chúng tôi biết rằng chúng tôi phải chạy E-Bước và M-Bước lặp đi lặp lại và tối đa hóa hàm khả năng nhật ký cho đến khi nó hội tụ. Mặc dù vậy, chúng tôi sẽ đi sâu vào chi tiết hơn về những gì đang diễn ra trong hai bước này và cách chúng tôi có thể tính toán điều này trong Python cho một và nhiều bộ dữ liệu lớn hơn

Tôi sẽ nhanh chóng hiển thị các bước E, M ở đây

  1. Quyết định có nhiều nguồn/cụm [c] bạn muốn phù hợp với dữ liệu của mình
  2. Khởi tạo các tham số có nghĩa là $ \mu_c$, hiệp phương sai $ \ sigma_c $ và frecy_per_class $ \ pi_c $ mỗi cụm C C

$ \ Gạch dưới {Bước điện tử} $

  1. Tính toán cho từng datapoint $x_i $ xác định $r_{ic}$ mà datapoint $x_i$ thuộc về cụm C với

    $$ r_ {ic} = \ frac {\ pi_c n [\ boldsymbol {x_i} \. \ \ \ \. }] $ mô tả Gaussian đa biến với

    $$ n [\ boldsymbol {x_i}, \ boldsymbol {\ mu_c}, \ boldsymbol {\ sigma_c}] \ = \ \ frac {1} {[2 \ \ Sigma_c. ^{\ frac {1}} {2}}}} exp [-\ frac {1} {2} [ 1}} [\ boldsymbol {x_i}-\ boldsymbol {\ mu_c}]] $$

    $ r_ {ic} $ cung cấp cho chúng tôi cho mỗi datapoint $ x_i $ số đo của. $ \ frac {xác suất \ that \ x_i \ thuộc về \ to \ class \ c} {xác suất \ của \ x_i Do đó, nếu $ x_i $ rất gần với một Gaussian C, nó sẽ nhận được giá trị $ R_ {

    $ \ gạch dưới {m-bước} $

    Đối chiếu với từng cụm từ C. Tính tổng trọng lượng $ m_c $ [nói một cách chậm trễ Tỷ lệ các điểm được phân bổ cho cụm C] và cập nhật $ \ pi_c $, $ \ mu_c $ và $ \ sigma_c $ bằng $ r_ {ic} $ với $ r_ {ic} $ với

    $$ m_c \ = \ \ sigma_i r_ {ic} $$

    $$ \ pi_c \ = \ \ frac {m_c} {M} $$

    $$ \ boldsymbol {\ mu_c} \ = \ \ frac {1} {m_c} \ sigma_i r_ {ic} \ w

    $$ \ boldsymbol {\ sigma_c} \ = \ \ frac {1} {m_c} \ sigma_i r_ {ic} [\ boldsymbol {x_i}-\ {\ mu_c}] $$

    Hãy nhớ rằng bạn phải sử dụng các phương tiện cập nhật tiện ích trong công thức cuối cùng này

    lặp lại lặp lại bước E và M để đến khi hàm khả năng nhật ký của mô hình của chúng tôi hội tụ trong đó khả năng đăng nhập được tính toán với toán học

    $$ ln \ p [\ boldsymbol {x} \. \ \ boldsymbol {\ pi}, \ boldsymbol \ Sigma_ {k = 1}^k \ pi_k n [\ boldsymbol {x_i} \. \ \ \ boldsymbol {\ mu_k}, \ boldsymbol {\ sigma_k}] $$

Dao create Python live

Các khóa học trực tuyến sắp tới

Ghi danh ở đây

Gmm in python from the start

Để hiểu làm thế nào chúng ta có thể thực hiện những điều trên trong Python, tốt nhất chúng ta sẽ trải nghiệm qua các bước duy nhất, từng bước. Do đó, chúng tôi tốt nhất bắt đầu với vấn đề sau

Bạn có thể nói gì về dữ liệu này không? . Hơn nữa, chúng tôi biết rằng mục tiêu của chúng tôi là tự động phù hợp với Gaussians [trong trường hợp này là ba] cho bộ dữ liệu này. Bây giờ, trước hết, hãy vẽ ba Gaussian được vẽ ngẫu nhiên lên trên dữ liệu đó và xem liệu điều này có mang lại cho chúng ta điều gì nữa không

Chúng ta có những gì bây giờ? . Hãy nhớ rằng chúng tôi muốn có ba mô hình Gaussian được trang bị cho ba cụm dữ liệu của chúng tôi. Vì vậy, làm thế nào chúng ta có thể khiến ba người Ga -toan được chọn ngẫu nhiên này tự động phù hợp với dữ liệu? . Cách tiếp cận này, về mặt gốc, có thể được sử dụng cho nhiều mô hình khác nhau nhưng hóa ra nó đặc biệt phổ biến cho công việc phù hợp với một loạt các Gaussian với dữ liệu. Tôi sẽ không đi sâu vào chi tiết về thuật toán EM chính và sẽ chỉ nói về ứng dụng của nó cho GMM. Nếu bạn muốn đọc thêm về nó, tôi đề xuất chương trình về Tuyên bố chung về thuật toán EM trong Mitchel [1997] tr. 194. Nhưng đừng hoảng sợ, về nguyên tắc, nó luôn hoạt động giống nhau

Ok, bây giờ chúng tôi biết rằng chúng tôi muốn sử dụng một cuộc gọi thứ là tối đa hóa kỳ vọng. Thuật ngữ này bao gồm hai phần. kỳ vọng và tối đa. Chà, làm thế nào chúng ta có thể kết hợp dữ liệu và ở trên Gaussian được vẽ ngẫu nhiên với kỳ vọng thuật ngữ đầu tiên? . Bởi vì chúng tôi phải lưu trữ các hiệu suất này ở đâu đó, chúng tôi giới thiệu một biến mới và gọi biến này $ r $. Chúng tôi sử dụng $R$ cho mục đích thuận lợi để có một thùng chứa nơi chúng tôi có thể lưu trữ các tài liệu quan trọng mà DataPoint $x_i$ thuộc về Gaussian $c$. Chúng tôi biểu thị xác thực này với $ R_ {IC} $. Những gì chúng tôi nhận được là kết quả là một mảng NXK trong đó n biểu thị số lượng dữ liệu trong $ x $ và k biểu thị số lượng cụm/gaussians. HM Hãy thử điều này cho dữ liệu của chúng tôi và xem những gì chúng tôi nhận được

import numpy as np
from scipy.stats import norm
np.random.seed[0]

X = np.linspace[-5,5,num=20]
X0 = X*np.random.rand[len[X]]+10 # Create data cluster 1
X1 = X*np.random.rand[len[X]]-10 # Create data cluster 2
X2 = X*np.random.rand[len[X]] # Create data cluster 3
X_tot = np.stack[[X0,X1,X2]].flatten[] # Combine the clusters to get the random datapoints from above



"""Create the array r with dimensionality nxK"""
r = np.zeros[[len[X_tot],3]]  
print['Dimensionality','=',np.shape[r]]

"""Instantiate the random gaussians"""

gauss_1 = norm[loc=-5,scale=5] 
gauss_2 = norm[loc=8,scale=3]
gauss_3 = norm[loc=1.5,scale=1]

"""
Probability for each datapoint x_i to belong to gaussian g 
"""
for c,g in zip[range[3],[gauss_1,gauss_2,gauss_3]]:
    r[:,c] = g.pdf[X_tot] # Write the probability that x belongs to gaussian c in column c. 
                          # Therewith we get a 60x3 array filled with the probability that each x_i belongs to one of the gaussians
"""
Normalize the probabilities such that each row of r sums to 1
"""
for i in range[len[r]]:
    r[i] = r[i]/np.sum[r,axis=1][i] 

"""In the last calculation we normalized the probabilites r_ic. So each row i in r gives us the probability for x_i 
to belong to one gaussian [one column per gaussian]. Since we want to know the probability that x_i belongs 
to gaussian g, we have to do smth. like a simple calculation of percentage where we want to know how likely it is in % that
x_i belongs to gaussian g. To realize this, we must dive the probability of each r_ic by the total probability r_i [this is done by 
summing up each row in r and divide each value r_ic by sum[np.sum[r,axis=1][r_i] ]]. To get this,
look at the above plot and pick an arbitrary datapoint. Pick one gaussian and imagine the probability that this datapoint
belongs to this gaussian. This value will normally be small since the point is relatively far away right? So what is
the percentage that this point belongs to the chosen gaussian? --> Correct, the probability that this datapoint belongs to this 
gaussian divided by the sum of the probabilites for this datapoint for all three gaussians."""
    
print[r]
print[np.sum[r,axis=1]] # As we can see, as result each row sums up to one, just as we want it.

ĐẦU RA

Dimensionality = [60, 3]
[[2.97644006e-02 9.70235407e-01 1.91912550e-07]
 [3.85713024e-02 9.61426220e-01 2.47747304e-06]
 [2.44002651e-02 9.75599713e-01 2.16252823e-08]
 [1.86909096e-02 9.81309090e-01 8.07574590e-10]
 [1.37640773e-02 9.86235923e-01 9.93606589e-12]
 [1.58674083e-02 9.84132592e-01 8.42447356e-11]
 [1.14191259e-02 9.88580874e-01 4.48947365e-13]
 [1.34349421e-02 9.86565058e-01 6.78305927e-12]
 [1.11995848e-02 9.88800415e-01 3.18533028e-13]
 [8.57645259e-03 9.91423547e-01 1.74498648e-15]
 [7.64696969e-03 9.92353030e-01 1.33051021e-16]
 [7.10275112e-03 9.92897249e-01 2.22285146e-17]
 [6.36154765e-03 9.93638452e-01 1.22221112e-18]
 [4.82376290e-03 9.95176237e-01 1.55549544e-22]
 [7.75866904e-03 9.92241331e-01 1.86665135e-16]
 [7.52759691e-03 9.92472403e-01 9.17205413e-17]
 [8.04550643e-03 9.91954494e-01 4.28205323e-16]
 [3.51864573e-03 9.96481354e-01 9.60903037e-30]
 [3.42631418e-03 9.96573686e-01 1.06921949e-30]
 [3.14390460e-03 9.96856095e-01 3.91217273e-35]
 [1.00000000e+00 2.67245688e-12 1.56443629e-57]
 [1.00000000e+00 4.26082753e-11 9.73970426e-49]
 [9.99999999e-01 1.40098281e-09 3.68939866e-38]
 [1.00000000e+00 2.65579518e-10 4.05324196e-43]
 [9.99999977e-01 2.25030673e-08 3.11711096e-30]
 [9.99999997e-01 2.52018974e-09 1.91287930e-36]
 [9.99999974e-01 2.59528826e-08 7.72534540e-30]
 [9.99999996e-01 4.22823192e-09 5.97494463e-35]
 [9.99999980e-01 1.98158593e-08 1.38414545e-30]
 [9.99999966e-01 3.43722391e-08 4.57504394e-29]
 [9.99999953e-01 4.74290492e-08 3.45975850e-28]
 [9.99999876e-01 1.24093364e-07 1.31878573e-25]
 [9.99999878e-01 1.21709730e-07 1.17161878e-25]
 [9.99999735e-01 2.65048706e-07 1.28402556e-23]
 [9.99999955e-01 4.53370639e-08 2.60841891e-28]
 [9.99999067e-01 9.33220139e-07 2.02379180e-20]
 [9.99998448e-01 1.55216175e-06 3.63693167e-19]
 [9.99997285e-01 2.71542629e-06 8.18923788e-18]
 [9.99955648e-01 4.43516655e-05 1.59283752e-11]
 [9.99987200e-01 1.28004505e-05 3.20565446e-14]
 [9.64689131e-01 9.53405294e-03 2.57768163e-02]
 [9.77001731e-01 7.96383733e-03 1.50344317e-02]
 [9.96373670e-01 2.97775078e-03 6.48579562e-04]
 [3.43634425e-01 2.15201653e-02 6.34845409e-01]
 [9.75390877e-01 8.19866977e-03 1.64104537e-02]
 [9.37822997e-01 1.19363656e-02 5.02406373e-02]
 [4.27396946e-01 2.18816340e-02 5.50721420e-01]
 [3.28570544e-01 2.14190231e-02 6.50010433e-01]
 [3.62198108e-01 2.16303800e-02 6.16171512e-01]
 [2.99837196e-01 2.11991858e-02 6.78963618e-01]
 [2.21768797e-01 2.04809383e-02 7.57750265e-01]
 [1.76497129e-01 2.01127714e-02 8.03390100e-01]
 [8.23252013e-02 2.50758227e-02 8.92598976e-01]
 [2.11943183e-01 2.03894641e-02 7.67667353e-01]
 [1.50351209e-01 2.00499057e-02 8.29598885e-01]
 [1.54779991e-01 2.00449518e-02 8.25175057e-01]
 [7.92109803e-02 5.93118654e-02 8.61477154e-01]
 [9.71905134e-02 2.18698473e-02 8.80939639e-01]
 [7.60625670e-02 4.95831879e-02 8.74354245e-01]
 [8.53513721e-02 2.40396004e-02 8.90609028e-01]]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

Vì vậy, bạn thấy rằng chúng tôi có một mảng $ r $ trong đó mỗi hàng chứa xác suất $ x_i $ thuộc về bất kỳ Gaussian $ nào $ g $. Do đó, với mỗi $x_i$, chúng tôi có ba xác định, một cho mỗi Gaussian $g$. Ok, rất tốt cho bây giờ. Bây giờ chúng tôi có ba xác định cho mỗi $ x_i $ và điều đó tốt. Tóm tắt lại mục tiêu ban đầu của chúng tôi. Chúng tôi muốn phù hợp với nhiều người Gauss với dữ liệu như chúng tôi mong đợi các cụm từ trong bộ dữ liệu. Bây giờ, có lẽ đó là trường hợp một cụm bao gồm nhiều dữ liệu hơn như một cụm khác và theo đó xác định rõ ràng cho mỗi $ x_i $ thuộc về cụm "lớn" này lớn hơn nhiều so với một trong những người khác. Làm thế nào chúng tôi có thể giải quyết vấn đề này trong mã trên của chúng tôi? . Chúng tôi biểu thị biến này với $ \ pi_c $

Đối với mục đích minh họa, hãy xem hình sau

Vì vậy, như bạn có thể thấy, các điểm được phân phối xấp xỉ bằng nhau trên hai cụm và do đó mỗi $ \ mu_c $ là $ \ xấp xỉ $ 0,5 $. Ví dụ, nếu các phân số được phân phối không đồng đều hơn nếu chỉ có hai Datapoints thuộc cụm 1, chúng ta sẽ có nhiều hơn $ \ mu $ '. Các phân số phải đến một số. Vì vậy, hãy thực hiện các lớp có số quan trọng này trong mã của chúng tôi ở trên. Bởi vì chúng tôi không biết giá trị thực tế cho $ MU $ của chúng tôi, chúng tôi cũng phải đặt các giá trị tùy ý. Chúng tôi sẽ đặt cả $ \ mu_c $ 0,5 ở đây và do đó chúng tôi không nhận được bất kỳ kết quả nào khác như trên vì các điểm được cho là được phân phối đều trên hai cụm c

import matplotlib.pyplot as plt
from matplotlib import style
style.use['fivethirtyeight']
import numpy as np
from scipy.stats import norm
np.random.seed[0]

X = np.linspace[-5,5,num=20]
X0 = X*np.random.rand[len[X]]+10 # Create data cluster 1
X1 = X*np.random.rand[len[X]]-10 # Create data cluster 2
X2 = X*np.random.rand[len[X]] # Create data cluster 3
X_tot = np.stack[[X0,X1,X2]].flatten[] # Combine the clusters to get the random datapoints from above



"""Create the array r with dimensionality nxK"""
r = np.zeros[[len[X_tot],3]]  
print['Dimensionality','=',np.shape[r]]

"""Instantiate the random gaussians"""

gauss_1 = norm[loc=-5,scale=5] 
gauss_2 = norm[loc=8,scale=3]
gauss_3 = norm[loc=1.5,scale=1]

"""Instantiate the random pi_c"""
pi = np.array[[1/3,1/3,1/3]] # We expect to have three clusters 


"""
Probability for each datapoint x_i to belong to gaussian g 
"""
for c,g,p in zip[range[3],[gauss_1,gauss_2,gauss_3],pi]:
    r[:,c] = p*g.pdf[X_tot] # Write the probability that x belongs to gaussian c in column c. 
                          # Therewith we get a 60x3 array filled with the probability that each x_i belongs to one of the gaussians
"""
Normalize the probabilities such that each row of r sums to 1 and weight it by pi_c == the fraction of points belonging to 
cluster c
"""
for i in range[len[r]]:
    r[i] = r[i]/[np.sum[pi]*np.sum[r,axis=1][i]]

"""In the last calculation we normalized the probabilites r_ic. So each row i in r gives us the probability for x_i 
to belong to one gaussian [one column per gaussian]. Since we want to know the probability that x_i belongs 
to gaussian g, we have to do smth. like a simple calculation of percentage where we want to know how likely it is in % that
x_i belongs to gaussian g. To realize this we must dive the probability of each r_ic by the total probability r_i [this is done by 
summing up each row in r and divide each value r_ic by sum[np.sum[r,axis=1][r_i] ]]. To get this,
look at the above plot and pick an arbitrary datapoint. Pick one gaussian and imagine the probability that this datapoint
belongs to this gaussian. This value will normally be small since the point is relatively far away right? So what is
the percentage that this point belongs to the chosen gaussian? --> Correct, the probability that this datapoint belongs to this 
gaussian divided by the sum of the probabilites for this datapoint and all three gaussians. Since we don't know how many
point belong to each cluster c and threwith to each gaussian c, we have to make assumptions and in this case simply said that we 
assume that the points are equally distributed over the three clusters."""
    
print[r]
print[np.sum[r,axis=1]] # As we can see, as result each row sums up to one, just as we want it.

ĐẦU RA

Dimensionality = [60, 3]
[[2.97644006e-02 9.70235407e-01 1.91912550e-07]
 [3.85713024e-02 9.61426220e-01 2.47747304e-06]
 [2.44002651e-02 9.75599713e-01 2.16252823e-08]
 [1.86909096e-02 9.81309090e-01 8.07574590e-10]
 [1.37640773e-02 9.86235923e-01 9.93606589e-12]
 [1.58674083e-02 9.84132592e-01 8.42447356e-11]
 [1.14191259e-02 9.88580874e-01 4.48947365e-13]
 [1.34349421e-02 9.86565058e-01 6.78305927e-12]
 [1.11995848e-02 9.88800415e-01 3.18533028e-13]
 [8.57645259e-03 9.91423547e-01 1.74498648e-15]
 [7.64696969e-03 9.92353030e-01 1.33051021e-16]
 [7.10275112e-03 9.92897249e-01 2.22285146e-17]
 [6.36154765e-03 9.93638452e-01 1.22221112e-18]
 [4.82376290e-03 9.95176237e-01 1.55549544e-22]
 [7.75866904e-03 9.92241331e-01 1.86665135e-16]
 [7.52759691e-03 9.92472403e-01 9.17205413e-17]
 [8.04550643e-03 9.91954494e-01 4.28205323e-16]
 [3.51864573e-03 9.96481354e-01 9.60903037e-30]
 [3.42631418e-03 9.96573686e-01 1.06921949e-30]
 [3.14390460e-03 9.96856095e-01 3.91217273e-35]
 [1.00000000e+00 2.67245688e-12 1.56443629e-57]
 [1.00000000e+00 4.26082753e-11 9.73970426e-49]
 [9.99999999e-01 1.40098281e-09 3.68939866e-38]
 [1.00000000e+00 2.65579518e-10 4.05324196e-43]
 [9.99999977e-01 2.25030673e-08 3.11711096e-30]
 [9.99999997e-01 2.52018974e-09 1.91287930e-36]
 [9.99999974e-01 2.59528826e-08 7.72534540e-30]
 [9.99999996e-01 4.22823192e-09 5.97494463e-35]
 [9.99999980e-01 1.98158593e-08 1.38414545e-30]
 [9.99999966e-01 3.43722391e-08 4.57504394e-29]
 [9.99999953e-01 4.74290492e-08 3.45975850e-28]
 [9.99999876e-01 1.24093364e-07 1.31878573e-25]
 [9.99999878e-01 1.21709730e-07 1.17161878e-25]
 [9.99999735e-01 2.65048706e-07 1.28402556e-23]
 [9.99999955e-01 4.53370639e-08 2.60841891e-28]
 [9.99999067e-01 9.33220139e-07 2.02379180e-20]
 [9.99998448e-01 1.55216175e-06 3.63693167e-19]
 [9.99997285e-01 2.71542629e-06 8.18923788e-18]
 [9.99955648e-01 4.43516655e-05 1.59283752e-11]
 [9.99987200e-01 1.28004505e-05 3.20565446e-14]
 [9.64689131e-01 9.53405294e-03 2.57768163e-02]
 [9.77001731e-01 7.96383733e-03 1.50344317e-02]
 [9.96373670e-01 2.97775078e-03 6.48579562e-04]
 [3.43634425e-01 2.15201653e-02 6.34845409e-01]
 [9.75390877e-01 8.19866977e-03 1.64104537e-02]
 [9.37822997e-01 1.19363656e-02 5.02406373e-02]
 [4.27396946e-01 2.18816340e-02 5.50721420e-01]
 [3.28570544e-01 2.14190231e-02 6.50010433e-01]
 [3.62198108e-01 2.16303800e-02 6.16171512e-01]
 [2.99837196e-01 2.11991858e-02 6.78963618e-01]
 [2.21768797e-01 2.04809383e-02 7.57750265e-01]
 [1.76497129e-01 2.01127714e-02 8.03390100e-01]
 [8.23252013e-02 2.50758227e-02 8.92598976e-01]
 [2.11943183e-01 2.03894641e-02 7.67667353e-01]
 [1.50351209e-01 2.00499057e-02 8.29598885e-01]
 [1.54779991e-01 2.00449518e-02 8.25175057e-01]
 [7.92109803e-02 5.93118654e-02 8.61477154e-01]
 [9.71905134e-02 2.18698473e-02 8.80939639e-01]
 [7.60625670e-02 4.95831879e-02 8.74354245e-01]
 [8.53513721e-02 2.40396004e-02 8.90609028e-01]]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

Vì vậy, đây là bước kỳ vọng. Hãy nhanh chóng tóm tắt lại những gì chúng ta đã làm và hãy sắp xếp những điều đó trên [với các màu sắc khác nhau để làm mục đích minh họa]

"""Plot the data"""

fig = plt.figure[figsize=[10,10]]
ax0 = fig.add_subplot[111]


for i in range[len[r]]:
    ax0.scatter[X_tot[i],0,c=np.array[[r[i][0],r[i][1],r[i][2]]],s=100] # We have defined the first column as red, the second as
                                                                        # green and the third as blue



for g,c in zip[[gauss_1.pdf[np.linspace[-15,15]],gauss_2.pdf[np.linspace[-15,15]],gauss_3.pdf[np.linspace[-15,15]]],['r','g','b']]:
    ax0.plot[np.linspace[-15,15],g,c=c,zorder=0]

    
    
plt.show[]

Vì vậy, trang ba mô hình Gaussian đã được chọn theo một cách tùy chọn cho bộ dữ liệu của chúng tôi. Do đó, chúng tôi đã giới thiệu một biến mới mà chúng tôi gọi là $r$ và trong đó chúng tôi đã lưu trữ dữ liệu quan trọng cho từng điểm $x_i$ để thuộc về Gaussian $g$ hoặc cụm từ C, tương ứng. Tiếp theo, chúng tôi đã vẽ các điểm $x_i$ và được tô màu theo kết quả của chúng tôi cho ba cụm từ. Bạn có thể thấy rằng các điểm có độ chính xác rất cao thuộc về một cụ thể Gaussian, có màu sắc của Gaussian này trong khi các điểm giữa hai Gaussian có màu sắc là sự kết hợp của màu sắc của Gaussian tương ứng

Vì vậy, trong một ký hiệu toán học hơn và cho các trường hợp đa chiều [tại đây, giá trị trung bình duy nhất $ \ mu $ để tính toán mỗi Gaussian thay đổi thành một màn trung bình $ \ boldsymbol {\ mu} . ] Bước kỳ vọng của thuật toán EM trông giống như

$ \ Gạch dưới {Bước điện tử} $

  1. Quyết định có bao nhiêu nguồn/cụm [c] bạn muốn phù hợp với dữ liệu của mình -> Hãy nhớ rằng mỗi cụm từ C được đại diện bởi Gaussian G
  2. Khởi tạo các tham số có nghĩa là $ \mu_c$, hiệp phương sai $ \ sigma_c $ và frecy_per_class $ \ pi_c $ mỗi cụm C C
  3. Tính toán cho từng datapoint $x_i $ xác định $r_{ic}$ mà datapoint $x_i$ thuộc về cụm C với

    $$ r_ {ic} = \ frac {\ pi_c n [\ boldsymbol {x_i} \. \ \ \ \. }] $ mô tả Gaussian đa biến với

    $$ n [\ boldsymbol {x_i}, \ boldsymbol {\ mu_c}, \ boldsymbol {\ sigma_c}] \ = \ \ frac {1} {[2 \ \ Sigma_c. ^{\ frac {1}} {2}}}} exp [-\ frac {1} {2} [ 1}} [\ boldsymbol {x_i}-\ boldsymbol {\ mu_c}]] $$

    $ r_ {ic} $ cung cấp cho chúng tôi cho mỗi datapoint $ x_i $ số đo của. $ \ frac {xác suất \ that \ x_i \ thuộc về \ to \ class \ c} {xác suất \ của \ x_i Do đó, nếu $ x_i $ rất gần với một Gaussian G, nó sẽ nhận được giá trị $ R_ {

    Tại sao điều này lại giúp chúng ta? . Chúng ta có thể làm gì với thông tin này? . Điều gì sẽ là kết quả của điều đó? . Quy trình này được gọi là bước tối đa hóa của thuật toán EM. Bước tối đa hóa trông như sau. Chúng ta có thể làm gì với thông tin này? . Điều gì sẽ là kết quả của điều đó? . Quy trình này được gọi là bước Cực đại hóa của thuật toán EM. Bước Tối đa hóa trông như sau.
    Chúng tôi có thể làm gì với thông tin này? . Điều gì sẽ là kết quả của điều đó? . Quy trình này được gọi là bước Cực đại hóa của thuật toán EM. Bước Tối đa hóa trông như sau.

    $ \ gạch dưới {m-bước} $

    Đối chiếu với từng cụm từ C. Tính tổng trọng lượng $ m_c $ [nói một cách chậm trễ Tỷ lệ các điểm được phân bổ cho cụm C] và cập nhật $ \ pi_c $, $ \ mu_c $ và $ \ sigma_c $ bằng $ r_ {ic} $ với $ r_ {ic} $ với

    $$ m_c \ = \ \ sigma_i r_ {ic} $$

    $$ \ pi_c \ = \ \ frac {m_c} {M} $$

    $$ \ boldsymbol {\ mu_c} \ = \ \ frac {1} {m_c} \ sigma_i r_ {ic} \ w

    \ \ boldsymbol {\ sigma_c} \ = \ \ sigma_i r_ {ic} [\ boldsymbol {x_i}-\ boldsymbol {\ mu_c}]

    Hãy nhớ rằng bạn phải sử dụng các phương tiện cập nhật tiện ích trong công thức cuối cùng này

    Vì vậy, ở đây $ m_c $ chỉ đơn giản là một phần của các điểm được phân bổ cho cụm c. Để hiểu điều này, giả sử rằng trong $r$ của chúng tôi, chúng tôi không có giá trị xác thực từ 0 đến 1 mà chỉ đơn giản là 0 hoặc 1. nghĩa là 1 nếu $x_i$ thuộc về $c$ và 0 nếu không [vì vậy mỗi hàng sẽ chứa một và hai 0 trong ví dụ của chúng tôi ở trên]. Trong trường hợp này, $ m_c $ sẽ chỉ đơn giản là số lượng 1S mỗi cột, nghĩa là số lượng $ x_i $ được phân bổ cho mỗi cụm $ c $. Nhưng vì chúng tôi có giá trị, chúng tôi không chỉ đơn giản là có những cái và số không nhưng tiền gốc là như nhau -> chúng tôi tổng hợp các giá trị $ r_IC $ trên tất cả những gì tôi có được $ m_c $. Sau đó, $ \ pi_c $ chỉ đơn giản là một phần của các điểm thuộc cụm từ C as on. Sau đó, chúng tôi tính toán giá trị trung bình mới [vectơ] $ \ boldsymbol {\ mu_c} $ bằng cách tổng hợp sản phẩm của mỗi giá trị $ x_i $ và xác định tương ứng mà điểm này thuộc về cụm C [$ . Hãy nhớ rằng nếu chúng ta có số không và các số không, thì đây sẽ là một tính toán trung bình hoàn toàn bình thường nhưng bởi vì chúng ta có thông tin xác thực, chúng ta chia sẻ cho tổng số thông tin xác thực này trên mỗi cụm từ c. Ngoài ra, ma trận hiệp phương sai mới [$ \ boldsymbol {\ sigma_c} $] được cập nhật bằng cách tính toán ma trận hiệp phương sai trên mỗi lớp C [$ \ boldsymbol {\ sigma_c} $] Chúng ta cũng có thể . hoặc 1. Nghĩa là, 1 nếu $x_i$ thuộc về $c$ và 0 nếu không [Vì vậy, mỗi hàng sẽ chứa một 1 và hai 0 trong ví dụ của chúng tôi ở trên]. Trong trường hợp này $m_c$ sẽ chỉ đơn giản là số bit 1 trên mỗi cột, nghĩa là số $x_i$ được phân bổ cho mỗi cụm $c$. Nhưng vì chúng ta có xác suất, nên chúng ta không chỉ có 1 và 0 mà nguyên gốc là như nhau --> Chúng ta cộng các xác suất $r_ic$ trên tất cả i để có được $m_c$. Sau đó, $\pi_c$ chỉ đơn giản là một phần của các điểm thuộc về cụm c như trên. Sau đó, chúng tôi tính giá trị trung bình mới [vectơ] $\boldsymbol{\mu_c}$ bằng cách tính tổng tích của từng giá trị $x_i$ và xác suất tương ứng mà điểm này thuộc cụm c [$r_{ic}$] rồi chia cho . Hãy nhớ rằng nếu chúng ta có số 0 và số 1, thì đây sẽ là phép tính trung bình hoàn toàn bình thường nhưng vì chúng ta có xác suất nên chúng ta chia cho tổng của các xác suất này trên mỗi cụm c. Ngoài ra, ma trận hiệp phương sai mới [$\boldsymbol{\Sigma_c}$] được cập nhật bằng cách tính toán ma trận hiệp phương sai trên mỗi lớp c [$\boldsymbol{\Sigma_c}$] có trọng số theo xác suất mà điểm $x_i$ thuộc về cụm c. Chúng ta cũng có thể viết $\boldsymbol{\Sigma_c}=m_c[\boldsymbol{x}-\boldsymbol{\mu_c}]^T[[\boldsymbol{x}-\boldsymbol{\mu_c}]]$. Vì vậy, hãy xem cốt truyện của chúng tôi nếu chúng tôi thực hiện các cập nhật ở trên, tức là chạy lần lặp EM đầu tiên. hoặc 1. Nghĩa là, 1 nếu $x_i$ thuộc về $c$ và 0 nếu không [Vì vậy, mỗi hàng sẽ chứa một 1 và hai 0 trong ví dụ của chúng tôi ở trên]. Trong trường hợp này $m_c$ sẽ chỉ đơn giản là số bit 1 trên mỗi cột, nghĩa là số $x_i$ được phân bổ cho mỗi cụm $c$. Nhưng vì chúng ta có xác suất, nên chúng ta không chỉ có 1 và 0 mà nguyên gốc là như nhau --> Chúng ta cộng các xác suất $r_ic$ trên tất cả i để có được $m_c$. Sau đó, $\pi_c$ chỉ đơn giản là một phần của các điểm thuộc về cụm c như trên. Sau đó, chúng tôi tính giá trị trung bình mới [vectơ] $\boldsymbol{\mu_c}$ bằng cách tính tổng tích của từng giá trị $x_i$ và xác suất tương ứng mà điểm này thuộc cụm c [$r_{ic}$] rồi chia cho . Hãy nhớ rằng nếu chúng ta có 0 và 1, đây sẽ là phép tính trung bình hoàn toàn bình thường nhưng vì chúng ta có xác suất nên chúng ta chia cho tổng của các xác suất này trên mỗi cụm c. Ngoài ra, ma trận hiệp phương sai mới [$\boldsymbol{\Sigma_c}$] được cập nhật bằng cách tính toán ma trận hiệp phương sai trên mỗi lớp c [$\boldsymbol{\Sigma_c}$] có trọng số theo xác suất mà điểm $x_i$ thuộc về cụm c. Chúng ta cũng có thể viết $\boldsymbol{\Sigma_c}=m_c[\boldsymbol{x}-\boldsymbol{\mu_c}]^T[[\boldsymbol{x}-\boldsymbol{\mu_c}]]$.
    vì vậy, hãy xem sơ đồ của chúng tôi nếu chúng tôi thực hiện các cập nhật ở trên, tức là chạy lần lặp EM đầu tiên.

import matplotlib.pyplot as plt
from matplotlib import style
style.use['fivethirtyeight']
import numpy as np
from scipy.stats import norm
np.random.seed[0]

X = np.linspace[-5,5,num=20]
X0 = X*np.random.rand[len[X]]+10 # Create data cluster 1
X1 = X*np.random.rand[len[X]]-10 # Create data cluster 2
X2 = X*np.random.rand[len[X]] # Create data cluster 3
X_tot = np.stack[[X0,X1,X2]].flatten[] # Combine the clusters to get the random datapoints from above

"""
E-Step
"""

"""Create the array r with dimensionality nxK"""
r = np.zeros[[len[X_tot],3]]  

"""Instantiate the random gaussians"""

gauss_1 = norm[loc=-5,scale=5] 
gauss_2 = norm[loc=8,scale=3]
gauss_3 = norm[loc=1.5,scale=1]

"""Instantiate the random mu_c"""
m = np.array[[1/3,1/3,1/3]] # We expect to have three clusters 

pi = m/np.sum[m]


"""
Probability for each datapoint x_i to belong to gaussian g 
"""
for c,g,p in zip[range[3],[gauss_1,gauss_2,gauss_3],pi]:
    r[:,c] = p*g.pdf[X_tot] # Write the probability that x belongs to gaussian c in column c. 
                          # Therewith we get a 60x3 array filled with the probability that each x_i belongs to one of the gaussians
"""
Normalize the probabilities such that each row of r sums to 1 and weight it by mu_c == the fraction of points belonging to 
cluster c
"""
for i in range[len[r]]:
    r[i] = r[i]/[np.sum[pi]*np.sum[r,axis=1][i]]


"""M-Step"""


"""calculate m_c"""
m_c = []
for c in range[len[r[0]]]:
    m = np.sum[r[:,c]]
    m_c.append[m] # For each cluster c, calculate the m_c and add it to the list m_c
    
"""calculate pi_c"""
pi_c = []
for m in m_c:
    pi_c.append[m/np.sum[m_c]] # For each cluster c, calculate the fraction of points pi_c which belongs to cluster c

"""calculate mu_c"""
mu_c = np.sum[X_tot.reshape[len[X_tot],1]*r,axis=0]/m_c


"""calculate var_c"""
var_c = []

for c in range[len[r[0]]]:
    var_c.append[[1/m_c[c]]*np.dot[[[np.array[r[:,c]].reshape[60,1]]*[X_tot.reshape[len[X_tot],1]-mu_c[c]]].T,[X_tot.reshape[len[X_tot],1]-mu_c[c]]]]
  

    
    
"""Update the gaussians"""

gauss_1 = norm[loc=mu_c[0],scale=var_c[0]] 
gauss_2 = norm[loc=mu_c[1],scale=var_c[1]]
gauss_3 = norm[loc=mu_c[2],scale=var_c[2]]



"""Plot the data"""

fig = plt.figure[figsize=[10,10]]
ax0 = fig.add_subplot[111]


for i in range[len[r]]:
    ax0.scatter[X_tot[i],0,c=np.array[[r[i][0],r[i][1],r[i][2]]],s=100] 


"""Plot the gaussians"""


for g,c in zip[[gauss_1.pdf[np.sort[X_tot].reshape[60,1]],gauss_2.pdf[np.sort[X_tot].reshape[60,1]],gauss_3.pdf[np.sort[X_tot].reshape[60,1]]],['r','g','b']]:
    ax0.plot[np.sort[X_tot],g,c=c]

    

    
plt.show[]

Vì vậy, như bạn có thể thấy sự xuất hiện của người Gaussian của họ, tôi đã thay đổi đáng kể sau lần lặp EM đầu tiên. Hãy cập nhật $R$ và minh họa màu sắc của các điểm

"""update r"""

"""
Probability for each datapoint x_i to belong to gaussian g 
"""
# Mind that we use the new pi_c here
for c,g,p in zip[range[3],[gauss_1,gauss_2,gauss_3],pi]:
    r[:,c] = p*g.pdf[X_tot] 
"""
Normalize the probabilities such that each row of r sums to 1 and weight it by mu_c == the fraction of points belonging to 
cluster c
"""
for i in range[len[r]]:
    r[i] = r[i]/[np.sum[pi_c]*np.sum[r,axis=1][i]]


"""Plot the data"""

fig = plt.figure[figsize=[10,10]]
ax0 = fig.add_subplot[111]



for i in range[len[r]]:
    ax0.scatter[X_tot[i],0,c=np.array[[r[i][0],r[i][1],r[i][2]]],s=100] # We have defined the first column as red, the second as
                                                                        # green and the third as blue

        
"""Plot the gaussians"""

for g,c in zip[[gauss_1.pdf[np.sort[X_tot].reshape[60,1]],gauss_2.pdf[np.sort[X_tot].reshape[60,1]],gauss_3.pdf[np.sort[X_tot].reshape[60,1]]],['r','g','b']]:
    ax0.plot[np.sort[X_tot],g,c=c]
        
        
        
plt.show[]

Như bạn có thể thấy, màu sắc của các dữ liệu đã thay đổi do sự điều chỉnh của $R$. Điều này là hợp lý vì cũng là phương tiện và phương sai của người Gaussian đã thay đổi và theo đó các phân tích bổ sung cũng thay đổi. Mặc dù, sau lần chạy đầu tiên của thuật toán EM của chúng tôi, kết quả không tốt hơn kết quả bắt đầu ban đầu, tùy ý của chúng tôi phải không? . Điều này được thực hiện bằng cách lặp đơn giản thông qua các bước EM sau khi chúng tôi đã thực hiện các lần khởi động đầu tiên của $ \ boldsymbol {\ mu_c} $, $ \ sigma_c^2 $ và $ \ mu_c $. Chúng tôi chạy EM cho 10 vòng và vẽ kết quả trong mỗi vòng. Bạn có thể quan sát tiến trình cho từng vòng EM bên dưới

import matplotlib.pyplot as plt
from matplotlib import style
style.use['fivethirtyeight']
import numpy as np
from scipy.stats import norm
np.random.seed[0]

X = np.linspace[-5,5,num=20]
X0 = X*np.random.rand[len[X]]+15 # Create data cluster 1
X1 = X*np.random.rand[len[X]]-15 # Create data cluster 2
X2 = X*np.random.rand[len[X]] # Create data cluster 3
X_tot = np.stack[[X0,X1,X2]].flatten[] # Combine the clusters to get the random datapoints from above

class GM1D:

    def __init__[self,X,iterations]:
        self.iterations = iterations
        self.X = X
        self.mu = None
        self.pi = None
        self.var = None
  

    def run[self]:
        

        """
        Instantiate the random mu, pi and var
        """
        self.mu = [-8,8,5]
        self.pi = [1/3,1/3,1/3]
        self.var = [5,3,1]
        
        
        
        """
        E-Step
        """
        
        for iter in range[self.iterations]:

            """Create the array r with dimensionality nxK"""
            r = np.zeros[[len[X_tot],3]]  

  
            """
            Probability for each datapoint x_i to belong to gaussian g 
            """
            for c,g,p in zip[range[3],[norm[loc=self.mu[0],scale=self.var[0]],
                                       norm[loc=self.mu[1],scale=self.var[1]],
                                       norm[loc=self.mu[2],scale=self.var[2]]],self.pi]:
                r[:,c] = p*g.pdf[X_tot] # Write the probability that x belongs to gaussian c in column c. 
                                      # Therewith we get a 60x3 array filled with the probability that each x_i belongs to one of the gaussians
            """
            Normalize the probabilities such that each row of r sums to 1 and weight it by mu_c == the fraction of points belonging to 
            cluster c
            """
            for i in range[len[r]]:
                r[i] = r[i]/[np.sum[pi]*np.sum[r,axis=1][i]]


            """Plot the data"""

            fig = plt.figure[figsize=[10,10]]
            ax0 = fig.add_subplot[111]


            for i in range[len[r]]:
                ax0.scatter[self.X[i],0,c=np.array[[r[i][0],r[i][1],r[i][2]]],s=100] 


            """Plot the gaussians"""


            for g,c in zip[[norm[loc=self.mu[0],scale=self.var[0]].pdf[np.linspace[-20,20,num=60]],
                            norm[loc=self.mu[1],scale=self.var[1]].pdf[np.linspace[-20,20,num=60]],
                            norm[loc=self.mu[2],scale=self.var[2]].pdf[np.linspace[-20,20,num=60]]],['r','g','b']]:
                ax0.plot[np.linspace[-20,20,num=60],g,c=c]
            
            
            
            """M-Step"""
    

            """calculate m_c"""
            m_c = []
            for c in range[len[r[0]]]:
                m = np.sum[r[:,c]]
                m_c.append[m] # For each cluster c, calculate the m_c and add it to the list m_c

            """calculate pi_c"""
            for k in range[len[m_c]]:
                self.pi[k] = [m_c[k]/np.sum[m_c]] # For each cluster c, calculate the fraction of points pi_c which belongs to cluster c

            """calculate mu_c"""
            self.mu = np.sum[self.X.reshape[len[self.X],1]*r,axis=0]/m_c


            """calculate var_c"""
            var_c = []

            for c in range[len[r[0]]]:
                var_c.append[[1/m_c[c]]*np.dot[[[np.array[r[:,c]].reshape[60,1]]*[self.X.reshape[len[self.X],1]-self.mu[c]]].T,[self.X.reshape[len[self.X],1]-self.mu[c]]]]



            plt.show[]
    

GM1D = GM1D[X_tot,10]
GM1D.run[]

Như bạn có thể thấy, ba Gaussian được khởi tạo ngẫu nhiên của chúng tôi đã phù hợp với dữ liệu. Đẹp, phải không? . Vì tôi đã giới thiệu điều này trong trường hợp đa chiều bên dưới nên tôi sẽ bỏ qua bước này ở đây. Nhưng không có bất kỳ phép thuật nào, chỉ cần tính toán giá trị của loglikelihip như được mô tả trong mã giả ở trên mỗi lần lặp, lưu các giá trị này trong một danh sách và vẽ các giá trị sau khi lặp. Như đã nói, tôi đã thực hiện các bước dưới đây và bạn sẽ thấy cách chúng tôi có thể tính toán nó trong Python

Vì vậy, bây giờ chúng ta đã thấy điều đó, và làm thế nào, GMM hoạt động cho trường hợp nhất một chiều. Nhưng làm thế nào chúng ta có thể thực hiện điều này cho các bộ dữ liệu với nhiều hơn một chiều? . Vì vậy, sự khác biệt với trường hợp một chiều là bộ dữ liệu của chúng tôi không còn bao gồm một cột mà có nhiều cột và do đó, $ x_i $ trên chúng tôi không còn là một cái nhìn mà là một cái nhìn [ . Vì có nhiều cột nên giá trị trung bình trên mỗi lớp không còn là vô hướng mà $ \ mu_c $ mà là vector $ \ boldsymbol {\ mu_c} $ bao gồm nhiều phần tử như có các cột trong bộ dữ liệu. Ngoài ra, phương sai không còn là vô hướng cho mỗi cụm C [$ \ sigma^2 $] mà trở thành ma trận hiệp phương sai $ \ boldsymbol {\ sigma_c} $ của kích thước NXN trong đó n là cột số lượng [ . Các tính toán giữ nguyên như nhau

Vì vậy, hãy lấy trường hợp đa chiều trong Python. Tôi đã thêm nhận xét ở tất cả các bước quan trọng để giúp bạn hiểu mã. Ngoài ra, tôi đã viết mã theo cách mà bạn có thể điều chỉnh số lượng nguồn [== cụm] bạn muốn phù hợp và số lần lặp bạn muốn chạy mô hình. Bằng cách gọi hàm EMM với các giá trị khác nhau cho number_of_source và các lần lặp. Sự phù hợp thực tế của GMM được thực hiện trong hàm chạy []. Tôi đã giới thiệu một hàm dự đoán [] cho phép chúng tôi dự đoán thành viên thành viên dự đoán cho một điểm dữ liệu mới, không nhìn thấy thuộc về Gaussians [cụm] được trang bị. Do đó, về nguyên tắc, mã dưới đây được chia thành hai phần. phần Run [] nơi chúng tôi đào tạo GMM và lặp đi lặp lại qua các bước E và M và phần dự đoán [] nơi chúng tôi dự đoán khả năng cho một điểm dữ liệu mới. Tôi khuyên bạn nên đi qua từng dòng mã và có thể vẽ kết quả của một dòng với smth. Giống như cốt truyện [kết quả của dòng 44] nếu bạn không chắc chắn những gì đang diễn ra -quy trình này đã giúp tác giả nhiều lần-

I must write the end of the end. Tôi đã giới thiệu một biến có tên là chính mình. reg_cov. This variable is smth. Chúng ta cần ngăn chặn các vấn đề bất thường trong quá trình tính toán ma trận hiệp phương sai. Đây là một vấn đề toán học có thể phát sinh trong quá trình tính toán ma trận hiệp phương sai và điều đó không quan trọng đối với sự hiểu biết về chính GMM. Mặc dù vậy, hóa ra nếu chúng ta chạy vào một hiệp định ma trận sai số ít, chúng ta sẽ gặp lỗi. Để ngăn chặn điều này, chúng tôi giới thiệu biến được đề cập. Đối với những người quan tâm đến lý do tại sao chúng ta có một trận ma dị dị và những gì chúng ta có thể làm để chống lại nó, tôi sẽ thêm phần "Các vấn đề dị dị trong quá trình tính toán GMM" vào cuối

GMM in Python from the top - Traverse max

________số 8

ĐẦU RA

[3.5799079955839772e-06, 0.00013180910068621356, 0.9998646109913182]

Vì vậy, bây giờ chúng tôi đã thấy rằng chúng tôi có thể tạo một bộ dữ liệu tùy chọn, phù hợp với GMM vào dữ liệu này, lần đầu tiên tìm thấy cụm phân phối Gaussian [nguồn gốc] trong bộ dữ liệu này và lần thứ hai

Chúng ta có thể làm gì với mô hình này vào cuối ngày? . "Tôi có một bộ dữ liệu và tôi biết rằng có 5 cụm từ. Thật không may, tôi không biết nhãn thuộc cụm từ nào và do đó tôi có một bộ dữ liệu. Bạn có thể giúp tôi tìm các cụm từ không? . You can pay answer. "Vâng, tôi có thể sử dụng phương pháp GMM bằng cách nào đó. ". Đối tượng của bạn là thú vị. hai ngày sau, cùng một người gõ cửa nhà bạn và nói. "Điều này, tôi muốn cảm ơn bạn một lần nữa vì bạn đã giúp đỡ. Tôi muốn bạn biết rằng bây giờ tôi có một Datapoint mới mà tôi biết đó là giá trị mục tiêu. You can do smth. Hữu ích với nó? . "Chà, tôi nghĩ rằng tôi có thể. Bằng cách sử dụng mô hình GMM do chúng tôi tạo trên DataPoint mới này, tôi có thể tính toán hiệu suất thành viên của DataPoint này thuộc về từng cụm từ. Nếu tôi có thể may mắn và tính toán của họ, tôi sẽ trả về Xác suất cao cho DataPoint này cho một cụm từ mà chúng tôi có thể giả sử rằng tất cả các điểm dữ liệu thuộc cụm từ này đều có cùng giá trị mục tiêu như DataPoint này. Vì vậy, chúng ta có thể dán nhãn tất cả các dữ liệu không được dán nhãn của cụm này [cho rằng các cụm được phân cụm chặt chẽ -cho đến Hãy chắc chắn-]. Vì vậy, chúng ta có thể tạo một bộ dữ liệu không được dán nhãn một bộ dữ liệu được dán nhãn [một phần] và sử dụng một số loại thuật toán học tập có giám sát trong bước tiếp theo. Thật tuyệt phải không?

GMM sử dụng Sklearn

Vì vậy, bây giờ chúng tôi sẽ tạo một mô hình GMM bằng phương pháp sklearn. hỗn hợp. gaussianmixture được đóng gói sẵn. Như chúng ta có thể thấy, việc thiết lập thực tế của thuật toán, đó là sự khởi động cũng như gọi phương thức FIT [] chỉ đưa cho chúng ta chỉ có một dòng mã. Tuyệt phải không?

Dimensionality = [60, 3]
[[2.97644006e-02 9.70235407e-01 1.91912550e-07]
 [3.85713024e-02 9.61426220e-01 2.47747304e-06]
 [2.44002651e-02 9.75599713e-01 2.16252823e-08]
 [1.86909096e-02 9.81309090e-01 8.07574590e-10]
 [1.37640773e-02 9.86235923e-01 9.93606589e-12]
 [1.58674083e-02 9.84132592e-01 8.42447356e-11]
 [1.14191259e-02 9.88580874e-01 4.48947365e-13]
 [1.34349421e-02 9.86565058e-01 6.78305927e-12]
 [1.11995848e-02 9.88800415e-01 3.18533028e-13]
 [8.57645259e-03 9.91423547e-01 1.74498648e-15]
 [7.64696969e-03 9.92353030e-01 1.33051021e-16]
 [7.10275112e-03 9.92897249e-01 2.22285146e-17]
 [6.36154765e-03 9.93638452e-01 1.22221112e-18]
 [4.82376290e-03 9.95176237e-01 1.55549544e-22]
 [7.75866904e-03 9.92241331e-01 1.86665135e-16]
 [7.52759691e-03 9.92472403e-01 9.17205413e-17]
 [8.04550643e-03 9.91954494e-01 4.28205323e-16]
 [3.51864573e-03 9.96481354e-01 9.60903037e-30]
 [3.42631418e-03 9.96573686e-01 1.06921949e-30]
 [3.14390460e-03 9.96856095e-01 3.91217273e-35]
 [1.00000000e+00 2.67245688e-12 1.56443629e-57]
 [1.00000000e+00 4.26082753e-11 9.73970426e-49]
 [9.99999999e-01 1.40098281e-09 3.68939866e-38]
 [1.00000000e+00 2.65579518e-10 4.05324196e-43]
 [9.99999977e-01 2.25030673e-08 3.11711096e-30]
 [9.99999997e-01 2.52018974e-09 1.91287930e-36]
 [9.99999974e-01 2.59528826e-08 7.72534540e-30]
 [9.99999996e-01 4.22823192e-09 5.97494463e-35]
 [9.99999980e-01 1.98158593e-08 1.38414545e-30]
 [9.99999966e-01 3.43722391e-08 4.57504394e-29]
 [9.99999953e-01 4.74290492e-08 3.45975850e-28]
 [9.99999876e-01 1.24093364e-07 1.31878573e-25]
 [9.99999878e-01 1.21709730e-07 1.17161878e-25]
 [9.99999735e-01 2.65048706e-07 1.28402556e-23]
 [9.99999955e-01 4.53370639e-08 2.60841891e-28]
 [9.99999067e-01 9.33220139e-07 2.02379180e-20]
 [9.99998448e-01 1.55216175e-06 3.63693167e-19]
 [9.99997285e-01 2.71542629e-06 8.18923788e-18]
 [9.99955648e-01 4.43516655e-05 1.59283752e-11]
 [9.99987200e-01 1.28004505e-05 3.20565446e-14]
 [9.64689131e-01 9.53405294e-03 2.57768163e-02]
 [9.77001731e-01 7.96383733e-03 1.50344317e-02]
 [9.96373670e-01 2.97775078e-03 6.48579562e-04]
 [3.43634425e-01 2.15201653e-02 6.34845409e-01]
 [9.75390877e-01 8.19866977e-03 1.64104537e-02]
 [9.37822997e-01 1.19363656e-02 5.02406373e-02]
 [4.27396946e-01 2.18816340e-02 5.50721420e-01]
 [3.28570544e-01 2.14190231e-02 6.50010433e-01]
 [3.62198108e-01 2.16303800e-02 6.16171512e-01]
 [2.99837196e-01 2.11991858e-02 6.78963618e-01]
 [2.21768797e-01 2.04809383e-02 7.57750265e-01]
 [1.76497129e-01 2.01127714e-02 8.03390100e-01]
 [8.23252013e-02 2.50758227e-02 8.92598976e-01]
 [2.11943183e-01 2.03894641e-02 7.67667353e-01]
 [1.50351209e-01 2.00499057e-02 8.29598885e-01]
 [1.54779991e-01 2.00449518e-02 8.25175057e-01]
 [7.92109803e-02 5.93118654e-02 8.61477154e-01]
 [9.71905134e-02 2.18698473e-02 8.80939639e-01]
 [7.60625670e-02 4.95831879e-02 8.74354245e-01]
 [8.53513721e-02 2.40396004e-02 8.90609028e-01]]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
0

ĐẦU RA

Dimensionality = [60, 3]
[[2.97644006e-02 9.70235407e-01 1.91912550e-07]
 [3.85713024e-02 9.61426220e-01 2.47747304e-06]
 [2.44002651e-02 9.75599713e-01 2.16252823e-08]
 [1.86909096e-02 9.81309090e-01 8.07574590e-10]
 [1.37640773e-02 9.86235923e-01 9.93606589e-12]
 [1.58674083e-02 9.84132592e-01 8.42447356e-11]
 [1.14191259e-02 9.88580874e-01 4.48947365e-13]
 [1.34349421e-02 9.86565058e-01 6.78305927e-12]
 [1.11995848e-02 9.88800415e-01 3.18533028e-13]
 [8.57645259e-03 9.91423547e-01 1.74498648e-15]
 [7.64696969e-03 9.92353030e-01 1.33051021e-16]
 [7.10275112e-03 9.92897249e-01 2.22285146e-17]
 [6.36154765e-03 9.93638452e-01 1.22221112e-18]
 [4.82376290e-03 9.95176237e-01 1.55549544e-22]
 [7.75866904e-03 9.92241331e-01 1.86665135e-16]
 [7.52759691e-03 9.92472403e-01 9.17205413e-17]
 [8.04550643e-03 9.91954494e-01 4.28205323e-16]
 [3.51864573e-03 9.96481354e-01 9.60903037e-30]
 [3.42631418e-03 9.96573686e-01 1.06921949e-30]
 [3.14390460e-03 9.96856095e-01 3.91217273e-35]
 [1.00000000e+00 2.67245688e-12 1.56443629e-57]
 [1.00000000e+00 4.26082753e-11 9.73970426e-49]
 [9.99999999e-01 1.40098281e-09 3.68939866e-38]
 [1.00000000e+00 2.65579518e-10 4.05324196e-43]
 [9.99999977e-01 2.25030673e-08 3.11711096e-30]
 [9.99999997e-01 2.52018974e-09 1.91287930e-36]
 [9.99999974e-01 2.59528826e-08 7.72534540e-30]
 [9.99999996e-01 4.22823192e-09 5.97494463e-35]
 [9.99999980e-01 1.98158593e-08 1.38414545e-30]
 [9.99999966e-01 3.43722391e-08 4.57504394e-29]
 [9.99999953e-01 4.74290492e-08 3.45975850e-28]
 [9.99999876e-01 1.24093364e-07 1.31878573e-25]
 [9.99999878e-01 1.21709730e-07 1.17161878e-25]
 [9.99999735e-01 2.65048706e-07 1.28402556e-23]
 [9.99999955e-01 4.53370639e-08 2.60841891e-28]
 [9.99999067e-01 9.33220139e-07 2.02379180e-20]
 [9.99998448e-01 1.55216175e-06 3.63693167e-19]
 [9.99997285e-01 2.71542629e-06 8.18923788e-18]
 [9.99955648e-01 4.43516655e-05 1.59283752e-11]
 [9.99987200e-01 1.28004505e-05 3.20565446e-14]
 [9.64689131e-01 9.53405294e-03 2.57768163e-02]
 [9.77001731e-01 7.96383733e-03 1.50344317e-02]
 [9.96373670e-01 2.97775078e-03 6.48579562e-04]
 [3.43634425e-01 2.15201653e-02 6.34845409e-01]
 [9.75390877e-01 8.19866977e-03 1.64104537e-02]
 [9.37822997e-01 1.19363656e-02 5.02406373e-02]
 [4.27396946e-01 2.18816340e-02 5.50721420e-01]
 [3.28570544e-01 2.14190231e-02 6.50010433e-01]
 [3.62198108e-01 2.16303800e-02 6.16171512e-01]
 [2.99837196e-01 2.11991858e-02 6.78963618e-01]
 [2.21768797e-01 2.04809383e-02 7.57750265e-01]
 [1.76497129e-01 2.01127714e-02 8.03390100e-01]
 [8.23252013e-02 2.50758227e-02 8.92598976e-01]
 [2.11943183e-01 2.03894641e-02 7.67667353e-01]
 [1.50351209e-01 2.00499057e-02 8.29598885e-01]
 [1.54779991e-01 2.00449518e-02 8.25175057e-01]
 [7.92109803e-02 5.93118654e-02 8.61477154e-01]
 [9.71905134e-02 2.18698473e-02 8.80939639e-01]
 [7.60625670e-02 4.95831879e-02 8.74354245e-01]
 [8.53513721e-02 2.40396004e-02 8.90609028e-01]]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
1

Vì vậy, như bạn có thể thấy, chúng tôi nhận được kết quả rất tốt. Xin chúc mừng, xong

Các vấn đề bất thường trong tính toán của GMM

Phần này sẽ cung cấp một cái nhìn sâu sắc về những gì đang xảy ra dẫn đến một trận đánh hiệp phương phương sai số ít trong quá trình cài đặt GMM vào bộ dữ liệu, tại sao điều này lại xảy ra và những gì chúng ta có thể

Do đó, chúng tôi bắt đầu tốt nhất bằng cách tóm tắt các bước trong quá trình cài đặt mô hình kết hợp Gaussian vào bộ dữ liệu

  1. Quyết định có nhiều nguồn/cụm [c] bạn muốn phù hợp với dữ liệu của mình
  2. Khởi tạo các tham số có nghĩa là $ \mu_c$, hiệp phương sai $ \ sigma_c $ và frecy_per_class $ \ pi_c $ mỗi cụm C C

$ \ Gạch dưới {Bước điện tử} $

  1. Tính toán cho từng datapoint $x_i $ xác định $r_{ic}$ mà datapoint $x_i$ thuộc về cụm C với

    $$ r_ {ic} = \ frac {\ pi_c n [\ boldsymbol {x_i} \. \ \ \ \. }] $ mô tả Gaussian đa biến với

    $$ n [\ boldsymbol {x_i}, \ boldsymbol {\ mu_c}, \ boldsymbol {\ sigma_c}] \ = \ \ frac {1} {[2 \ \ Sigma_c. ^{\ frac {1}} {2}}}} exp [-\ frac {1} {2} [ 1}} [\ boldsymbol {x_i}-\ boldsymbol {\ mu_c}]] $$

    $ r_ {ic} $ cung cấp cho chúng tôi cho mỗi datapoint $ x_i $ số đo của. $ \ frac {xác suất \ that \ x_i \ thuộc về \ to \ class \ c} {xác suất \ của \ x_i Do đó, nếu $ x_i $ rất gần với một Gaussian C, nó sẽ nhận được giá trị $ R_ {

    $ \ gạch dưới {m-bước} $

    Đối chiếu với từng cụm từ C. Tính tổng trọng lượng $ m_c $ [nói một cách chậm trễ Tỷ lệ các điểm được phân bổ cho cụm C] và cập nhật $ \ pi_c $, $ \ mu_c $ và $ \ sigma_c $ bằng $ r_ {ic} $ với $ r_ {ic} $ với

    $$ m_c \ = \ \ sigma_i r_ic $$ $$

    $$ \ pi_c \ = \ \ frac {m_c} {M} $$

    $$ \ boldsymbol {\ mu_c} \ = \ \ frac {1} {m_c} \ sigma_i r_ {ic} \ w

    $$ \ boldsymbol {\ sigma_c} \ = \ \ frac {1} {m_c} \ sigma_i r_ {ic} [\ boldsymbol {x_i}-\ {\ mu_c}] $$ tâm trí rằng bạn phải . Lưu ý rằng bạn phải sử dụng các phương tiện được cập nhật trong công thức cuối cùng này.
    Xin lưu ý rằng bạn phải sử dụng phương tiện được cập nhật trong công thức cuối cùng này.

    lặp lại lặp lại bước E và M để đến khi hàm khả năng nhật ký của mô hình của chúng tôi hội tụ trong đó khả năng đăng nhập được tính toán với toán học

    $$ ln \ p [\ boldsymbol {x} \. \ \ boldsymbol {\ pi}, \ boldsymbol \ Sigma_ {k = 1}^k \ pi_k n [\ boldsymbol {x_i} \. \ \ \ boldsymbol {\ mu_k}, \ boldsymbol {\ sigma_k}] $$

Vì vậy, bây giờ chúng tôi đã bắt nguồn các bước duy nhất trong quá trình tính toán, chúng tôi phải xem xét ý nghĩa của nó đối với một số ít. Một số trận đấu là ít nếu nó không thể đảo ngược. Một trận ma sẽ không thể đảo ngược nếu có trận bóng $ x $ sao cho $ ax = xa = i $. Nếu điều này không được đưa ra, ma trận được cho là ít. That is, a ma like

\ started {Bmatrix} 0 & 0 \\ 0 & 0 \ end {bmatrix}

is could not reverse and by a number of less. Cũng hợp lý, nếu chúng ta giả sử rằng ma trận trên là ma trận $a$ thì không thể có ma trận $x$ cho phép ma trận này ma trận nhận dạng $i$ [chỉ cần lấy ma trận 0 này và sản phẩm . Nhưng tại sao đây là một vấn đề đối với chúng tôi? . Tại đó, bạn sẽ tìm thấy $ \ boldsymbol {\ sigma_c^{-1}} $, đó là sự không thể đảo ngược của hiệp phương sai. Vì một số ít không thể đảo ngược, điều này sẽ khiến chúng gặp lỗi trong quá trình tính toán

Vì vậy, bây giờ chúng ta biết làm thế nào một số ít, không thể đảo ngược như thế nào và tại sao điều này lại quan trọng đối với chúng ta trong GMM tính toán, làm thế nào chúng ta có thể . Điều này có thể xảy ra nếu chúng ta có một bộ dữ liệu mà chúng ta muốn phù hợp với 3 Gaussian nhưng thực chất chỉ bao gồm hai lớp [cụm] để nói một cách lỏng lẻo, hai trong số ba Gaussian này bắt được cụm từ . Chúng ta sẽ thấy điều này trông giống như thế nào dưới đây. Nhưng từng bước. Giả sử bạn có bộ dữ liệu hai chiều bao gồm hai cụm từ nhưng bạn không biết điều đó và muốn gắn ba mô hình Gaussian với nó, đó là c = 3. Bạn khởi tạo các tham số của mình trong bước E và sơ đồ Người Gaussian trên đầu dữ liệu của bạn trông giống như smth. Giống như [bạn có thể thấy hai cụm tương đối rải rác ở phía dưới bên trái và trên cùng bên phải]

Sau khi khởi động tham số, bạn lặp lại các bước E, t. Trong thủ tục này, ba Gaussian đang lang thang xung quanh và tìm kiếm vị trí tối ưu của họ. Nếu bạn quan sát các tham số mô hình, đó là $ \ mu_c$ và $ \ pi_c$, bạn sẽ quan sát rằng họ hội tụ, rằng sau một số lần lặp lại, họ sẽ không còn thay đổi và tương thích với Gaussian. . Trong trường hợp bạn có một trận đấu dị dị mà bạn gặp phải. giống

Nơi tôi đã khoanh tròn mô hình Gaussian thứ ba với màu đỏ. Vì vậy, bạn thấy rằng Gaussian này nằm trên một Datapoint khi hai người khác yêu cầu phần còn lại. Ở đây tôi phải nhận thấy rằng để có thể vẽ hình như vậy tôi đã sử dụng phương pháp điều chỉnh hiệp phương sai, đó là một phương pháp để ngăn chặn ma dị dị và được mô tả dưới đây

OK, nhưng bây giờ chúng ta vẫn không biết tại sao và làm thế nào chúng ta bắt gặp một trận dị thường. Do đó, chúng ta phải xem xét các tính toán của $R_{IC}$ và $cov$ trong các bước E và M. Nếu bạn nhìn vào công thức $R_{IC}$

$$ r_ {ic} = \ frac {\ pi_c n [\ boldsymbol {x_i} \. \ \ \ \. C and other value. Để làm cho điều này rõ ràng hơn, hãy xem xét trường hợp chúng tôi có hai Gaussian tương đối lan truyền và một Gaussian rất chặt chẽ và chúng tôi tính toán $ R_ {IC} $ cho mỗi DataPoint $ x_i $ như được minh họa

Vì vậy, hãy đi qua các dữ liệu từ trái sang phải và tưởng tượng bạn sẽ viết đánh giá cho mỗi $ x_i $ mà nó thuộc về màu đỏ, xanh và vàng của Gaussian. Những thứ bạn có thể thấy là đối với hầu hết các $x_i$, xác minh rằng nó thuộc về màu vàng Gaussian là rất ít. Trong trường hợp ở trên mà Gaussian thứ ba nằm trên một Datapoint duy nhất, $R_{IC}$ chỉ lớn hơn 0 cho một Datapoint này trong khi nó bằng 0 cho mọi $X_I$ khác. . Bản thân bộ dữ liệu trong quá trình khởi tạo của người Gaussian. Đó là, nếu chúng ta chọn các giá trị ban đầu khác cho người Gaussian, chúng ta sẽ nhìn thấy một bức tranh khác và Gaussian thứ ba có thể không sụp đổ]. Điều này là đủ nếu bạn ngày càng tăng thêm Gaussian này. Table $r_{ic} $ after that look smth. giống

Như bạn có thể thấy, $R_{IC}$ của cột thứ ba, đó là cho Gaussian thứ ba bằng không thay thế vì một hàng này. Nếu chúng ta tìm kiếm DataPoint nào có biểu tượng ở đây, chúng ta sẽ nhận được DataPoint. [23. 38566343 8. 07067598]. Được rồi, nhưng tại sao chúng ta lại có một trận dị dị trong trường hợp này?

$$ \ boldsymbol {\ sigma_c} \ = \ \ sigma_i r_{ic} [\ boldsymbol {x_i}-\ boldsymbol đã thấy rằng tất cả $r_{ic}$ là 0 thay vì cho một $x_i$ với [23. 38566343 8. 07067598]. Bây giờ công thức chúng ta muốn tính toán $ [\ boldsymbol {x_i}-\ boldsymbol {\ mu_c}] $. Nếu chúng ta nhìn vào $ \ boldsymbol {\ mu_c} $ cho Gaussian thứ ba này, chúng ta sẽ nhận được [23. 38566343 8. 07067598]. Ồ, nhưng đã chờ đợi, chính xác giống như $x_i$ và đó là những gì Đức cha đã viết với. "Giả sử rằng một trong những thành phần của mô hình hỗn hợp, chúng ta hãy nói thành phần $j $ th, có nghĩa là $ \ boldsymbol {\ \ Mu_j} $ chính xác bằng một trong các điểm dữ liệu sao cho $ . 434]. Vậy điều gì sẽ xảy ra?

\ started {Bmatrix} 0 & 0 \\ 0 & 0 \ end {bmatrix}

Do đó, như đã nói ở trên, đây là một số ít nhất có thể và sẽ dẫn đến một lỗi trong quá trình tính toán của Gaussian đa biến. Vì vậy, làm thế nào chúng ta có thể ngăn chặn một vấn đề như vậy. Chà, chúng ta đã thấy rằng ma trận hiệp phương sai là số ít nếu đó là ma trận $ \ boldsymbol {0} $. Do đó, để ngăn chặn sự dị dị, chúng ta chỉ cần ngăn chặn ma trận hiệp phương sai trở thành ma trận $ \ boldsymbol {0} $. Điều này được thực hiện bằng cách thêm một giá trị rất ít [trong Gaussianmixture của SkLearn, giá trị này được đặt thành 1E-6] thành Digonal của trận hiệp phương sai. Ngoài ra, còn có những cách khác để ngăn chặn sự dị thường như đã thấy khi Gaussian crash và đặt ma trận trung bình và/hoặc hiệp phương sai của nó thành [các] giá trị cao mới, tùy chọn. Sự kiện chính hiệp phương sai này cũng được thực hiện trong mã dưới đây mà bạn nhận được kết quả được mô tả. Có thể bạn phải chạy mã nhiều lần để có được một hiệp đấu ma trận sai số ít kể từ đó, như đã nói. Điều này không xảy ra mỗi lần mà còn phụ thuộc vào việc thiết lập ban đầu của người Gaussians

Giới thiệu người

  • Vanderplas, J. [2017]. Cẩm nang khoa học dữ liệu Python. Sebastopol. O'Reilly, tr. 465
  • Mitchel, t. [1997]. Học máy. McGraw-Hill. New York, tr. 191
  • Directory, page. [2006]. Get the pattern and learning machine. Béc-lin, Heidelberg. mùa xuân, tr. 430
  • https. //www. youtube. com/watch?v=qMTuMa86NzU
  • https. //www. youtube. com/watch?v=iQoXFmbXRJA
  • https. //www. youtube. com/watch?v=zL_MHtT56S0
  • https. //www. youtube. com/watch?v=BWXd5dOkuTo

Dao create Python live

Các khóa học trực tuyến sắp tới

Ghi danh ở đây

GMM sẽ sử dụng thuật toán EM?

Thuật toán EM trong gmmof E-bước. Hai bước này được lặp lại cho đến khi đạt được sự hội tụ. Theo cách này, một công tắc giữa bước điện tử và bước M là có thể, theo các tham số khởi tạo ngẫu nhiên. của bước E. Hai bước này được lặp lại cho đến khi đạt được sự hội tụ. Bằng cách này, có thể chuyển đổi giữa bước E và bước M, theo các tham số được khởi tạo ngẫu nhiên. của Bước điện tử . Hai bước này được lặp lại cho đến khi đạt được sự hội tụ. Bằng cách này, có thể chuyển đổi giữa bước E và bước M, theo các tham số được khởi tạo ngẫu nhiên.

Em có phải là mô hình hỗn hợp Gaussian không?

Chúng tôi xác minh thuật toán EM [tối đa kỳ vọng] cho các hỗn hợp Gaussian như sau. Thuật toán là một thuật toán lặp lại bắt đầu từ một số ước tính ban đầu của θ [ví dụ:. random] and after that process update or off for going to going to going to the compile. Mỗi lần lặp bao gồm một bước điện tử và một bước M. Thuật toán EM [Expectation-Maximization] cho hỗn hợp Gaussian như sau. Thuật toán là một thuật toán lặp bắt đầu từ một số ước tính ban đầu của Θ [e. g. , ngẫu nhiên], sau đó tiếp tục cập nhật lặp lại Θ cho đến khi phát hiện sự hội tụ. Mỗi lần lặp bao gồm một bước E và một bước M. Thuật toán EM [Tối đa hóa kỳ vọng] cho hỗn hợp Gaussian như sau. Thuật toán là một thuật toán lặp bắt đầu từ một số ước tính ban đầu của Θ [e. g. , ngẫu nhiên], sau đó tiếp tục cập nhật lặp lại Θ cho đến khi phát hiện sự hội tụ. Mỗi lần lặp bao gồm một bước E và một bước M.

GMM trong Python là gì?

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. từ Sklearn. Mixture Nhập GMM GMM = GMM [N_Components = 4]. FIT [x] Nhãn = gmm. [GMM] cố gắng tìm hỗn hợp các phân phối xác suất Gaussian đa chiều để mô hình hóa tốt nhất bất kỳ tập dữ liệu đầu vào nào. Trong trường hợp đơn giản nhất, các GMM có thể được sử dụng để tìm các cụm theo cách tương tự như phương tiện k. từ sklearn. nhập hỗn hợp GMM gmm = GMM[n_components=4]. nhãn phù hợp [X] = gmm

Chủ Đề