标签: mixture-model

理解高斯混合模型的概念

我正在尝试通过阅读在线提供的资料来了解GMM.我已经使用K-Means实现了聚类,并且看到GMM将如何与K-means进行比较.

这是我所理解的,如果我的概念错了,请告诉我:

GMM就像KNN一样,在这两种情况下都实现了聚类.但在GMM中,每个群集都有自己独立的均值和协方差.此外,k-means执行数据点到集群的硬分配,而在GMM中,我们得到一组独立的高斯分布,并且对于每个数据点,我们有一个它属于其中一个分布的概率.

为了更好地理解它,我使用MatLab对其进行编码并实现所需的聚类.我使用SIFT功能进行特征提取.并使用k-means聚类来初始化值.(这来自VLFeat文档)

%images is a 459 x 1 cell array where each cell contains the training image
[locations, all_feats] = vl_dsift(single(images{1}), 'fast', 'step', 50); %all_feats will be 128 x no. of keypoints detected
for i=2:(size(images,1))
    [locations, feats] = vl_dsift(single(images{i}), 'fast', 'step', 50);
    all_feats = cat(2, all_feats, feats); %cat column wise all features
end

numClusters = 50; %Just a random selection.
% Run KMeans to pre-cluster the data
[initMeans, assignments] = vl_kmeans(single(all_feats), numClusters, ...
    'Algorithm','Lloyd', ...
    'MaxNumIterations',5); …
Run Code Online (Sandbox Code Playgroud)

matlab classification cluster-analysis machine-learning mixture-model

24
推荐指数
1
解决办法
2万
查看次数

如何在PyMC中模拟3个法线的混合?

CrossValidated上有一个关于如何使用PyMC将两个Normal分布拟合到数据的问题.Cam.Davidson.Pilon的答案是使用伯努利分布将数据分配给两个法线之一:

size = 10
p = Uniform( "p", 0 , 1) #this is the fraction that come from mean1 vs mean2
ber = Bernoulli( "ber", p = p, size = size) # produces 1 with proportion p.
precision = Gamma('precision', alpha=0.1, beta=0.1)

mean1 = Normal( "mean1", 0, 0.001 )
mean2 = Normal( "mean2", 0, 0.001 )

@deterministic
def mean( ber = ber, mean1 = mean1, mean2 = mean2):
    return ber*mean1 + (1-ber)*mean2
Run Code Online (Sandbox Code Playgroud)

现在我的问题是:如何用三个法线做到这一点? …

mixture-model pymc

9
推荐指数
1
解决办法
2064
查看次数

特征缩放对准确性的影响

我正在使用高斯混合模型进行图像分类.我有大约34,000个特征,属于三个类,都位于23维空间中.我使用不同的方法对训练和测试数据进行了特征缩放,并且我观察到在执行缩放后精度实际上降低了.我执行了特征缩放,因为许多特征之间存在许多顺序的差异.我很想知道为什么会这样,我认为特征缩放会提高准确性,特别是考虑到功能的巨大差异.

normalization mixture-model

9
推荐指数
1
解决办法
5809
查看次数

图像直方图的高斯混合模型

我试图基于像素强度值对2D MR图像的不同区域进行自动图像分割.第一步是在图像的直方图上实现高斯混合模型.

test.jpg放在

我需要将从score_samples方法中获得的高斯图绘制到直方图上.我已经尝试按照(理解高斯混合模型)的答案中的代码.

然而,得到的高斯不能完全匹配直方图.如何让高斯与直方图匹配?

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

# Read image
img = cv2.imread("test.jpg",0)

hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist[0] = 0     # Removes background pixels

# Fit GMM
gmm = GaussianMixture(n_components = 3)
gmm = gmm.fit(hist)

# Evaluate GMM
gmm_x = np.linspace(0,255,256)
gmm_y = np.exp(gmm.score_samples(gmm_x.reshape(-1,1)))


# Plot histograms and gaussian curves
fig, ax = plt.subplots()
ax.hist(img.ravel(),255,[1,256])
ax.plot(gmm_x, gmm_y, color="crimson", lw=4, label="GMM")

ax.set_ylabel("Frequency")
ax.set_xlabel("Pixel Intensity")

plt.legend()

plt.show()
Run Code Online (Sandbox Code Playgroud)

我还尝试用总和手动构建高斯. …

python gaussian image-segmentation scikit-learn mixture-model

8
推荐指数
1
解决办法
3031
查看次数

scikit-learn GMM产生正对数概率

我正在使用python scikit-learn包中的高斯混合模型来训练我的数据集,但是,当我编码时,我想到了

- G =混合物.GMM(...)

- G.fit(...)

- G.score(总和特征)

得到的对数概率是正实数...为什么?不是对数概率保证为负数?

我知道了.高斯混合模型返回给我的是对数概率"密度"而不是概率"质量",所以正值是完全合理的.

如果协方差矩阵接近单数,那么GMM将不会很好地表现,并且通常意味着数据不适合这样的生成任务

python machine-learning scikit-learn mixture-model

7
推荐指数
1
解决办法
3885
查看次数

有关如何使用ggplot2绘制mixEM类型数据的任何建议

我有一个从原始数据中获得的1m记录样本.(供您参考,您可以使用可能产生大致相似分布的虚拟数据

b <- data.frame(matrix(rnorm(2000000, mean=c(8,17), sd=2)))
c <- b[sample(nrow(b), 1000000), ]
Run Code Online (Sandbox Code Playgroud)

我认为直方图是两个对数正态分布的混合,我试图使用EM算法使用以下代码拟合求和的分布:

install.packages("mixtools")
lib(mixtools)
#line below returns EM output of type mixEM[] for mixture of normal distributions
c1 <- normalmixEM(c, lambda=NULL, mu=NULL, sigma=NULL) 
plot(c1, density=TRUE)
Run Code Online (Sandbox Code Playgroud)

第一个图是对数似然图,第二个图(如果再次点击返回),给出类似于以下密度曲线:

混合物模型密度曲线

正如我所提到的,c1的类型为mixEM [],而plot()函数可以容纳它.我想用颜色填充密度曲线.这很容易使用ggplot2()但ggplot2()不支持mixEM []类型的数据并抛出此消息:

"ggplot不知道如何处理类mixEM的数据"我还能采取其他方法解决这个问题吗?任何建议都非常感谢!!

谢谢!

r em ggplot2 density-plot mixture-model

7
推荐指数
2
解决办法
3059
查看次数

模拟每两个变量之间具有不同混合依赖结构的混合数据?

我想模拟混合数据,比如三维数据.我想在每两个变量之间有两个不同的组件.

也就是说,模拟混合数据(V1和V2),其中它们之间的依赖关系是两个不同的正常分量.然后,在V2和V3之间另外两个正常组件.所以,我将得到3d数据,第一个和第二个变量之间的依赖关系是两个法线的混合.并且第二和第三变量之间的依赖性是另外两个不同组分的混合.

另一种解释我问题的方法:

假设我想生成如下混合数据:

1- 0.3正常(0.5,1)+ 0.7正常(2,4)#因此在这里我将获得由两个不同法线(混合模型的两个分量)生成的双变量混合数据,混合器重量的总和为1.

然后,我想得到另一个变量如下:

2- 0.5 normal(2,4)#这是第一个模拟的第二个变量+ 0.5法线(2,6)

所以在这里,我得到了3d模拟混合数据,其中V1和V2由两个不同的混合成分生成,V2和V3由另一个不同的混合成分生成.

这是如何在r中生成数据:(我相信它不会生成双变量数据)

N <- 100000                 

#Sample N random uniforms U
U <- runif(N)

#Variable to store the samples from the mixture distribution                                             
rand.samples <- rep(NA,N)

#Sampling from the mixture
for(i in 1:N) {
    if(U[i]<.3) {
        rand.samples[i] <- rnorm(1,1,3)
    } else {
        rand.samples[i] <- rnorm(1,2,5)
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果我们生成混合双变量数据(两个变量),那么如何将其扩展为具有4个或5个变量,其中V1和V2由两个不同的法线生成(它们之间的依赖关系结构是两个法线的混合)然后V3将从另一个不同的法线生成,然后用V2进行复习.也就是说,当我们绘制V2~V3时,我们会发现它们之间的依赖关系结构是两个法线的混合,依此类推.

simulation r mixture-model mixture

7
推荐指数
1
解决办法
335
查看次数

R:产生混合物分布的功能

我需要从混合分布中生成样本

  • 40%的样本来自高斯(平均值= 2,sd = 8)

  • 20%的样本来自Cauchy(位置= 25,比例= 2)

  • 40%的样本来自高斯(平均值= 10,sd = 6)

为此,我写了以下函数:

dmix <- function(x){
prob <- (0.4 * dnorm(x,mean=2,sd=8)) + (0.2 * dcauchy(x,location=25,scale=2)) + (0.4 * dnorm(x,mean=10,sd=6))
return (prob)
}
Run Code Online (Sandbox Code Playgroud)

然后测试:

foo = seq(-5,5,by = 0.01)
vector = NULL
for (i in 1:1000){
vector[i] <- dmix(foo[i])
}
hist(vector)
Run Code Online (Sandbox Code Playgroud)

我得到这样的直方图(我知道这是错的) - 假定分布的直方图

我究竟做错了什么?谁能指点一下好吗?

r probability markov-chains mcmc mixture-model

6
推荐指数
1
解决办法
6589
查看次数

Predict_proba 不适用于我的高斯混合模型(sklearn,python)

运行Python 3.7.3

我制作了一个简单的 GMM 并将其拟合到一些数据。使用 Predict_proba 方法,返回的是 1 和 0,而不是属于每个高斯的输入的概率。

我最初在更大的数据集上进行了尝试,然后尝试获取一个最小的示例。

from sklearn.mixture import GaussianMixture
import pandas as pd

feat_1 = [1,1.8,4,4.1, 2.2]
feat_2 = [1.4,.9,4,3.9, 2.3]
test_df = pd.DataFrame({'feat_1': feat_1, 'feat_2': feat_2})

gmm_test = GaussianMixture(n_components =2 ).fit(test_df)

gmm_test.predict_proba(test_df) 
gmm_test.predict_proba(np.array([[8,-1]]))
Run Code Online (Sandbox Code Playgroud)

我得到的数组只是 1 和 0,或者几乎是(10^-30 或其他)。

除非我错误地解释了某些内容,否则返回应该是每个的概率,例如,

gmm_test.predict_proba(np.array([[8,-1]])) 
Run Code Online (Sandbox Code Playgroud)

当然不应该是[1,0]或[0,1]。

python scikit-learn mixture-model gmm

6
推荐指数
1
解决办法
4463
查看次数

考虑二维高斯模型中的噪声

我需要将二维高斯嵌入大量均匀噪声中,如下左图所示。我尝试将sklearn.mixture.GaussianMixture与两个组件(代码在底部)一起使用,但这显然失败了,如下右图所示。

在此输入图像描述

我想为属于二维高斯和均匀背景噪声的每个元素分配概率。这似乎是一个足够简单的任务,但我没有找到“简单”的方法来完成它。

有什么建议吗?它不需要是 GMM,我对其他方法/包持开放态度。


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

# Generate 2D Gaussian data
N_c = 100
xy_c = np.random.normal((.5, .5), .05, (N_c, 2))

# Generate uniform noise
N_n = 1000
xy_n = np.random.uniform(.0, 1., (N_n, 2))

# Combine into a single data set
data = np.concatenate([xy_c, xy_n])

# fit a Gaussian Mixture Model with two components
model = mixture.GaussianMixture(n_components=2, covariance_type='full')
model.fit(data)
probs = model.predict_proba(data)
labels = model.predict(data)
# Separate the …
Run Code Online (Sandbox Code Playgroud)

python cluster-analysis machine-learning gaussian mixture-model

5
推荐指数
1
解决办法
398
查看次数