Jiahong的个人博客

凡事预则立不预则废


  • Home

  • Tags

  • Archives

  • Search

PyTorch——计算机视觉torchvision

Posted on 2018-02-04

PyTorch中有个torchvision包,里面包含着很多计算机视觉相关的数据集(datasets),模型(models)和图像处理的库(transforms)等
本文主要介绍数据集中(ImageFolder)类和图像处理库(transforms)的用法


PyTorch预先实现的Dataset

  • ImageFolder

    1
    from torchvision.datasets import ImageFolder
  • COCO

    1
    from torchvision.datasets import coco
  • MNIST

    1
    from torchvision.datasets import mnist
  • LSUN

    1
    from torchvision.datasets import lsun
  • CIFAR10

    1
    from torchvision.datasets import CIFAR10

ImageFolder

  • ImageFolder假设所有的文件按照文件夹保存,每个文件夹下面存储统一类别的文件,文件夹名字为类名

  • 构造函数

    1
    ImageFolder(root, transform=None, target_transform=None, loader=default_loader)
    • root:在root指定的路径下寻找图片,root下面的每个子文件夹就是一个类别,每个子文件夹下面的所有文件作为当前类别的数据
    • transform:对PIL Image进行的转换操作,transform的输入是使用loader读取图片的返回对象
      • PIL是 Python Imaging Library 的简称,是Python平台上图像处理的标准库
    • target_transform:对label的转换, 默认会自动编码
      • 默认编码为从0开始的数字,如果我们自己将文件夹命名为从0开头的数字,那么将按照我们的意愿命名,否则命名顺序不确定
      • 测试证明,如果文件夹下面是root/cat/, root/dog/两个文件夹,则自动编码为{‘cat’: 0, ‘dog’: 1}
      • class_to_idx属性存储着文件夹名字和类别编码的映射关系,dict
      • classes属性存储着所有类别,list
    • loader:从硬盘读取图片的函数
      • 不同的图像读取应该用不同的loader
      • 默认读取为RGB格式的PIL Image对象
      • 下面是默认的loader
        1
        2
        3
        4
        5
        6
        def default_loader(path):
        from torchvision import get_image_backend
        if get_image_backend() == 'accimage':
        return accimage_loader(path)
        else:
        return pil_loader(path)

transfroms详解

  • 包导入

    1
    from torchvision.transforms import transforms
  • transforms包中包含着很多封装好的transform操作

    • transforms.Scale(size):将数据变成制定的维度
    • transforms.ToTensor():将数据封装成PyTorch的Tensor类
    • transforms.Normalize(mean, std): 将数据标准话,具体标准化的参数可指定
  • 可将多个操作组合到一起,同时传入 ImageFolder 等对数据进行同时操作,每个操作被封装成一个类

    1
    2
    3
    4
    simple_transform = transforms.Compose([transforms.Resize((224,224))
    ,transforms.ToTensor()
    ,transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
    train = ImageFolder('dogsandcats/train/',simple_transform)
  • torchvision.transforms.transforms包下的操作类都是基于torchvision.transforms.functional下的函数实现的

    • 导入torchvision.transforms.functional的方式
      1
      from torchvision.transforms import functional

ML——归一化与标准化

Posted on 2018-02-01

本文总结归一化与标准化的理解和使用, 涉及到无量纲,中心化等知识, 但是并不完全


归一化

Normalization

  • 把数据变成[0,1]或[-1,1]的小数

  • 把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权

  • 归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量

    • 无量纲的理解:
      • 通过某种数值变换去掉单位,的影响,比如”kg”和”g”都可以表示体重,但是前者的数字比后者小
      • 不管是”kg”还是”g”作为单位,无量纲后他们的数值应该是一样的
      • 无量纲的本质是说: 变换后, 单位不再影响数据的数值
  • 应用:

    • LR等用梯度下降时, 先使用数据归一化可以使得梯度下降速度加快(否则可能下降方向并不是最好方向)

归一化的不同方法

线性归一化
  • Min-Max Normalization
    $$ x_i’ = \frac{x_i-min(X)}{max(X)-min(X)}$$
  • 平均归一化
    $$ x_i’ = \frac{x_i-mean(X)}{max(X)-min(X)}$$
  • 上面两种归一化在新数据加入时最大最小值会变化,所以不能在线归一化
非线性归一化
  • 对数函数转换等

标准化

Standardization

  • 使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1
  • 数学描述
    $$x_i’ = \frac{x-mean(X)}{std(X)}$$

中心化

  • 平均值为0,对标准差无要求
  • 数学描述
    $$x_i’ = x-mean(X)$$

归一化 vs 标准化

不同点

  • 归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种
  • 标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响

相同点

  • 都能取消由于量纲不同引起的误差
  • 都是一种线性变换(都是对向量X按照比例压缩再进行平移)
  • 个人理解: 标准化可以看作是一种特殊的归一化

中心化 vs 标准化

  • 标准化 = 中心化 + 数据除以标准差(使得数据标准差为1)
  • 有些地方也把零均值归一化(Z-Score Normalization)称为标准化,公式与标准化相同

总结

  • 一些模型一般需要归一化
    • LR: 加快梯度下降过程(因为不同维度使用相同的学习率,所以容易造成走弯路)
    • KNN: 防止计算距离时大数吃小数的情况发生
    • PCA: 归一化后 \(X^TX\) 才能表示数据的协方差矩阵
    • 神经网络

关于神经网络为什么需要归一化?

数值问题
  • 归一化可以避免很多不必要的数值问题
    • 我理解的一种情况: 输入太大时, 权重太小, 容易造成精度问题, 数值太小时同理
  • 归一化可以避免梯度爆炸等问题
    • 个人理解: 如果数值很大的话, 梯度一般也会对应很大, 连续乘以后就容易造成梯度爆炸, 数值太小, 同理, 容易造成梯度消失
  • 加快学习
    • 与LR一样, 使用梯度下降优化神经网络参数时, 如果数值差别太大, 可能造成优化时梯度优化走弯路(因为不同维度使用的是相同的学习率)
  • 避免某些数值小的神经元输出被数值大的输出吞掉的情况
    • 个人理解: 虽然说我们找到合适权重后,可以使得二者到下一个神经元的差值没那么大, 但是我的理解是初始化的时候不知道数值,所以权重是随机的,之后如果两个神经元数值差距太大的话,是否会大值吞小值很难说

关于LR为什么需要归一化?

不是必要的

  • 因为LR使用梯度下降法求解参数时, 特征之间差别太大容易影响收敛速度, 归一化可以提升LR的收敛速度, 同时不影响分类结果

关于SVM为什么需要归一化?

是必要的

  • 因为SVM寻找的是所谓的间隔(margin), 就是两个支持向量的间隔
  • 如果不归一化的话, 这个间隔会因为不同特征的单位等, 数值被放大或者缩小, 从而造成无法评估间隔, 所以归一化对于SVM很重要

Sklearn——总体介绍

Posted on 2017-12-13

Sklearn 总体介绍


总结介绍图

ML——MLE和MAP的区别举例说明

Posted on 2017-10-18

本文用一个简单的例子在直观上说明极大似然估计与最大后验估计的区别


举例说明

  • 事件定义

    • A = 好好学习
    • B = 作弊
    • C = 班级第一
  • 条件概率

    • P(C|A) = 0.1
    • P(C|B) = 0.5
  • 已知某同学考了年级第一

    • 此时可得概率:
      • P(C) = 1
    • ML(极大似然估计,找一个使得结果发生可能性最大的条件
      计算条件概率P(结果|条件)
      • 参数为e
      • P(C|e = A) = 0.1
      • P(C|e = B) = 0.5
      • 该同学更可能是作弊了
    • 若此时添加先验:
      • P(A) = 0.99
      • P(B) = 0.01
    • MAP(计算后验概率,在结果发生时,最可能是什么产生的?
      计算后验概率:P(条件|结果),令P(C)=1
      • P(A|C) = P(C|A)P(A)/P(C) = 0.1*0.99/1 = 0.099
      • P(B|C) = P(C|B)P(B)/P(C) = 0.5*0.01/1 = 0.005
      • 此时可发现该同学更可能是好好学习了

深入分析:MLE与MAP的区别

  • MAP比MLE多考虑了一个先验概率,这个先验概率指明了条件概率的条件(例如 P(C|A)的先验是P(A))
  • MAP的是比较后验概率,ML的是比较条件概率,但是两者本质上都是找一个使得结果发生的最可能的原因
  • MLE可以认为是特殊的MAP
    • ML是先验概率为均匀分布时的MAP(上例中: 若P(A) = P(B), 则MLE等价于MAP)

ML——参数估计MLE-MAP-BEP

Posted on 2017-10-18

极大似然估计(Maximum Likelihood Estimation,MLE)
最大后验概率估计(Maximum a posteriori Estimation,MAP)
贝叶斯估计(Bayesian Parameter Estimation,BPE)


一般理解

  • 极大似然估计(MLE): 频率学派(参数为固定的某个值)
  • 贝叶斯估计(BPE): 贝叶斯学派(参数服从某个分布)
  • 最大后验概率估计(MAP): 一般的书籍认为属于频率学派
    • 个人理解:MAP前半部分是贝叶斯学派,后半部分是频率学派
      • 前半部分认为参数\(\theta\))有先验分布,此时参数服从一个分布,而不是确定的值,是贝叶斯学派的
      • 后半部分认为参数不是服从后验分布,而是一个具体的使得后验概率最大的值,这里是频率学派的做法
  • 三者的终极目标都是估计模型参数\(\theta\),MAP和MLE估计参数\(\theta\)为具体某个值,BPE估计参数\(\theta\)为一个分布
  • 其他贝叶斯网络模型(有向图概率图模型)参数估计的方法还有吉布斯采样,变分推断,EM算法等

极大似然估计与最大后验概率估计

  • 比较MLE与MAP直观理解见我的另一篇博客:MLE-vs-MAP——一个简单的例子说明二者的区别
  • 都只关注参数的具体某个最优值
  • 极大似然估计相当于是参数\(\theta\)的先验分布\(P(\theta)\)为均为分布的最大后验概率估计

最大后验概率估计与贝叶斯估计

  • 相似点:
    • 都考虑了参数的先验分布(贝叶斯学派)
    • 最大后验概率估计是贝叶斯估计的一种简化实现(不用求复杂的分母积分)
    • 二者都围绕下面的公式进行估计
      $$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{P(X)}$$
  • 区别:
    • 贝叶斯估计:不能忽略归一化因子\(P(X)\),此时\(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\),贝叶斯估计要计算后验分布,所以需要计算归一化因子
    • 最大后验概率估计:把分母\(P(X)\)给忽略了,直接对分子极大化求得最优的参数\(\theta^{\star}\),对不同参数值,分母积分结果是相同的,所以\(P(X)\)的值不影响最优参数值的选取,不用计算归一化因子(很复杂,需要积分),速度会快很多
  • 最大后验概率估计相当于是参数后验分布\(P(\theta|X)\)被最可能的参数值\(\theta^{\star}=\arg\max_{\theta}P(\theta|X)\)替代的贝叶斯估计
估计模型 目标值 关心对象 求值方式
MLE $$\theta^{\star}=\arg\max_{\theta}(P(X\mid \theta)$$ \(P(X\mid \theta)\) 最大化似然函数\(P(X\mid \theta)\)
MAP $$\theta^{\star}=\arg\max_{\theta}(P(\theta\mid X)$$ \(P(X\mid \theta)P(\theta)\) 最大化后验概率\(P(\theta\mid X)=\frac{P(X\mid \theta)P(\theta)}{P(X)}\)
只需最大化分子\(P(X,\theta)=P(X\mid \theta)P(\theta)\)
BPE \(P(\theta\mid X)\)
(\(\theta\)的后验概率分布)
\(\frac{P(X\mid \theta)P(\theta)}{P(X)}\) 求参数\(\theta\)的后验概率分布\(P(\theta\mid X)\)
\(P(\theta\mid X)=\frac{P(X\mid \theta)P(\theta)}{\int_{\theta}P(X\mid\theta)P(\theta)d_{\theta}}\)

一个容易理解的角度

  • 参考博客: https://blog.csdn.net/liu1194397014/article/details/52766760

问题描述

  • 已知数据集为\(X=(x_{1}, x_{2},,,x_{n})\)

  • 极大似然估计

    • 已知数据集\(X\)的情况下,求参数最优值\(\theta^{\star}\),使得似然函数\(P(X|\theta)\)最大
  • 最大后验概率估计

    • 已知数据集\(X\)的情况下,求参数最优值\(\theta^{\star}\),使得后验概率\(P(\theta|X)\)最大,实际只需使得\(P(X,\theta)=P(X|\theta)P(\theta)\)最大
  • 贝叶斯估计

    • 已知数据集\(X\)的情况下,求参数\(\theta\)的后验分布\(P(\theta|X)\)

极大似然估计(MLE)

  • 推导
    $$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{P(X)}$$
    • \(P(\theta)\)为的取值与参数\(\theta\)无关
      • \(P(\theta)\)与参数\(\theta\)无关可以理解为参数\(\theta\)服从均匀分布: 假设参数\(\theta\)有k个离散取值\(\theta_{1}, \theta_{2},,,\theta_{k}\),那么\(P(\theta_{1})=P(\theta_{2})=…=P(\theta_{k})=\frac{1}{k}\)
    • \(P(X)\)的取值与\(\theta\)无关,设置为\(P(X)=1\)即可
    • 所以得到下面的表达式
      $$\arg\max_{\theta}P(\theta|X)=\arg\max_{\theta}P(X|\theta)$$
      • 式子中\(P(X|\theta)\)被称为似然函数
  • 结论
    • 极大似然估计: \(\theta^{\star}=\arg\max_{\theta}P(X|\theta)\)
    • 文字解释: 极大似然估计的目标是找一个参数\(\theta\),使得在参数\(\theta\)对应的概率分布模型下,数据集\(X\)出现的概率最大(似然函数最大)

最大后验概率估计(MAP)

  • 推导
    $$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{P(X)}$$
    • \(P(\theta)\)为的取值与参数\(\theta\)相关,是关于\(\theta\)的一个先验概率
      • \(P(\theta)\)与参数\(\theta\)相关可以理解为: 假设参数\(\theta\)有k个取值\(\theta_{1}, \theta_{2},,,\theta_{k}\),那么\(P(\theta_{1}),P(\theta_{2}),,,P(\theta_{k})\)的取值不确定,除了\(\sum_{i=1}^{k}P(\theta_{i})=1\)
    • \(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)积分结果与\(\theta\)不相关,分母的值不影响后验概率最大值的参数值,直接忽略(设置为\(P(X)=1\))即可
    • 所以得到
      $$\arg\max_{\theta}P(\theta|X)=\arg\max_{\theta}P(X|\theta)P(\theta)=\arg\max_{\theta}P(X,\theta)$$
  • 结论
    • 最大后验概率估计: \(\theta^{\star}=\arg\max_{\theta}P(X|\theta)P(\theta)\)
    • 文字解释: 最大后验概率估计的目标是找一个参数\(\theta\),使得在参数\(\theta\)在已知先验分布\(P(\theta)\)和数据集\(X\)的情况下,对应的后验概率\(P(\theta|X)\)最大(等价于\(P(X,\theta)=P(X|\theta)P(\theta)\)最大)

贝叶斯估计(BPE)

  • 推导
    $$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{P(X)}$$
    • \(P(\theta)\)为的取值与参数\(\theta\)相关,是关于\(\theta\)的一个先验概率
      • \(P(\theta)\)与参数\(\theta\)相关可以理解为: 假设参数\(\theta\)有k个取值\(\theta_{1}, \theta_{2},,,\theta_{k}\),那么\(P(\theta_{1}),P(\theta_{2}),,,P(\theta_{k})\)的取值不确定,除了\(\sum_{i=1}^{k}P(\theta_{i})=1\)
    • \(P(X)\)的取值与\(\theta\)本身不相关,但是为了求出后验分布\(P(\theta|X)\),\(P(X)\)作为归一化因子需要计算
      • \(P(X)\)的值与参数的先验分布,模型的定义(高斯分布还是贝塔分布等)和数据集\(X\)有关系
      • 没有分母作为归一化因子的话单独的分子是联合分布\(P(X,\theta)\),这个分布对\(\theta\)积分结果不为1(而是\(P(X)\)),联合分布不能确定\(\theta\)的后验分布
      • \(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)
    • 所以得到
      $$P(\theta|X)=\frac{P(X|\theta)P(\theta)}{\int_{\theta}P(X|\theta)P(\theta)d_{\theta}}$$
  • 结论
    • 贝叶斯估计: \(P(\theta|X)=\frac{P(X|\theta)P(\theta)}{\int_{\theta}P(X|\theta)P(\theta)d_{\theta}}\)
    • 文字解释: 贝叶斯估计的目标是求参数的后验分布\(P(\theta|X)\),参数\(\theta\)服从先验分布\(P(\theta)\),在已知数据集\(X\)修正后,参数\(\theta\)的后验概率分布为\(P(\theta|X)\)
  • 缺点
    • 计算\(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)比较耗时

一个更深入的理解

问题描述

  • 已知数据集为\(X=(x_{1}, x_{2},,,x_{n})\),新数据集为\(D=(d_{1}, d_{2},,,d_{m})\)
  • 求已知数据集\(X\)的情况下,假设数据集\(X\)由某个模型M(参数为\(\theta\))生成,那么数据集\(D\)也由模型M生成的概率\(P(D|X)\)
    • 模型M的确定因素:
      • 由三个因素唯一确定
        • 参数\(\theta\)的先验分布\(P(\theta)\)
        • 模型的类型定义\(f(\theta)\)(高斯分布,贝塔分布,二项分布还是其他什么分布)
        • 模型的已知观察数据集\(X\)
      • 由两个因素唯一确定
        • 模型的类型定义\(f(\theta)\)(高斯分布,贝塔分布,二项分布还是其他什么分布)
        • 参数\(\theta\)的后验分布\(P(\theta|X)\)
  • 另一种表述: 用模型M(参数为\(\theta\))生成数据,在已观察到模型M生成了数据集\(X\)后,预测模型M接下来生成数据集\(D\)的概率

极大似然估计(MLE)

  • 特点:假设模型M(参数\(\theta\))没有先验分布

  • 模型参数估计

    • 模型参数为一个确定的最优值
    • \(\theta^{\star}=\arg\max_{\theta}P(X|\theta)\)
  • 概率计算

    • \(P(D|X)=P(D|\theta^{\star})\)
  • 优点

    • 计算速度快
  • 缺点

    • 不够精确,特别是当观察到的数据集\(X\)太小时,这种情况不考虑参数的先验分布可能会造成过拟合
      • 举例: 判断一个学校男女比例,在观察到两个男生,一个女生走出校门后就判断男女比例为2:1显然不合适
        • 注意:单个同学是男生或者女生的概率服从伯努利分布,多个同学中男生的数量服从二项分布,整个学校的某个学生是男生的概率服从贝塔分布

贝叶斯估计(BPE)

  • 特点:假设模型M(参数\(\theta\))有先验分布\(P(\theta)\),计算观察到数据集\(X\)后\(\theta\)的后验分布\(P(\theta|X)\),然后求\(P(D|\theta)\)关于后验分布\(P(\theta|X)\)的期望(这个期望也就是模型M生成数据集\(D\)的概率)
    • 这里可以理解为观察到的数据集是对先验分布的修正,修正后的后验分布会更符合模型实际情况(因为先验分布很可能是瞎猜的)
  • 模型参数估计
    • 模型参数为一个分布
    • \(P(\theta|X)=\frac{P(X|\theta)P(\theta)}{\int_{\theta}P(X|\theta)P(\theta)d_{\theta}}\)
    • 分子为归一化因子\(P(X)\)
      • 必须计算,该值与参数的先验分布\(P(\theta)\),模型的类型定义(\(f(\theta)\))以及数据集\(X\)有关系,不计算\(P(X)\)的话后面计算得到的\(P(D|X)\)也将是一个不确定的值(不是概率值,是\(P(X)\)的函数)
  • 概率计算
    • \(P(D|X)=\int_{\theta}P(D,\theta|X)d_{\theta}=\int_{\theta}P(D|\theta,X)P(\theta|X)d_{\theta}=\int_{\theta}P(D|\theta)P(\theta|X)d_{\theta}\)
      • 式子中\(P(D|\theta,X)=P(D|\theta)\),在通过\(X\)确定\(\theta\)后模型也就确定了,\(X\)不会继续影响\(D\)的生成
    • 这里\(P(D|X)\)相当于\(P(D|\theta)\)关于后验分布\(P(\theta|X)\)的期望
  • 优点
    • 计算结果最精确,能根据参数的先验分布和数据集\(X\)的知识,准确计算模型生成数据集\(D\)的概率
  • 缺点
    • 计算\(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)比较耗时,不常用
关于\(P(X)\)是否需要计算?
  • 无需计算的情况
    • 判断两个数据集\(D_{1},D_{2}\)由同一个模型M生成的概率谁大,可以不用计算\(P(X)\)
      • 因为对于同一模型M,\(P(X)\)相同大小,此时只需要比较\(P(D_{1},X)\)和\(P(D_{2},X)\)谁大即可知道\(P(D_{1}|X)\)和\(P(D_{2}|X)\)谁大
  • 必须计算的情况
    • 判断数据集\(D\)由两个模型\(M_{1},M_{2}\)生成的概率谁大,必须计算\(P(X)\)
      • 因为对于不同模型\(M_{1},M_{2}\),\(P(X)\)相同不同,此时仅仅比较\(P(D_{1},X)\)和\(P(D_{2},X)\)谁大不能确定\(P(D_{1}|X)\)和\(P(D_{2}|X)\)谁大
    • 利用模型M采样生成新数据(预测问题),必须计算\(P(X)\)
      • 这时候每次采样时需要根据参数\(\theta\)的后验分布采样生成\(\theta_{i}\),然后再根据\(\theta_{i}\)确定的模型\(M_{i}\)采样生成观测数据,两次采样的过程都必须知道准确的分布(积分为1,也就是归一化后的),所以此时必须计算\(P(X)\)

最大后验概率估计(MAP)

  • 特点:假设模型M(参数\(\theta\))有先验分布\(P(\theta)\),但不计算模型的后验分布\(P(\theta|X)\),只用最可能的\(\theta\)代替后验分布来确定模型M

  • 模型参数估计

    • 模型参数为一个确定的最优值
    • \(\theta^{\star}=\arg\max_{\theta}P(\theta|X)=\arg\max_{\theta}P(X|\theta)P(\theta)\)
      • 这里与贝叶斯估计作对比可以发现,MAP相当于把参数后验分布简化为最可能的那个参数值,用最可能的参数值代替参数后验分布,这样做对最终预测结果\(P(D|X)\)可能有点误差,但是不用计算复杂的积分\(P(X)=\int_{\theta}P(X|\theta)P(\theta)d_{\theta}\)
      • 这里能够用最优值替代分布的前提是分布是很集中的(也就是要\(P(\theta|X)\)方差小,比如贝塔分布,狄利克雷分布和高斯分布等钟型分布的塔尖要尖),不然误差可能会比较大
      • 注意后验分布\(P(\theta|X)\)最可能值的参数值是概率最大的地方 \(\theta^{\star}=\arg\max_{\theta}P(\theta|X)\),而不是参数\(\theta\)关于后验分布的期望\(E_{P(\theta|X)}[\theta]=\int_{\theta}\theta P(\theta|X)d_{\theta}\) (期望对应平均值,而不是最可能的值,特例:对称钟型分布的期望同时也是它最可能的值)
  • 概率计算

    • \(P(D|X)=P(D|\theta^{\star})\)
  • 计算速度和精确度都介于MLE和BPE之间


总结

  • 贝叶斯估计可以退化成最大后验概率估计
    • 最大后验概率估计相当于是参数后验分布\(P(\theta|X)\)被最可能的参数值\(\theta^{\star}=\arg\max_{\theta}P(\theta|X)\)替代的贝叶斯估计
  • 最大后验概率估计可以退化成极大似然估计
    • 极大似然估计相当于是参数\(\theta\)的先验分布\(P(\theta)\)为均为分布的最大后验概率估计

Python——环境之版本和库以及搜索路径管理总结

Posted on 2017-10-17

关于Python版本与pip的关系


pip相关命令

查看pip版本和安装位置

pip --version

列出pip安装库

pip list

查看安装库详细信息(安装目录和版本等)

pip show <lib name>

pip安装库

pip install <lib name>

pip安装(指定版本version)的库(libname)(到指定路径dir)

pip install libname==version -t dir

Mac自带的python:

python: /usr/bin/python
pip:     /usr/local/bin/pip
libs:    /Library/Python/2.7/site-packages(可通过pip --verison查看到)

anaconda

  • Python2为主安装Python3版本
    1
    2
    3
    4
    5
    6
    python2
    python: /anaconda2/bin/python
    pip: /anaconda2/bin/pip
    python3
    python: /anaconda2/envs/python3/bin/python
    pip /anaconda2/envs/python3/bin/pip

anaconda版本切换命令

默认在python2环境下(对于安装时选择以python2.7版本为基础的anaconda而言)

source activate python3
source deactivate python3

Python 搜索路径与包(package)

不同Python版本的搜索路径不一样

查看搜索路径

查看该Python版本的搜索路径

1
2
3
python 		#在终端打开对应版本python(如果是在程序中则不需要这个命令)
import sys #导入sys包
sys.path #输出该版本Python对应的path

运行时追加路径

运行时我们可以通过向sys.path追加路径来添加自己的库

  • 通过sys模块来添加
    1
    sys.path.append('./python')

如果项目需要添加自定义的库,比如z3py这样的库,我们可以通过在项目中包含该库的源码,然后获取当前程序文件的绝对地址,然后计算出z3py库的绝对地址,并在程序中添加z3py库的绝对路径到sys.path

(为什么是绝对地址而不是相对地址:因为我们的代码(比如z3schedule.py)可能在不同的工作目录下被执行,不同的工作目录自然得到的相对路径也就不同,所以如果我们在其他目录下运行当前python文件,那么我们在这个文件下添加到sys.path的z3py对应的库就访问不到了,所以要读取当前文件的绝对路径而不是使用当前路径)

  • 通过__buildin__来添加环境变量
    1
    2
    import __builtin__
    __builtin__.Z3_LIB_DIRS = /z3py/bin

注意:PYTHONPATH环境变量指定的目录会自动被添加到搜索路径,这个环境变量与sys.path没关系!!!

Ubuntu——添加自定义的软件到启动器

Posted on 2017-09-22

日常使用Ubuntu时,某些自己编写的脚本(程序)或者下载的程序不能从启动器搜索到


问题描述

  • 自己编写的脚本
  • 自己编写的程序
  • 网上自己下载的程序(不是通过apt-get或者APPStore安装)

解决问题

编写程序启动脚本

如果需要运行的就是脚本这一步可以不用

  • 编写shell脚本,脚本内容为启动运行程序
    • 涉及到程序的名称这里应该用绝对路径
  • 脚本可以放到任意地方,一般和当前程序在一个文件夹下即可

添加脚本执行权限

1
chmod +x exmaple.sh

新建启动

  • 新建文件到指定文件夹

    1
    2
    cd /usr/share/applications
    sudo gedit example.desktop
  • 编辑文件如下格式

    • Name是程序搜索时会出现的名字
    • Exec是执行脚本路径,必须有执行权限,否则在启动器中仍然搜索不到该程序
    • Icon是软件的图标,这里可以任意自定义图标,从网上下载或者自己生成均可
      1
      2
      3
      4
      5
      6
      7
      8
      [Desktop Entry]
      Version=1.0
      Name=Example
      Exec=/home/username/example.sh
      Terminal=false
      Icon=/home/username/example.png
      Type=Application
      Categories=Development

测试

  • 按键: Win键
  • 输入Example
  • 如果出现图标和名字对应的程序,说明成功
  • 如果不成功,复查以下问题
    • 启动脚本路径是否正确且为绝对路径
    • 执行权限是否已经成功设置
    • Name是否设置正确

Markdown——基本语法

Posted on 2017-09-21

Markdown基本语法


上下标

<sup>上标</sup>

文字上标

<sub>下标</sub>

文字下标


删除线

~~删除线~~

删除线


引用

> 一级引用
>> 二级引用
>>> 三级引用

一级引用

二级引用

三级引用


列表

* 一级列表
    * 二级列表
    - 二级列表
    + 二级列表
* 一级列表
- 一级列表
+ 一级列表
  • 一级列表
    • 二级列表
    • 二级列表
    • 二级列表
  • 一级列表
  • 一级列表
  • 一级列表

    1. 有序列表
      • 无序列表
      • 无序列表
    2. 有序列表
  1. 有序列表
    • 无序列表
    • 无序列表
  2. 有序列表

分割线

分割线
***
---

分割线




链接

[链接](https://joezjh.github.io/ "鼠标放到链接上显示此提示")

链接


图片

![图片标题](图片链接 "鼠标放到图片上显示此提示")

图片标题


表格

| 左对齐标题 | 右对齐标题 | 居中对齐标题 |
| :------| ------: | :------: |
| 短文本 | 中等文本 | 稍微长一点的文本 |
| 稍微长一点的文本 | 短文本 | 中等文本 |
左对齐标题 右对齐标题 居中对齐标题
短文本 中等文本 稍微长一点的文本
稍微长一点的文本 短文本 中等文本

Sklearn——LogisticRegression

Posted on 2017-09-18

Sklearn解析之LogisticRegression


parameter

  • penalty: str, ‘l1’ or ‘l2’, default: ‘l2’

Ubuntu-Jupyter——Python2与Python3共存

Posted on 2017-09-10

在Jupyter中同时配置Python 2和Python 3环境


准备工作

  • 检查对应的虚拟环境(Python2和Python3)是否都已经安装成功,如没有的话请安装相应版本号,下面是管理包时常用的一些命令

    • 检查版本号

      1
      conda env list # check all python versions
    • 创建虚拟环境

      1
      conda create -n Python3 Python=3.6 # Python3可以是自己自定义的名字
    • 激活虚拟环境

      1
      source activate Python3 # Windows中不需要`source`
    • 停止虚拟环境

      1
      deactivate Python3
    • 从硬盘删除虚拟环境

      1
      conda remove -n Python3 --all

Jupyter on Python 3

还需要配置Python2

  • 检查Python2对应的pip版本大于等于9.0

    1
    python2 -m pip --version
    • 注意,如果python2指的是我们想设置的版本,如果电脑上对应多个版本的Python2,请选择对应的那个,后面的pip会根据Python2版本自动被确定下来,比如可使用/home/jiahong/anaconda2/envs/Python3.6/python绝对路径来指定确定的Python版本
    • 这里的python2 -m是用于指定pip版本的修饰,用于指明pip的版本,所以上一步中的路径指定也可以直接直接pip的绝对路径
  • 安装方法1

    1
    2
    python2 -m pip install ipykernel
    python2 -m ipykernel install --user
    • 这种安装方法是可以随意重复的,不会造成重复安装,所以可以直接将Python 2和Python 3两个版本都安装一遍
  • 安装方法2

    1
    2
    3
    conda create -n ipykernel_py2 python=2 ipykernel
    source activate ipykernel_py2 # On Windows, remove the word 'source'
    python -m ipykernel install --user

Jupyter on Python 2

  • 将上面的Python2全都指定为Python3即可
    • 比如
      1
      2
      python3 -m pip install ipykernel
      python3 -m ipykernel install --user
1…17181920
Joe Zhou

Joe Zhou

世界上只有一种真正的英雄主义,那就是在认清生活真相之后依然热爱生活。 ——罗曼·罗兰

195 posts
38 tags
GitHub E-Mail
© 2024 Joe Zhou
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4