Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Phân cụm dữ liệu văn bản bằng cách sử dụng học tập không giám sát

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ủng 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 hồi quy, việc học không giám sát được sử dụng để tìm các cấu trúc ẩn trong dữ liệu. Bộ dữ liệu được sử dụng trong 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 sử dụng trong học tập không giám sát.

Thuật toán EM mô hình dữ liệu được tạo ra bởi hỗn hợp Gaussians. 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 là một phần.

Giả sử chúng ta có hàm mật độ 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: Đồ thị hàm mật độ F (x) và Gaussian được trang bị

Trong hình trên, nó hiển thị Gaussian được trang bị cho dữ liệu đã cho. Và rõ ràng, đó là một sự phù hợp rất kém. Nhìn chung, Gaussian có các thuộc tính hấp dẫn như chỉ học hai tham số (và), và do đó, nó đòi hỏi một số dữ liệu đào tạo để ước tính. Tuy nhiên, đối với một số dữ liệu, Gaussian chỉ không phù hợp. Hỗn hợp của Gaussians thường là một giải pháp tốt hơn. Họ vẫn yêu cầu tương đối ít tham số để ước tính 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.Mixtures of Gaussians are oftentimes a better solution. They still require relatively few parameters to estimate, and thus can be learned from relatively small amounts of data. They can fit pretty well actual distributions of data.

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 M bước để 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 đã đáp ứng.

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à số cụm. Đặt x_1, x_2, xông, x_n là vectơ d-chiều. Sau đó, x_i = (x_i, 1, x_i, 2, phạm, 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 tạo một vectơ trọng lượng với kích thước K. Sau đó, chúng tôi tạo một mảng 2D chứa 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 chiều đạ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 suất 2D là N X K. Ở đâu, n là số lượng dữ liệu chúng ta có. Mã Python cho giai đoạn khởi tạo được hiển thị dưới đây.

Khởi tạo

M-Step

Đầu tiên, chúng tôi khởi tạo một vectơ trọng lượng với kích thước K. Sau đó, chúng tôi tạo một mảng 2D chứa 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 chiều đạ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 suất 2D là N X K. Ở đâu, n là số lượng dữ liệu chúng ta có. Mã Python cho giai đoạn khởi tạo được hiển thị dưới đây.

Trong bước M, chúng tôi sử dụng các xác suất 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 trình sau.2. Mean of a Gaussian 3. Weight of a Guassian

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

E-step

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 cá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ả Gaussians. 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ị xác suất bằng công thức ước tính Gaussian được hiển thị bên dưới.

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

Xác suất dữ liệu x trong I Gaussian

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

Điều kiện ngưỡng

Cuối cùng, chúng tôi tính toán khả năng nhật ký của dữ liệu sau mỗi lần lặp bằng phương trình 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.

Sự kết luận

Người giới thiệu

Giám mục, Christopher M. Nhận dạng mẫu và học máy. Springer-Verlag New York, 2016.

Bởi Tobias Schlagenhauf. Sửa đổi lần cuối: 22 tháng 2 năm 2022.Tobias Schlagenhauf. Last modified: 22 Feb 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, vì nó có thể được sử dụng để tìm các cụm trong dữ liệu. Các khái niệm chính mà bạn nên nghe về là:

  • Phân phối Gaussian đa biến
  • Ma trận hiệp phương sai
  • Vectơ trung bình của dữ liệu đa biến

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

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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 trong bộ dữ liệu mà chúng tôi biết (hoặc giả sử để biết) số lượng cụm được đặt trong bộ dữ liệu này, nhưng chúng tôi không biết các cụm này cũng như cách chúng được định hình. Tìm kiếm các cụm này là nhiệm vụ của GMM và vì chúng tôi không có bất kỳ thông tin nào thay vì số lượng cụm, 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 Gaussians 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. Đó là, một vòng tròn chỉ có thể thay đổi trong đường kính của nó trong 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 hình dạng elipsoid. Xem hình minh họa sau đây cho một ví dụ trong không gian hai chiều.

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Những gì tôi đã bỏ qua 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 vectơ trung bình của chúng. Do đó, vectơ trung bình cho không gian trong khi đường kính tương ứng, ma trận hiệp phương sai xác định hì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 ý như sau:

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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 trong bộ dữ liệu? Vâng, không chính xác vì chúng tôi có các khu vực chồng chéo nơi mô hình KNN không chính xác. Điều này là do thực tế là các cụm KNN có hình tròn trong khi dữ liệu có hình elipsoid. Nó thậm chí có thể xảy ra rằng KNN hoàn toàn thất bại như được minh họa trong hình sau.

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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.

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Một điểm yếu 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 ở 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ề cụm nào 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 viền cắt cứng giữa hai cụm. Mặc dù, như bạn có thể thấy, điều này có lẽ không chính xác cho 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 một và xác suất 40% thuộc về cụm hai. Do đó, chúng tôi muốn gán xác suất cho các điểm dữ liệu.

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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 smth hơn. trong đó thêm nhiều khả năng vào phân cụm của chúng tôi. May mắn thay, GMM là một mô hình như vậy. 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 nhưng 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 là xác suất mà điểm này thuộc về Gaussian khác. Do đó, hãy xem xét hình minh họa sau trong đó chúng tôi đã thêm GMM vào dữ liệu trên và điểm được tô sáng 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 suất cho điểm này cho mỗi cụm, chúng ta sẽ nhận được smth. Giống như: với xác suất 99%, điểm này thuộc về cụm một và với xác suất 1% cho cụm hai.

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Vì vậy, hãy nhanh chóng tóm tắt và tóm tắt lại trong trường hợp 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 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 viền cắt mềm và theo xác suất, nghĩa là, nếu chúng ta muốn biết xác suất của một datapoint để thuộc về từng cụm 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 suất Buzz từ và không mạch trong cuộc thảo 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 bổ xác suất cho các cụm của mình hoặc nếu có các cụm không mạch, chúng ta nên xem cách chúng ta có thể xây dựng mô hình GMM. Điều này được bắt nguồn trong phần tiếp theo của hướng dẫn này. Quá nhiều cho điều đó: chúng tôi làm theo một cách tiếp cận gọi là tối đa hóa kỳ vọng (EM).

Toán học đằng sau các mô hình hỗn hợp Gaussian (GMM)

Để hiểu các 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 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 đầu video đó. Sau khi bạn có màu đỏ phần 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 chiều hơn.

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

  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
  2. Khởi tạo các tham số có nghĩa là $ \ mu_c $, covariance $ \ sigma_c $ và frecy_per_class $ \ pi_c $ mỗi cụm C C

$ \ Underline {E-Step} $

  1. Tính toán cho mỗi datapoint $ x_i $ xác suất $ 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ả Mulitvariate Gaussian 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_ {IC} $ cao cho các giá trị Gaussian này và tương đối thấp.

    $ \ underline {m-bước} $

    Đối với mỗi cụm C: Tính tổng trọng lượng $ m_c $ (nói một cách lỏng lẻo 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:

    $$ 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 trong công thức cuối cùng này.

    Lặp lại lặp lại bước E và M cho đế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:

    $$ ln \ p (\ boldsymbol {x} \ | \ \ boldsymbol {\ pi}, \ boldsymbol \ Sigma_ {k = 1}^k \ pi_k n (\ boldsymbol {x_i} \ | \ \ \ boldsymbol {\ mu_k}, \ boldsymbol {\ sigma_k}) $$

Đào tạo Python sống

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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

Ghi danh ở đây

Gmm trong python từ đầu

Để 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 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 tình huống sau:

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Bạn có thể nói gì về dữ liệu này? Vâng, chúng ta có thể thấy rằng có loại ba cụm dữ liệu. 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.

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Chúng ta có những gì bây giờ? Chà, chúng tôi có các DataPoints và chúng tôi có ba mô hình Gaussian được chọn ngẫu nhiên trên đầu các điểm dữ liệu đó. 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? Vâng, ở đây chúng tôi sử dụng một cách tiếp cận gọi là tối đa hóa kỳ vọng (EM). 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 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 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 thứ gọi 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 được vẽ ngẫu nhiên Gaussian với kỳ vọng thuật ngữ đầu tiên? Hãy cố gắng chỉ cần tính toán xác suất cho mỗi DataPoint trong bộ dữ liệu của chúng tôi cho mỗi Gaussian, rằng xác suất mà DataPoint này thuộc về mỗi trong ba Gaussian. Vì chúng tôi phải lưu trữ các xác 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 tiện lợi để có một thùng chứa nơi chúng tôi có thể lưu trữ xác suất mà DataPoint $ x_i $ thuộc về Gaussian $ c $. Chúng tôi biểu thị xác suất này với $ R_ {IC} $. Những gì chúng ta 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.

OUTPUT:

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ỳ Gaussians $ nào $ g $. Do đó, với mỗi $ x_i $, chúng tôi có ba xác suất, 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 suất 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 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 suất 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à, chúng tôi chỉ cần mã hóa xác suất này bằng cách nhân xác suất cho mỗi $ R_IC $ với phần điểm mà chúng tôi giả sử thuộc về cụm này c. 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:

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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 một số đến một. Vì vậy, hãy thực hiện các lớp có trọng số này trong mã của chúng tôi ở trên. Vì chúng tôi không biết các 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.

OUTPUT:

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 hình dung những điều trên (với các màu khác nhau do 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()

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Vì vậy, đã trang bị ba mô hình Gaussian được chọn một cách tùy ý 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ữ xác suất cho mỗi điểm $ x_i $ để thuộc về Gaussian $ g $ hoặc cụm C, tương ứng. Tiếp theo, chúng tôi đã vẽ các điểm $ x_i $ và được tô màu theo xác suất của chúng cho ba cụm. Bạn có thể thấy rằng các điểm có xác suất rất cao thuộc về một Gaussian cụ thể, có màu của Gaussian này trong khi các điểm giữa hai Gaussian có màu là hỗn 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 (ở đây, giá trị trung bình duy nhất $ \ mu $ để tính toán mỗi Gaussian thay đổi thành một vectơ trung bình $ \ boldsymbol {\ mu} $ với một mục nhập trên mỗi chiều và giá trị phương sai đơn $ $ $ \ Sigma^2 $ mỗi Gaussian thay đổi thành ma trận hiệp phương sai NXN $ \ boldsymbol {\ sigma} $ trong đó n là số lượng kích thước trong tập dữ liệu.) Bước kỳ vọng của thuật toán EM trông giống như:

$ \ Underline {E-Step} $

  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 C được đại diện bởi Gaussian G
  2. Khởi tạo các tham số có nghĩa là $ \ mu_c $, covariance $ \ sigma_c $ và frecy_per_class $ \ pi_c $ mỗi cụm C C
  3. Tính toán cho mỗi datapoint $ x_i $ xác suất $ 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ả Mulitvariate Gaussian 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_ {IC} $ cao cho các giá trị Gaussian này và tương đối thấp.

    Vậy tại sao điều này lại giúp chúng ta? Chà, bây giờ chúng ta biết xác suất cho mỗi điểm thuộc về mỗi Gaussian. Chúng ta có thể làm gì với thông tin này? Vâng, với thông tin này, chúng tôi có thể tính toán một giá trị trung bình mới cũng như phương sai mới (trong 1D) hoặc ma trận hiệp phương sai trong các bộ dữ liệu> 1D. Điều gì sẽ là kết quả của điều đó? Chà, điều này sẽ thay đổi vị trí của mỗi Gaussian theo hướng của trung bình "thực" và sẽ định hình lại mỗi Gaussian bằng cách sử dụng một giá trị cho phương sai gần với phương sai "thực" hơn. 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:
    What can we do with this information? Well, with this information we can calculate a new mean as well as a new variance (in 1D) or covariance matrix in > 1D datasets. What will be the result of that? Well, this would change the location of each gaussian in the direction of the "real" mean and would re-shape each gaussian using a value for the variance which is closer to the "real" variance. This procedure is called the Maximization step of the EM algorithm. The Maximization step looks as follows:

    $ \ underline {m-bước} $

    Đối với mỗi cụm C: Tính tổng trọng lượng $ m_c $ (nói một cách lỏng lẻo 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:

    $$ 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 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ó xác suất từ ​​0 đến 1 nhưng 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 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ố 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ó xác suất, 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 xác suất $ 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 C như trên. 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 suất tương ứng mà điểm này thuộc về cụm C ($ r_ {ic} $) và chia điều này tổng hợp "số lượng điểm" trong C ($ m_c $). Hãy nhớ rằng nếu chúng ta có số không và các số không, đây sẽ là một tính toán trung bình hoàn toàn bình thường nhưng vì chúng ta có xác suất, 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} $) Chúng ta cũng có thể viết $ \ boldsymbol {\ sigma_c} = m_c (\ boldsymbol {x}-\ boldsymbol {\ mu_c})^t ((\ boldsymbol {x}-\ in đậm 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 bản cập nhật trên, đó là chạy EM Lặp lại đầu tiên.or 1. That is, a 1 if $x_i$ belongs to $c$ and a 0 otherwise (So each row would contain one 1 and two 0 in our example above). In this case $m_c$ would be simply the number of 1s per column, that is, the number of $x_i$ allocated to each cluster $c$. But since we have probabilities, we do not simply have ones and zeros but the principal is the same --> We sum up the probabilities $r_ic$ over all i to get $m_c$. Then $\pi_c$ is simply the fraction of points which belong to cluster c as above. We then calculate the new mean (vector) $\boldsymbol{\mu_c}$ by summing up the product of each value $x_i$ and the corresponding probability that this point belongs to cluster c ($r_{ic}$) and divide this sum by "the number of points" in c ($m_c$). Remember that if we had zeros and ones, this would be a completely normal mean calculation but since we have probabilities, we divide by the sum of these probabilities per cluster c. Also the new covariance matrix ($\boldsymbol{\Sigma_c}$) is updated by calculating the covariance matrix per class c ($\boldsymbol{\Sigma_c}$) weighted by the probability that point $x_i$ belongs to cluster c. We could also write $\boldsymbol{\Sigma_c}=m_c(\boldsymbol{x}-\boldsymbol{\mu_c})^T((\boldsymbol{x}-\boldsymbol{\mu_c}))$.
    so let's look at our plot if we do the above updates, that is run the first EM iteration .

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()

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Vì vậy, như bạn có thể thấy sự xuất hiện của người Gaussian của chúng 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()

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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 xác suất phân bổ 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? Hãy xem những gì xảy ra nếu chúng ta chạy các bước trên nhiều lần. Đ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 khởi tạo đầ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 lặp. Bạn có thể quan sát tiến trình cho mỗi 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()

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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? Bước cuối cùng bây giờ là vẽ hàm khả năng nhật ký để cho thấy rằng hàm này hội tụ khi số lần lặp trở nên lớn và do đó sẽ không có sự cải thiện nào trong GMM của chúng tôi và chúng tôi có thể dừng thuật toán để lặp lại. Vì tôi đã giới thiệu điều này trong trường hợp đa chiều dưới đây, 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 cho 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 bước này dưới đây và bạn sẽ thấy cách chúng ta 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 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? Chà, hóa ra không có lý do gì để sợ vì một khi bạn đã hiểu được trường hợp một chiều, mọi thứ khác chỉ là một sự thích nghi và tôi vẫn đã hiển thị trong mã giả ở trên, các công thức bạn cần cho trường hợp đa chiều. Vì vậy, sự khác biệt với trường hợp một chiều là các 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 của chúng tôi không còn là một vectơ mà là một vectơ ($ \ boldsymbol {x_i} $) bao gồm AS Nhiều yếu tố như có các cột trong bộ dữ liệu. 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à số lượng cột (kích thước) . 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 cũng đã giới thiệu một hàm dự đoán () cho phép chúng tôi dự đoán xác suất thành viên cho một datapoint mới, không nhìn thấy thuộc về Gaussians (cụm) được trang bị. Vì vậy, 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 xác suất cho một điểm dữ liệu mới. Tôi khuyên bạn nên đi qua dòng mã từng dòng 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-.

Tôi phải ghi chú phía cuối cùng: Tôi đã giới thiệu một biến có tên là self.reg_cov. Biến này là smth. Chúng ta cần ngăn chặn các vấn đề kỳ dị 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à do đó 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 ma trận hiệp phương 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 ma trận kỳ 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 đề kỳ dị trong quá trình tính toán GMM" ở cuối chương này.

GMM trong Python từ đầu - Vỏ đa chiều

import matplotlib.pyplot as plt
from matplotlib import style
style.use('fivethirtyeight')
from sklearn.datasets.samples_generator import make_blobs
import numpy as np
from scipy.stats import multivariate_normal


# 0. Create dataset
X,Y = make_blobs(cluster_std=1.5,random_state=20,n_samples=500,centers=3)

# Stratch dataset to get ellipsoid data
X = np.dot(X,np.random.RandomState(0).randn(2,2))


class GMM:

    def __init__(self,X,number_of_sources,iterations):
        self.iterations = iterations
        self.number_of_sources = number_of_sources
        self.X = X
        self.mu = None
        self.pi = None
        self.cov = None
        self.XY = None
        
    

    """Define a function which runs for iterations, iterations"""
    def run(self):
        self.reg_cov = 1e-6*np.identity(len(self.X[0]))
        x,y = np.meshgrid(np.sort(self.X[:,0]),np.sort(self.X[:,1]))
        self.XY = np.array([x.flatten(),y.flatten()]).T
           
                    
        """ 1. Set the initial mu, covariance and pi values"""
        self.mu = np.random.randint(min(self.X[:,0]),max(self.X[:,0]),size=(self.number_of_sources,len(self.X[0]))) # This is a nxm matrix since we assume n sources (n Gaussians) where each has m dimensions
        self.cov = np.zeros((self.number_of_sources,len(X[0]),len(X[0]))) # We need a nxmxm covariance matrix for each source since we have m features --> We create symmetric covariance matrices with ones on the digonal
        for dim in range(len(self.cov)):
            np.fill_diagonal(self.cov[dim],5)


        self.pi = np.ones(self.number_of_sources)/self.number_of_sources # Are "Fractions"
        log_likelihoods = [] # In this list we store the log likehoods per iteration and plot them in the end to check if
                             # if we have converged
            
        """Plot the initial state"""    
        fig = plt.figure(figsize=(10,10))
        ax0 = fig.add_subplot(111)
        ax0.scatter(self.X[:,0],self.X[:,1])
        ax0.set_title('Initial state')
        for m,c in zip(self.mu,self.cov):
            c += self.reg_cov
            multi_normal = multivariate_normal(mean=m,cov=c)
            ax0.contour(np.sort(self.X[:,0]),np.sort(self.X[:,1]),multi_normal.pdf(self.XY).reshape(len(self.X),len(self.X)),colors='black',alpha=0.3)
            ax0.scatter(m[0],m[1],c='grey',zorder=10,s=100)
        
        for i in range(self.iterations):               

            """E Step"""
            r_ic = np.zeros((len(self.X),len(self.cov)))

            for m,co,p,r in zip(self.mu,self.cov,self.pi,range(len(r_ic[0]))):
                co+=self.reg_cov
                mn = multivariate_normal(mean=m,cov=co)
                r_ic[:,r] = p*mn.pdf(self.X)/np.sum([pi_c*multivariate_normal(mean=mu_c,cov=cov_c).pdf(X) for pi_c,mu_c,cov_c in zip(self.pi,self.mu,self.cov+self.reg_cov)],axis=0)

            """
            The above calculation of r_ic is not that obvious why I want to quickly derive what we have done above.
            First of all the nominator:
            We calculate for each source c which is defined by m,co and p for every instance x_i, the multivariate_normal.pdf() value.
            For each loop this gives us a 100x1 matrix (This value divided by the denominator is then assigned to r_ic[:,r] which is in 
            the end a 100x3 matrix).
            Second the denominator:
            What we do here is, we calculate the multivariate_normal.pdf() for every instance x_i for every source c which is defined by
            pi_c, mu_c, and cov_c and write this into a list. This gives us a 3x100 matrix where we have 100 entrances per source c.
            Now the formula wants us to add up the pdf() values given by the 3 sources for each x_i. Hence we sum up this list over axis=0.
            This gives us then a list with 100 entries.
            What we have now is FOR EACH LOOP a list with 100 entries in the nominator and a list with 100 entries in the denominator
            where each element is the pdf per class c for each instance x_i (nominator) respectively the summed pdf's of classes c for each 
            instance x_i. Consequently we can now divide the nominator by the denominator and have as result a list with 100 elements which we
            can then assign to r_ic[:,r] --> One row r per source c. In the end after we have done this for all three sources (three loops)
            and run from r==0 to r==2 we get a matrix with dimensionallity 100x3 which is exactly what we want.
            If we check the entries of r_ic we see that there mostly one element which is much larger than the other two. This is because
            every instance x_i is much closer to one of the three gaussians (that is, much more likely to come from this gaussian) than
            it is to the other two. That is practically speaing, r_ic gives us the fraction of the probability that x_i belongs to class
            c over the probability that x_i belonges to any of the classes c (Probability that x_i occurs given the 3 Gaussians).
            """

            """M Step"""

            # Calculate the new mean vector and new covariance matrices, based on the probable membership of the single x_i to classes c --> r_ic
            self.mu = []
            self.cov = []
            self.pi = []
            log_likelihood = []

            for c in range(len(r_ic[0])):
                m_c = np.sum(r_ic[:,c],axis=0)
                mu_c = (1/m_c)*np.sum(self.X*r_ic[:,c].reshape(len(self.X),1),axis=0)
                self.mu.append(mu_c)

                # Calculate the covariance matrix per source based on the new mean
                self.cov.append(((1/m_c)*np.dot((np.array(r_ic[:,c]).reshape(len(self.X),1)*(self.X-mu_c)).T,(self.X-mu_c)))+self.reg_cov)
                # Calculate pi_new which is the "fraction of points" respectively the fraction of the probability assigned to each source 
                self.pi.append(m_c/np.sum(r_ic)) # Here np.sum(r_ic) gives as result the number of instances. This is logical since we know 
                                                # that the columns of each row of r_ic adds up to 1. Since we add up all elements, we sum up all
                                                # columns per row which gives 1 and then all rows which gives then the number of instances (rows) 
                                                # in X --> Since pi_new contains the fractions of datapoints, assigned to the sources c,
                                                # The elements in pi_new must add up to 1

            
            
            """Log likelihood"""
            log_likelihoods.append(np.log(np.sum([k*multivariate_normal(self.mu[i],self.cov[j]).pdf(X) for k,i,j in zip(self.pi,range(len(self.mu)),range(len(self.cov)))])))

            

            """
            This process of E step followed by a M step is now iterated a number of n times. In the second step for instance,
            we use the calculated pi_new, mu_new and cov_new to calculate the new r_ic which are then used in the second M step
            to calculat the mu_new2 and cov_new2 and so on....
            """

        fig2 = plt.figure(figsize=(10,10))
        ax1 = fig2.add_subplot(111) 
        ax1.set_title('Log-Likelihood')
        ax1.plot(range(0,self.iterations,1),log_likelihoods)
        #plt.show()
    
    """Predict the membership of an unseen, new datapoint"""
    def predict(self,Y):
        # PLot the point onto the fittet gaussians
        fig3 = plt.figure(figsize=(10,10))
        ax2 = fig3.add_subplot(111)
        ax2.scatter(self.X[:,0],self.X[:,1])
        for m,c in zip(self.mu,self.cov):
            multi_normal = multivariate_normal(mean=m,cov=c)
            ax2.contour(np.sort(self.X[:,0]),np.sort(self.X[:,1]),multi_normal.pdf(self.XY).reshape(len(self.X),len(self.X)),colors='black',alpha=0.3)
            ax2.scatter(m[0],m[1],c='grey',zorder=10,s=100)
            ax2.set_title('Final state')
            for y in Y:
                ax2.scatter(y[0],y[1],c='orange',zorder=10,s=100)
        prediction = []        
        for m,c in zip(self.mu,self.cov):  
            #print(c)
            prediction.append(multivariate_normal(mean=m,cov=c).pdf(Y)/np.sum([multivariate_normal(mean=mean,cov=cov).pdf(Y) for mean,cov in zip(self.mu,self.cov)]))
        #plt.show()
        return prediction
         
    
    
GMM = GMM(X,3,50)     
GMM.run()
GMM.predict([[0.5,0.5]])


 


    

OUTPUT:

[3.5799079955839772e-06, 0.00013180910068621356, 0.9998646109913182]

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Vì vậy, bây giờ chúng ta đã thấy rằng chúng ta có thể tạo một bộ dữ liệu tùy ý, phù hợp với GMM vào dữ liệu này, lần đầu tiên tìm các cụm phân phối Gaussian (nguồn) trong bộ dữ liệu này và thứ hai cho phép chúng ta dự đoán xác suất thành viên của một dữ liệu vô hình cho các nguồn này.

Chúng ta có thể làm gì với mô hình này vào cuối ngày? Chà, hãy tưởng tượng bạn nhận được một bộ dữ liệu như ở trên, nơi ai đó nói với bạn: "Này tôi có một bộ dữ liệu và tôi biết rằng có 5 cụm. Thật không may, tôi không biết nhãn nào thuộc cụm 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 không? ". Bạn có thể trả lời: "Vâng, tôi có thể bằng cách sử dụng phương pháp GMM!". Đối diện của bạn là thú vị. Vài ngày sau, cùng một người gõ cửa nhà bạn và nói: "Này, tôi muốn cảm ơn bạn một lần nữa cho bạn sự giúp đỡ. Tôi muốn cho 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. Bạn có thể làm smth. Hữu ích với nó? " Bạn trả lời: "Chà, tôi nghĩ rằng tôi có thể. Bằng cách sử dụng mô hình GMM đã tạo của chúng tôi trên DataPoint mới này, tôi có thể tính toán xác suất thành viên của DataPoint này thuộc về từng cụm. Nếu chúng tôi may mắn và tính toán của chúng tôi sẽ trả về Xác suất cao cho DataPoint này cho một cụm chúng ta có thể giả sử rằng tất cả các điểm dữ liệu thuộc cụm này 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.mixture.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 tạo cũng như gọi phương thức FIT () chỉ đưa 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

OUTPUT:

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

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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 đề kỳ dị trong các 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 ma trận hiệp phương sai số ít trong quá trình lắp 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ể làm để ngăn chặn điều đó.

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 lắp mô hình hỗn hợp Gaussian vào bộ dữ liệu.

  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
  2. Khởi tạo các tham số có nghĩa là $ \ mu_c $, covariance $ \ sigma_c $ và frecy_per_class $ \ pi_c $ mỗi cụm C C

$ \ Underline {E-Step} $

  1. Tính toán cho mỗi datapoint $ x_i $ xác suất $ 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ả Mulitvariate Gaussian 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_ {IC} $ cao cho các giá trị Gaussian này và tương đối thấp.

    $ \ underline {m-bước} $

    Đối với mỗi cụm C: Tính tổng trọng lượng $ m_c $ (nói một cách lỏng lẻo 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:

    $$ 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 sử dụng các phương tiện cập nhật trong công thức cuối cùng này.
    Mind that you have to use the updated means in this last formula.

    Lặp lại lặp lại bước E và M cho đế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:

    $$ 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 ma trận là số ít. Một ma trận là số ít nếu nó không thể đảo ngược. Một ma trận sẽ không thể đảo ngược nếu có ma trận $ x $ sao cho $ ax = xa = i $. Nếu điều này không được đưa ra, ma trận được cho là số ít. Đó là, một ma trận như:

\ Bắt đầu {Bmatrix} 0 & 0 \\ 0 & 0 \ end {bmatrix}

là không thể đảo ngược và theo số ít. 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 chấm nó với bất kỳ ma trận 2x2 nào khác và bạn sẽ thấy rằng bạn sẽ luôn nhận được ma trận bằng không). Nhưng tại sao đây là một vấn đề đối với chúng tôi? Vâng, hãy xem xét công thức cho đa biến bình thường ở trên. Ở đó, bạn sẽ tìm thấy $ \ boldsymbol {\ sigma_c^{-1}} $, đó là sự không thể đảo ngược của ma trận hiệp phương sai. Vì một ma trận số ít không thể đảo ngược, điều này sẽ khiến chúng ta 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 ma trận số ít, không thể đảo ngược trông như thế nào và tại sao điều này lại quan trọng đối với chúng ta trong các tính toán GMM, làm thế nào chúng ta có thể gặp phải vấn đề này? Trước hết, chúng ta nhận được ma trận hiệp phương sai $ \ boldsymbol {0} $ này ở trên nếu Gaussian đa biến rơi vào một điểm trong quá trình lặp giữa bước E và M. Đ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 sự 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 của riêng họ trong khi Gaussian cuối cùng chỉ quản lý nó để bắt một điểm duy nhất mà nó ngồi. Chúng ta sẽ thấy điều này trô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 nhưng bạn không biết điều đó và muốn lắp 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ư (có thể 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):

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

Sau khi khởi tạo tham số, bạn lặp đi 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 chúng hội tụ, rằng sau một số lần lặp lại, chúng sẽ không còn thay đổi và do đó Gaussian tương ứng đã tìm thấy vị trí của nó trong không gian. Trong trường hợp bạn có một ma trận kỳ dị mà bạn gặp phải. giống:

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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 trong 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 trận kỳ 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 ma trận kỳ dị. 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 và giá trị thấp khác. Để 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 trong hình:

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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 ra xác suất cho mỗi $ x_i $ mà nó thuộc về Gaussian màu đỏ, xanh và vàng. Những gì bạn có thể thấy là đối với hầu hết các $ x_i $, xác suất mà nó thuộc về Gaussian màu vàng 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 bản 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. Bảng $ r_ {ic} $ sau đó trông smth. giống:

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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 vì một hàng này. Nếu chúng ta tìm kiếm DataPoint nào được biểu diễn ở đây, chúng ta sẽ nhận được DataPoint: [23.38566343 8.07067598]. Ok, nhưng tại sao chúng ta có một ma trận kỳ dị trong trường hợp này? Chà, và đây là bước cuối cùng của chúng tôi, do đó chúng tôi phải xem xét một lần nữa tính toán của ma trận hiệp phương sai đó là:

$$ \ 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 muốn chúng ta 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ờ đã, 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 $ \ boldsymbol {\ mu_j} = \ boldsymbol {x_n} $ cho một số giá trị của n "(Giám mục, 2006, tr.434). Vậy điều gì sẽ xảy ra? Chà, thuật ngữ này sẽ bằng không và do đó, DataPoint này là cơ hội duy nhất để ma trận hiệp phương sai không được không nhận được (vì DataPoint này là thứ duy nhất trong đó $ R_ {IC} $> 0), giờ đây nó có thể không :

\ Bắt đầu {Bmatrix} 0 & 0 \\ 0 & 0 \ end {bmatrix}

Do đó, như đã nói ở trên, đây là một ma trận số ít 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 tình huống 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ự kỳ 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 ma trận hiệp phương sai. Ngoài ra còn có những cách khác để ngăn chặn sự kỳ dị như nhận thấy khi Gaussian sụp đổ 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 ý. Sự chính quy 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ó lẽ bạn phải chạy mã nhiều lần để có được một ma trận hiệp phương sai số ít kể từ đó, như đã nói. Điều này không được 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.

Người giới thiệu

  • 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
  • Giám mục, trang. (2006). Nhận dạng mẫu và học máy. Berlin, Heidelberg: Springer, 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

Đào tạo Python sống

Hướng dẫn em algorithm for gaussian mixture model python - thuật toán em cho mô hình hỗn hợp gaussian python

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. of the E-step. These two steps are repeated until convergence is reached. In this way, a switch between the E-step and the M-step is possible, according to the randomly initialized parameters.

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

Chúng tôi xác định 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ụ: ngẫu nhiên) và sau đó tiến hành 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 điện tử và một bước M.EM (Expectation-Maximization) algorithm for Gaussian mixtures as follows. The algorithm is an iterative algorithm that starts from some initial estimate of Θ (e.g., random), and then proceeds to iteratively update Θ until convergence is detected. Each iteration consists of an E-step and an M-step.

GMM trong Python là gì?

Một mô hình hỗn hợp Gaussian (GMM) cố gắng tìm một hỗn hợp các phân phối xác suất Gaussian đa chiều mà mô hình hóa tốt nhất bất kỳ bộ dữ liệu đầu vào 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 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) attempts to find a mixture of multi-dimensional Gaussian probability distributions that best model any input dataset. In the simplest case, GMMs can be used for finding clusters in the same manner as k-means: from sklearn.mixture import GMM gmm = GMM(n_components=4). fit(X) labels = gmm.

Là mô hình hỗn hợp Gaussian phân cụm một thuật toán học máy được giám sát?

Tóm tắt: Các mô hình hỗn hợp Gaussian là một thuật toán học tập không giám sát phổ biến.Cách tiếp cận GMM tương tự như thuật toán phân cụm K-MEAN, nhưng mạnh mẽ hơn và do đó hữu ích do sự tinh tế.unsupervised learning algorithm. The GMM approach is similar to K-Means clustering algorithm, but is more robust and therefore useful due to sophistication.