天天看点

机器学习之高斯混合模型(一)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)
           

继续阅读