天天看點

機器學習之高斯混合模型(一)GMM實戰——根據身高體重進行人群聚類

高斯混合模型

  • 高斯混合模型就是用高斯機率密度函數(正态分布曲線)精确地量化事物,它是一個将事物分解為若幹的基于高斯機率密度函數(正态分布曲線)形成的模型。
  • 在統計學中,混合模型是用于表示總體群體中亞群體的存在的機率模型
  • 高斯混合模型(Gaussian Mixture Model)為單一高斯機率密度函數的延伸,用多個高斯機率密度函數(正态分布曲線)精确地量化變量分布,是将變量分布分解為若幹基于高斯機率密度函數(正态分布曲線)分布的統計模型。
  • 應用:聚類:樣本受到哪個高斯分布的作用大,就認為樣本屬于哪個高斯分布

比較KMeans

  • Kmeans是簡單的,因為它是基于假設一個樣本僅以1或0的機率屬于某一簇,這兩者之間的取值并沒有考慮,他無法考慮中間的取值,即一個點僅以某個機率屬于某個類别是不能計算的。
  • 高斯混合模型不是簡單的考慮歐式距離的問題,它是使用高斯機率密度函數(正态分布曲線)精确地量化事物,它是一個将事物分解為若幹的基于高斯機率密度函數(正态分布曲線)形成的模型。 高斯模型就是用高斯機率密度函數(正态分布曲線)精确地量化事物

資料如下

Sex	Height(cm)	Weight(kg)
0	156	50
0	160	60
0	162	54
0	162	55
0	160.5	56
0	160	53
0	158	55
0	164	60
0	165	50
0	166	55
0	158	47.5
0	161	49
0	169	55
0	161	46
0	160	45
0	167	44
0	155	49
0	154	57
0	172	52
0	155	56
0	157	55
0	165	65
0	156	52
0	155	50
0	156	56
0	160	55
0	158	55
0	162	70
0	162	65
0	155	57
0	163	70
0	160	60
0	162	55
0	165	65
0	159	60
0	147	47
0	163	53
0	157	54
0	160	55
0	162	48
0	158	60
0	155	48
0	165	60
0	161	58
0	159	45
0	163	50
0	158	49
0	155	50
0	162	55
0	157	63
0	159	49
0	152	47
0	156	51
0	165	49
0	154	47
0	156	52
0	162	48
1	162	60
1	164	62
1	168	86
1	187	75
1	167	75
1	174	64
1	175	62
1	170	65
1	176	73
1	169	58
1	178	54
1	165	66
1	183	68
1	171	61
1	179	64
1	172	60
1	173	59
1	172	58
1	175	62
1	160	60
1	160	58
1	160	60
1	175	75
1	163	60
1	181	77
1	172	80
1	175	73
1	175	60
1	167	65
1	172	60
1	169	75
1	172	65
1	175	72
1	172	60
1	170	65
1	158	59
1	167	63
1	164	61
1	176	65
1	182	95
1	173	75
1	176	67
1	163	58
1	166	67
1	162	59
1	169	56
1	163	59
1	163	56
1	176	62
1	169	57
1	173	61
1	163	59
1	167	57
1	176	63
1	168	61
1	167	60
1	170	69

           

代碼實作如下

import numpy as np
import pandas as pd
from sklearn.mixture import GaussianMixture

## 資料加載
data = pd.read_csv('datas/HeightWeight.csv')
data_x = data[data.columns[1:]]
data_y = data[data.columns[0]]
data.head()

## 模型建立及訓練
gmm = GaussianMixture(n_components=2, covariance_type='full', random_state=28)
gmm.fit(data_x)

## 模型相關參數輸出
# print ('均值 = \n', gmm.means_)
# print ('方差 = \n', gmm.covariances_)

# 擷取預測值
y_hat = gmm.predict(data_x)
print(y_hat)
print(data_y.values.T)
           

繼續閱讀