狄利克雷分布的三维实现和狄利克雷过程中的stick—breaking算法的实现

转载请标明作者

首先是狄利克雷分布的三维实现,由于没法保证下面的坐标值加起来唯一,所以我采用了抽样的方法,从dirchidirichlet~(1,1,1)中抽的三维图像的坐标值,我只去前两个作为我的x,y值,代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy import stats
global LEN
LEN=1000
#抽样
rv=stats.dirichlet.rvs([1,1,1],3000)
#将前两个值作为我的x,y值
rvs=rv[:,0:2]
list=[]
for x in rv:
    #计算其对应的pdf值
    pdf=stats.dirichlet.pdf(x,alpha=[5,10,7])
    list.append(float(pdf))
fig=plt.figure()
ax=fig.gca(projection="3d")
ax.scatter(rvs[:,0],rvs[:,1],list)
plt.show()

由于,我采用的是抽样的方式,所以如果数据少的话,会出现空白部位,得到的图像为: 

接下来介绍一下 stick-breaking的实现,一般用于狄利克雷过程中数据的抽样,代码如下 :

import matplotlib.pyplot as plt
import numpy as np
#my stick breaking sampling
#使用的基函数是高斯
#dp~dp(alpha,gaussian(0,1))
def stick_breaking(alpha,sample_num):
    x_list=[]
    y_list=[]
    for x in range(sample_num):
        data_x=np.random.normal(0,1,1)
        beta=np.random.beta(1,alpha,1)
        y=(1-sum(y_list))*beta
        x_list.append(data_x)
        y_list.append(y)
    return x_list,y_list
alpha=1000
sample_num=500#样本数
x_list,y_list=stick_breaking(alpha,sample_num)
plt.stem(x_list,y_list)
plt.show()

得到的图像如下:

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于层次狄利克过程(HDP)是一种比较复杂的模型,其实现也比较困难,需要结合一些高级的数学和概率知识。下面是一个简单的示例代码,实现了一个二项分布的HDP模型: ```python import numpy as np from scipy.stats import beta, binom class HDP: def __init__(self, alpha, gamma, a, b): self.alpha = alpha self.gamma = gamma self.a = a self.b = b self.table_assignments = [] self.table_counts = [] self.customers = [] def fit(self, data, iterations): def sample_table(alpha, table_counts): prob = np.append(table_counts, alpha) prob /= np.sum(prob) return np.random.choice(range(len(prob)), p=prob) def sample_beta(a, b, table_counts): return beta.rvs(a + table_counts[0], b + np.sum(table_counts[1:])) def sample_assignments(data, table_assignments, table_counts, customers, alpha, gamma, a, b): for i, x in enumerate(data): k = len(customers) table = sample_table(alpha, table_counts) if table == k: beta = sample_beta(a, b, table_counts) new_table_counts = [binom.rvs(x, beta), x - binom.rvs(x, beta)] table_counts.append(new_table_counts) customers.append([i]) else: table_counts[table][0] += binom.rvs(x, customers[table][0]) # 更新表格计数 table_counts[table][1] += x - binom.rvs(x, customers[table][0]) customers[table].append(i) table_assignments[i] = table empty_tables = [i for i in range(len(table_counts)) if table_counts[i][0] == 0] for table in empty_tables: table_counts.pop(table) customers.pop(table) for i in range(len(table_assignments)): if table_assignments[i] > table: table_assignments[i] -= 1 return table_assignments, table_counts, customers self.table_assignments = np.zeros(len(data), dtype=int) self.table_counts = [[binom.rvs(data[0], beta.rvs(self.a, self.b)), data[0] - binom.rvs(data[0], beta.rvs(self.a, self.b))]] self.customers = [[0]] for i in range(1, len(data)): self.table_assignments[i] = len(self.customers) self.table_counts[-1][0] += binom.rvs(data[i], beta.rvs(self.a, self.b)) self.table_counts[-1][1] += data[i] - binom.rvs(data[i], beta.rvs(self.a, self.b)) self.customers[-1].append(i) for iter in range(iterations): self.table_assignments, self.table_counts, self.customers = sample_assignments(data, self.table_assignments, self.table_counts, self.customers, self.alpha, self.gamma, self.a, self.b) ``` 这个示例代码只实现了HDP的一部分,不过可以作为一个入门的参考。HDP是非常强大的模型,可以用于很多实际问题,比如文本分类、聚类分析等等。如果需要更深入的了解HDP,建议阅读相关的论文和书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值