scikit-learn:如何使用拟合概率模型?

Posted

技术标签:

【中文标题】scikit-learn:如何使用拟合概率模型?【英文标题】:scikit-learn: How to use the fitted probability model? 【发布时间】:2015-12-01 20:53:00 【问题描述】:

所以我已经使用scikit-learn的Gaussian mixture models(http://scikit-learn.org/stable/modules/mixture.html)来拟合我的数据,现在我想使用模型,我该怎么做呢?具体来说:

    如何绘制概率密度分布? 如何计算拟合模型的均方误差?

这是您可能需要的代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from sklearn import mixture
import matplotlib as mpl

from matplotlib.patches import Ellipse
%matplotlib inline

n_samples = 300

# generate random sample, two components
np.random.seed(0)
shifted_gaussian = np.random.randn(n_samples, 2) + np.array([20, 5])
sample= shifted_gaussian 

# fit a Gaussian Mixture Model with two components
clf = mixture.GMM(n_components=2, covariance_type='full')
clf.fit(sample)

# plot sample scatter
plt.scatter(sample[:, 0], sample[:, 1])

# 1. Plot the probobility density distribution
# 2. Calculate the mean square error of the fitting model

更新: 我可以通过以下方式绘制分布:

x = np.linspace(-20.0, 30.0)
y = np.linspace(-20.0, 40.0)
X, Y = np.meshgrid(x, y)
XX = np.array([X.ravel(), Y.ravel()]).T
Z = -clf.score_samples(XX)[0]
Z = Z.reshape(X.shape)

CS = plt.contour(X, Y, Z, norm=LogNorm(vmin=1.0, vmax=1000.0),
                 levels=np.logspace(0, 3, 10))
CB = plt.colorbar(CS, shrink=0.8, extend='both')

但这不是很奇怪吗?有没有更好的办法呢?我可以画这样的东西吗?

【问题讨论】:

为什么你认为结果不对?请参阅下面的修改图: 【参考方案1】:

我认为结果是合理的,如果你稍微调整一下xlim和ylim:

# plot sample scatter
plt.scatter(sample[:, 0], sample[:, 1], marker='+', alpha=0.5)

# 1. Plot the probobility density distribution
# 2. Calculate the mean square error of the fitting model
x = np.linspace(-20.0, 30.0, 100)
y = np.linspace(-20.0, 40.0, 100)
X, Y = np.meshgrid(x, y)
XX = np.array([X.ravel(), Y.ravel()]).T
Z = -clf.score_samples(XX)[0]
Z = Z.reshape(X.shape)

CS = plt.contour(X, Y, Z, norm=LogNorm(vmin=1.0, vmax=10.0),
                 levels=np.logspace(0, 1, 10))
CB = plt.colorbar(CS, shrink=0.8, extend='both')
plt.xlim((10,30))
plt.ylim((-5, 15))

【讨论】:

嗯,我的意思是我可以去掉X和Y的设置,让matplotlib来处理吗?这样作图真的很累。 有没有类似plt.density(Z) 的东西?我只是想画得更简单。 我猜plt.imshow(Z, cmap=cm.gray) 会做吗?但是他们必须让轴对齐(x,y 将超出比例)。最好留在contour 它是一种期望最大化的拟合方法,拟合优度通过AIC、BIC、对数似然等来衡量。访问那些使用clf.bic(sample)``clf.aic(sample) 我可能不够清楚。我不是说拟合方法的问题。只是有too much codeplot a probability density function。我只想知道如何轻松绘制密度函数。

以上是关于scikit-learn:如何使用拟合概率模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不拟合的情况下实例化具有已知系数的 Scikit-Learn 线性模型

多标签分类器中的拟合概率

用 scikit-learn 拟合向量自回归模型

使 Python 能够利用所有内核来拟合 scikit-learn 模型

并行拟合 scikit-learn 模型?

BIC 使用来自 scikit-learn 的 GaussianMixture 过度拟合图像分割模型中的组件数量