我刚刚完成 Bayesian Analysis in Python通过 Osvaldo Martin 预订(了解贝叶斯概念和一些奇特的 numpy 索引的好书)。
我真的很想将我的理解扩展到用于无监督样本聚类的贝叶斯混合模型。我所有的谷歌搜索都把我带到了Austin Rochford's tutorial这真的很有用。我了解正在发生的事情,但我不清楚这如何适应集群(尤其是使用多个属性进行集群分配,但这是一个不同的主题)。
我了解如何为 Dirichlet 分布 分配先验,但我不知道如何在 PyMC3 中获取簇。看起来大部分 mus 都收敛到质心(即我从中采样的分布的均值),但它们仍然是独立的 组件。我考虑过为 weights(模型中的 w)做一个截止,但这似乎不像我想象的那样工作,因为多个 components 收敛的均值参数 mus 略有不同。
我如何从这个 PyMC3 模型中提取簇(质心)? 我给了它最多 15 我想要的组件收敛到 3。 mus 似乎在正确的位置,但权重被弄乱了 b/c 它们分布在其他集群之间,所以我不能使用权重阈值(除非我合并它们但我不'认为这是通常完成的方式)。
import pymc3 as pm
import numpy as np
import matplotlib.pyplot as plt
import multiprocessing
import seaborn as sns
import pandas as pd
import theano.tensor as tt
%matplotlib inline
# Clip at 15 components
K = 15
# Create mixture population
centroids = [0, 10, 50]
weights = [(2/5),(2/5),(1/5)]
mix_3 = np.concatenate([np.random.normal(loc=centroids[0], size=int(150*weights[0])), # 60 samples
np.random.normal(loc=centroids[1], size=int(150*weights[1])), # 60 samples
np.random.normal(loc=centroids[2], size=int(150*weights[2]))])# 30 samples
n = mix_3.size
# Create and fit model
with pm.Model() as Mod_dir:
alpha = pm.Gamma('alpha', 1., 1.)
beta = pm.Beta('beta', 1., alpha, shape=K)
w = pm.Deterministic('w', beta * tt.concatenate([[1], tt.extra_ops.cumprod(1 - beta)[:-1]]))
component = pm.Categorical('component', w, shape=n)
tau = pm.Gamma("tau", 1.0, 1.0, shape=K)
mu = pm.Normal('mu', 0, tau=tau, shape=K)
obs = pm.Normal('obs',
mu[component],
tau=tau[component],
observed=mix_3)
step1 = pm.Metropolis(vars=[alpha, beta, w, tau, mu, obs])
# step2 = pm.CategoricalGibbsMetropolis(vars=[component])
step2 = pm.ElemwiseCategorical([component], np.arange(K)) # Much, much faster than the above
tr = pm.sample(1e4, [step1, step2], njobs=multiprocessing.cpu_count())
#burn-in = 1000, thin by grabbing every 5th idx
pm.traceplot(tr[1e3::5])
下面有类似的问题
https://stats.stackexchange.com/questions/120209/pymc3-dirichlet-distribution用于回归而不是聚类
https://stats.stackexchange.com/questions/108251/image-clustering-and-dirichlet-process DP过程理论
Dirichlet process in PyMC 3将我定向到 Austin Rochford 上面的教程
最佳答案
在 pymc3 中添加一些新的内容将有助于阐明这一点。我想我在添加 Dirichlet Process 示例后更新了它们,但在文档清理期间它似乎已恢复为旧版本;我会尽快解决这个问题。
困难之一是您生成的数据比组件均值上的先验可以容纳的数据分散得多;如果您对数据进行标准化,样本混合的速度应该会快得多。
第二个是 pymc3 现在支持指标变量 component 被边缘化的混合分布。这些边际混合分布将有助于加速混合并允许您使用 NUTS(使用 ADVI 初始化)。
最后,有了这些无限模型的截断版本,当遇到计算问题时,增加潜在组件的数量通常是有用的。我发现 K = 30 对于这个模型比 K = 15 效果更好。
以下代码实现了这些更改并显示了如何提取“事件”组件的含义。
from matplotlib import pyplot as plt
import numpy as np
import pymc3 as pm
import seaborn as sns
from theano import tensor as T
blue = sns.color_palette()[0]
np.random.seed(462233) # from random.org
N = 150
CENTROIDS = np.array([0, 10, 50])
WEIGHTS = np.array([0.4, 0.4, 0.2])
x = np.random.normal(CENTROIDS[np.random.choice(3, size=N, p=WEIGHTS)], size=N)
x_std = (x - x.mean()) / x.std()
fig, ax = plt.subplots(figsize=(8, 6))
ax.hist(x_std, bins=30);
K = 30
with pm.Model() as model:
alpha = pm.Gamma('alpha', 1., 1.)
beta = pm.Beta('beta', 1., alpha, shape=K)
w = pm.Deterministic('w', beta * T.concatenate([[1], T.extra_ops.cumprod(1 - beta)[:-1]]))
tau = pm.Gamma('tau', 1., 1., shape=K)
lambda_ = pm.Uniform('lambda', 0, 5, shape=K)
mu = pm.Normal('mu', 0, tau=lambda_ * tau, shape=K)
obs = pm.NormalMixture('obs', w, mu, tau=lambda_ * tau,
observed=x_std)
with model:
trace = pm.sample(2000, n_init=100000)
fig, ax = plt.subplots(figsize=(8, 6))
ax.bar(np.arange(K) - 0.4, trace['w'].mean(axis=0));
我们看到似乎使用了三个组件,并且它们的权重相当接近真实值。
最后,我们看到这三个分量的后验预期均值与真实(标准化)均值相当吻合。
trace['mu'].mean(axis=0)[:3]
array([-0.73763891, -0.17284594, 2.10423978])
(CENTROIDS - x.mean()) / x.std()
array([-0.73017789, -0.16765707, 2.0824262 ])
关于python - 如何从 PyMC3 中的狄利克雷过程中提取无监督集群?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41553988/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack