从数据中推断用户行为--模型实现
接着上一篇讲吧: https://yq.aliyun.com/articles/656644?spm=a2c4e.11155435.0.0.5b663312UP3TMa
1.用户短信模型
C(t) ~ Poisson(lambda_1) t < tau # 用户在第t天前每天收到的短信数量C服从参数为lambda_1的泊松分布。
~ Poisson(lambda_2) t >= tau # 用户在第t天前每天收到的短信数量C服从参数为lambda_2的泊松分布。
其中 lambda_1~Exp(1/alpha)
lambda_2~Exp(1/alpha), # lambda_1,lambda_2都服从参数为alpha 的指数分布。
alpha = E(data). # alpha是真实样本数据的平均值,也称为样本的数学期望。
那么我们希望从lambda的先验概率中产生大量的lambda,然后不断的
2.lambda的先验
lambda服从参数为实际数据期望倒数的指数分布。lambda的先验概率:
import scipy.stats as st from IPython.core.pylabtools import figsize import numpy as np from matplotlib import pyplot as plt count_data = np.loadtxt("data.cvs") count_data_len = len(count_data) avg = sum(count_data) / count_data_len # 数据的平均值 alpha = 1 / avg exp = st.expon(scale = avg) # 指数分布函数 x = np.linspace(0, 100, 1000) lambda_ = exp.pdf(x) # lambda的概率密度 plt.plot(x, lambda_, '-o', label='$\lambda$ ={}'.format(lambda_)) plt.xlabel('lambda', fontsize=12) plt.ylabel('Density', fontsize=12) plt.xlim(0, 100) plt.ylim(0) plt.show()
对于概率密度函数, lambda取x1,x2范围内的概率是蓝线在x1,x2的积分。
3.lambda的后验
from IPython.core.pylabtools import figsize import numpy as np from matplotlib import pyplot as plt import pymc as pm # 加载真实数据 sms_data = np.loadtxt("data.cvs") # alpha 为真实数据平均值 alpha = 1 / sms_data.mean() # 确定参数模型 lambda_1 = pm.Exponential("lambda_1", alpha) lambda_2 = pm.Exponential("lambda_2", alpha) tau = pm.DiscreteUniform("tau", lower=0, upper=len(sms_data)) # 当动态参数确定时,得到一组lambda_ @pm.deterministic def lambda_(tau=tau, lambda_1=lambda_1,lambda_2=lambda_2): out = np.zeros_like(sms_data) out[:tau] = lambda_1 out[tau:] = lambda_2 return out # 使用poisson分布去模拟真实的数据,用于生成观测数据。 observation = pm.Poisson("obs", lambda_, value=sms_data, observed=True) # 代入参数,生成Model model = pm.Model([observation, lambda_1, lambda_2, tau]) # 使用mcmc算法 mcmc = pm.MCMC(model) # 迭代计算,生成后验样本 mcmc.sample(40000, 10000) lambda_1_samples = mcmc.trace('lambda_1')[:] lambda_2_samples = mcmc.trace('lambda_2')[:] tau_samples = mcmc.trace('tau')[:] figsize(14.5, 15) ax = plt.subplot(311) ax.set_autoscale_on(False) plt.hist(lambda_1_samples, histtype="stepfilled", bins=30, alpha=0.85, label="posterior of $\lambda_1$", color="#A60628", normed=True) plt.legend(loc="upper left") plt.xlim(15,30) plt.xlabel("$\lambda_1$ value") plt.ylabel("Density") ax = plt.subplot(312) ax.set_autoscale_on(False) plt.hist(lambda_2_samples, histtype="stepfilled", bins=30, alpha=0.85, label="posterior of $\lambda_2$", color="#A60628", normed=True) plt.legend(loc="upper left") plt.xlim(15,30) plt.xlabel("$\lambda_2$ value") plt.ylabel("Density") ax = plt.subplot(313) ax.set_autoscale_on(False) w = 1.0 /tau_samples.shape[0] * np.ones_like(tau_samples) plt.hist(tau_samples, histtype="stepfilled", bins=len(sms_data), alpha=1, label=r"posterior of $\tau$", color="#A60628", weights=w, rwidth=2.) plt.xticks(np.arange(len(sms_data))) plt.legend(loc="upper left") plt.xlim(0, len(sms_data)) plt.xlabel(r"$\tau$ value") plt.ylabel("Probability")
代码运行结果:
代码隐去了很多底层的实现和算法的细节,从这三个参数的后验图中,我们可以看出lambda_1集中在18,lambda_2集中在22.5.符合我们预期的两个lambda参数不一致,而第三幅图也显示发生行为改变在第38天到41天概率上升。
4.从先验到后验
这一段需要使用贝叶斯定理和mcmc算法来解释,尝试过了,还是理解不了。
5.后验样本的作用
ax = plt.subplot(414) N = tau_samples.shape[0] expected = np.zeros(len(sms_data)) for day in range(0, len(sms_data)): ix = day < tau_samples # Each posterior sample corresponds to a value for tau # for each day, that value of tau indicates whether we're "before" (in the lambda 1 "regime") or # "after" (in the lambda 2 "regime") the switchpoint. # by taking the posterior samples of lambda 1/2 accordingly. expected[day] = (lambda_1_samples[ix].sum() + lambda_2_samples[~ix].sum()) / N plt.bar(np.arange(len(sms_data)), sms_data,color ="#340628", label="Observed text message per day") plt.plot(range(0, len(sms_data)), expected, lw = 4, color="#E24A33", label = "expected text message per day") plt.xlabel('time(day)') plt.ylabel('sms(piece)') plt.legend(loc="upper left") plt.xlim(0,len(sms_data))
通过后验样本,可以看出收到短信的期望在用户改变行为后逐渐增加。
6. 数学太差,很尴尬。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【剖析 | SOFARPC 框架】之SOFARPC 线程模型剖析
前言 上一篇,我们介绍了 SOFARPC 同步异步的实现,本文我们将会介绍 SOFARPC 中的线程模型。 本文会从同步异步,阻塞非阻塞开始讲起,进而探讨常见的线程模型设计,之后,我们会介绍下 SOFABolt 中对 Netty 的模型使用,最后 SOFARPC 在一次调用过程中各个步骤执行的线程。 几种常见的 IO 模型 首先介绍一下 Linux 的几种 IO 模型,以进程从 Socket 中读取数据为例。实际上,进程最终是通过 recvfrom 系统调用来读取数据。这个时候,系统内核在收到之后,根据 IO 模型的不同,处理是不同的。 注意,图下的红色部分表示阻塞时间。 阻塞 I/O 阻塞 I/O(blocking I/O) 模型是最流行,最简单易用的 I/O 模型,默认情况下,所有套接字和文件描述符就是阻塞的。阻塞 I/O 将使请求进程阻塞
- 下一篇
区块链教程Fabric1.0源代码分析Ledger blkstorage block文件存储-兄弟连区块链
区块链教程Fabric1.0源代码分析Ledger blkstorage block文件存储,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。 Fabric 1.0源代码笔记 之 Ledger #blkstorage(block文件存储) blkstorage概述 blkstorage,默认目录/var/hyperledger/production/ledgersData/chains,含index和chains两个子目录。其中index为索引目录,采用leveldb实现。而chains为各ledger的区块链文件,子目录以ledgerid为名,使用文件系统实现。 blkstorage相关代码在common/ledger/blkstorage目录,目录结构如下: blockstorage.go,定义核心接口BlockStoreProvider和BlockStore。 fsblkstorage目录,BlockStoreProvider和BlockStore接...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果