gpt4 book ai didi

python - Python中sklearn包中的Gaussianmixture有什么问题?

转载 作者:行者123 更新时间:2023-12-01 01:00:24 24 4
gpt4 key购买 nike

我正在 python 中使用 sklearn 的高斯混合(GM)来识别星团的成员。 GM用两个组件调整,其他为默认。如图所示,一颗恒星(带有红点)显然不是星团成员,但显示为成员。中间图表中聚集的红点可能是我的成员。但左上角的单个红点不应该是成员。因为距离这个中间群体还不够近。

My cluster image

我的Python代码是

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

import matplotlib.pyplot as plt
from matplotlib import style
import matplotlib.colors as mtcolor

style.use("seaborn-white")
clist = ["gray", "red"]
cmap = mtcolor.ListedColormap(clist)

eX = pd.read_csv("mysatrs.csv", usecols=['col1', 'col2', 'col3']).values

col0m = (eX[:,0] >= -5) & (eX[:,0] <= 5)
col1m = (eX[:,1] >= -5) & (eX[:,1] <= 5)
col2m = (eX[:,2] > 0)

X = eX[col0m & col1m & col2m]

plt.figure(figsize=(6,6))

hcgmm = GaussianMixture(n_components=2)
gmmfit = hcgmm.fit(X)
gmmprd = gmmfit.predict(X)
hcprobs = gmmfit.predict_proba(X)
hcmns = hcgmm.means_

plt.scatter(X[:,0], X[:,1], c=gmmprd, s=3, cmap=cmap)
plt.show()

GM是否应该再做一次调整?

最佳答案

TLDR:每次运行时得到的拟合都会改变,尝试几次并保留最好的一个(最低的 hcgmm.bic())。您的数据似乎具有三个维度,我猜另一个维度正在抛出问题(包括链接或绘制它会有所帮助)。

如果有人想要更长的示例,这里有一个 MWE。首先我们提取包并生成一些数据:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture

background = np.random.randn(50,2) * 5
cluster = np.random.randn(50,2)

plt.scatter(background[:,0], background[:,1])
plt.scatter(cluster[:,0], cluster[:,1])

这给出了类似于OP的东西:

random draw

然后我可以安装 GMM正如OP所做的那样:

gmm = GaussianMixture(n_components=2)
fit = gmm.fit(X)

并绘制结果:

plt.scatter(X[:,0], X[:,1], c=fit.predict(X))

但大多数情况下我都会感到很不舒服。但运行几次后,我得到了这个:

fit with bic 993.5

这表明我们可以(至少有时)恢复合理的分区。 BIC这种拟合度为 993.5,而我经常得到 >1000 的值,在视觉上看起来很糟糕。

如果我使用上述随机数据运行 fit 1000 次,我可以生成 CDF看起来像:

flipped CDF

(x/y 轴方向错误,x 是概率,y 是 BIC 值),这表示它将在大约 10% 的时间内恢复良好的分区。尝试其他随机抽奖表明情况有所不同,但我的成功率没有超过约 40%。

鉴于您只有几个点和组件,您可以尝试一种计算量更大的方法。我预计贝叶斯 MCMC 混合模型在这里会做得更好。

我刚刚记得 Rand index是检查分区准确性的简单方法。我们可以生成大量测试数据,对其进行拟合并通过以下操作获得 BIC 和 Rand 指数:

from sklearn.metrics import adjusted_rand_score

true_labels = (np.random.random(100) < 0.5).astype(int)
ix_a, = np.nonzero(true_labels == 0)
ix_b, = np.nonzero(true_labels == 1)

gmm = GaussianMixture(n_components=2)

def test():
X = np.empty((len(true_labels), 2), float)
X[ix_a,:] = np.random.randn(len(ix_a), 2) * 5
X[ix_b,:] = np.random.randn(len(ix_b), 2)

fit = gmm.fit(X)
ari = adjusted_rand_score(true_labels, fit.predict(X))
return fit.bic(X), ari

fits = np.array([test() for _ in range(1000)])

然后绘制结果分布:

plot of fits from above

这表明我们在 76% 的时间里没有得到任何有用的东西。如果我们有 1000 个数据点(即 X 有 1000 行),那么它在大多数情况下都会恢复合理的分区。但是,如果我从“Uniform(-10, 10)”分布中绘制背景,例如与:

background = np.random.rand(500,2) * 20 - 10
cluster = np.random.randn(500,2)

它再次严重失败(ARI<0.5 ~ 99.5%)。基本上,GM 模型似乎无法很好地处理非高斯数据。

关于python - Python中sklearn包中的Gaussianmixture有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55847938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com