Jasoncoding13's Page

丁13的主页

Jasoncoding13's Page

  • 首页

  • 标签19

  • 分类7

  • 归档9

  • 搜索

signed_number_representation.md

发表于 2020-11-22 | 更新于 2020-11-30 | 评论数:

有符号数的表示

有符号数的表示,是指将负数编码表示为二进制形式。目前已知的常见的有符号数的表示有四种:原码、反码、补码、移码。

原码 Signed magnitude representation

原码是通过分配一个符号位表示数的符号,通常是最高位,0代表正数,1代表负数。一个字节8位,使用最高位表示符号位,则数的表示范围是十进制的-127到127。十进制数-43=-(32+8+2+1)使用原码表示1010 1011。

反码 One's complement

反码也是通过一个符号位表示数的符号,通常也是最高位,0代表正数,1代表负数。一个正数的反码与其原码相同,例如十进制数13=8+4+1的1字节原码和反码都是00001101。一个负数的符号位为1,数值位是该负数的相反数的原码数值位互换0和1。因为负数反码的符号位也可以理解成该负数的相反数的原码符号位互换0和1(0>1)。所以,负数的反码即其相反数的原码互换0和1。例如十进制数-13=-(8+4+1)的绝对值为13,13的原码是0000 1101,原码互换0和1就是1111 0010。1字节反码的表示范围仍然是十进制的-127到127。

补码 Two's complement

0与正数的补码与其原码相同,负数的补码等于其反码+1。例如,十进制数-27=-(16+8+2+1),27的原码为0001 1011,则-27反码为1110 0100,-27补码为1110 0101。1字节补码的表示范围是十进制的-128到127。

例子

计算43-13, 43的补码等于原码0010 1011,-13的补码等于反码1111 0010加0000 0001即1111 0011。0010 1011 + 1111 0011 = 0001 1110。若某数补码为0001 1110,其原码等于补码,该数为十进制16+8+4+2=30。

计算-13-27,-13的补码即1111 0011,-27的补码即1110 0101。 1111 0011 + 1110 0101 = 1101 1000。若某数补码为1101 1000,其反码为1101 0111,其原码为0010 1000,该数为十进制-(32+8)=-40。

补码原理

这个补码的原理真的搞死我了。

模算数

模算数就是一种整数算术系统,时钟就是一个典型例子。十二小时制的时钟,不能表示大于12或小于1的钟点(整数)。例如,7点再过8小时,时钟指向3点而不是15点。这就是模12的模算术系统。它有什么好处呢?那就是可以利用同余关系简化运算。在模算术系统中,a与b的加减乘法运算,其结果与对应a的同余a’与b的同余b‘的相等。例如,7+8=-5+8=3,其中7与-5关于12同余。

补码回顾

回顾下1000 0000在二进制编码表示128,在补码表示-128,128与-128关于模256同余。补码本质就是把128255的编码映射到其在-128-1的对应同余上。计算法则沿用的是非负范围的二进制编码运算,但是整个编码的值域移动了。举个例子加深印象,假设补码使用1000 0000表示128,而不是-128。计算128-127=1000 0000+1000 0001 =0000 0001(最高位溢出)。有没有感觉?所以改变的只是我们约定的编码的值域。对负数求补码的过程,求反码再加1。例如-127,其相反数127的原码0111 1111,-127的反码1000 0000。注意0111 1111+1000 0000=1111 1111即255,可得-127=255-127+1=129。所以负数的补码,就是求其对应的正同余的原码。

Fluent Python Charpter 1.2

发表于 2020-03-12 | 评论数:

Fluent Python Charpter 1.2

How Special Methods Are Used

  1. 对于我们自定义的类,我们已经知道built-in functions是如何使用自定义的special methods。那么对于已经定义好的built-in types呢?这就跟解释器有关了。但是可以确定的是对内建类型使用内建函数一定是比我们显式定义的special methods快很多。例如Cpython中的built-in types都已经编译了。

  2. 通常情况下,不需要自定义special methods,除非是自研library需要我们自定义数据类型或者使用library需要我们重写special method的。

Emulating Numeric Types

再来个vector的例子来体现更多的快乐。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> class Vector:
>>> def __init__(self, x, y):
>>> self.x = x
>>> self.y = y
>>> def __repr__(self):
>>> return 'Vecotr({}, {})'.format(self.x, self.y)
>>> def __str__(self):
>>> return self.__repr__()
>>> def __add__(self, v):
>>> x = self.x + v.x
>>> y = self.y + v.y
>>> return Vector(x, y)
>>> v = Vector(0, 1)
>>> v += Vector(-1, 2)
>>> v
  1. ___repr__定义了

Fluent Python Charpter 1.1

发表于 2020-03-12 | 分类于 Note, Fluent Python | 评论数:

Fluent Python Charpter 1.1

A Pythonic Card Deck

这个post在于介绍Python的Data Model。

书中的说法是,Data Model是framework。某些syntax或者built-in functions会触发解释器调用Python已经定义好的special methods。最直接的2个例子:

1
2
3
4
>>> len([0, 1]), [0, 1].__len__()
(2, 2)
>>> {'a': 0}['a'], {'a': 0}.__getitem__('a')
(0, 0)

len()触发的是list.__len__(),dict[key]语法触发的就是dict.__getitem__(key)。

这里再引用一个游戏王卡组的例子。

先用namedtuple定义卡牌,再实例化一张青眼白龙,typename是这类tuple的意义, field_names就是tuple中对应顺序元素的意义。

1
2
3
4
>>> import collections
>>> Card = collections.namedtuple(typename='Card', field_names=['Star', 'ATK'])
>>> Card(8, 3000)
Card(Star=8, ATK=3000)

然后定义有青眼白龙,黑暗魔术师和真红眼黑龙的卡组。我们还用切片的方式抽出卡组的第一张牌。

1
2
3
4
5
6
7
8
9
10
>>> class YuGiOhDeck:
>>> def __init__(self):
>>> self._cards = [Card(8, 3000), Card(7, 2500), Card(7, 2400)]
>>> def __len__(self):
>>> return len(self._cards)
>>> def __getitem__(self, position):
>>> return self._cards[position]
>>> deck = YuGiOhDeck()
>>> len(deck), deck[0]
(3, Card(Star=8, ATK=3000))

问题来了,我们抽牌不是神抽,那怎么抽卡组?所以需要写一个抽牌的method?

这个时候就体现出Data Model的好处。

1
2
3
>>> from random import choice
>>> choice(deck)
Card(Star=7, ATK=2500)

通过查看random.choice的源码,其实包含了三个步骤,

  1. 调用len(seq)获得序列的长度
  2. 产生一个[0, length-1]的随机整数i
  3. seq[i]切片

所以Data Model的好处就在于,提前定义了很多神奇的operations,我们只需要定义好它们所需要的special methods,就可以套用那些opeartions。

此外,因为我们已经定义好了__getitem__,所以我们还能通过切片神抽。

1
2
>>> deck[1]
Card(Star=7, ATK=2500)

定义好__getitem__,意味着YuGiOhDeck是iterable,于是reversed(),sorted(),in都支持了。

1
2
3
4
5
6
>>> list(reversed(deck))
[Card(Star=7, ATK=2400), Card(Star=7, ATK=2500), Card(Star=8, ATK=3000)]
>>> list(sorted(deck, key=lambda card: card[1]))
[Card(Star=7, ATK=2400), Card(Star=7, ATK=2500), Card(Star=8, ATK=3000)]
>>> Card(1, 1300) in deck
False

总结一下,我们不需要显式地定义一个新的类继承于某些已经基本的类,只需要通过定义special methods就能让我们定义的类可以使用到python的很多语言特性。

lists-copies

发表于 2020-03-12 | 更新于 2020-11-30 | 分类于 Python | 评论数:

列表复制

如下分别是三种复制, =,切片(Shallow Copy)和deepcopy。

1
2
3
4
5
>>> from copy import deepcopy
>>> x = [[0, 1], [2, 3]]
>>> y = x
>>> z = x[:]
>>> u = deepcopy(x)

首先,这三种复制有共同点:

x==y==z==u返回True,它们的值都是一样的。

对于第一种=,

因为列表是mutable对象,这里的y和x将指向同一个地址。

x is y返回True,表明它们是同一个object,只是两个names。

对于第二种和第三种,`z is x or u is x返回False。

它们已经和原来的x不是同一个对象了,只是它们的values是相等的。

重点来了,

1
2
3
4
>>> x[0] = 4
>>> x[1][0] = 5
>>> x, y, z, u
([4, [5, 3]], [4, [5, 3]], [[0, 1], [5, 3]], [[0, 1], [2, 3]])

可以看见,当我们改变了x的第一个列表元素为整数4,第二个列表元素的第一个元素为5。

y和x保持一致,因为它们本身就是同一个object。

z是切片复制,浅复制。这个深浅是什么意思呢?x本身是个两层嵌套的列表。而浅复制z = x[:]就是指,建立一个和x等长的列表z,z中每个元素按照顺序指向x中元素对应的地址。此时,x的第一个元素从指向一个列表为[0, 1]的地址变成指向整数4的地址。而x第二个元素的地址没有改变,改变的是x第二个元素中第一个元素的指向,从指向整数2变成指向整数5。我们可以使用验证它们第二个元素在内存中的地址是不是一样的。

1
2
>>> id(x[1]) == id(z[1])
True

而深复制u = deepcopy(x)就好理解了,创建一个新的对象,递归地对x中元素进行复制,并重新分配内存地址。所以u和x已经是完全没有关联的对象。

待验证的个人说法,

y = x是把建立变量名称y到x内存地址的映射。

z = x[:]是建立变量名称z到某列表的映射,该列表元素的内存地址与x元素的相等。

u = deepcopy(x)是建立变量名称u到某列表的映射,该列表元素的内存地址与x元素的无关。

Python-Coding-Style

发表于 2020-03-12 | 分类于 Python | 评论数:

代码风格相关

源代码解释器和编码声明

Python Tutorial Source Code Encoding

常见的.py文件初始两行如下:

1
2
#!/urs/bin/env python3
# -*- coding: utf-8 -*-

第一行的作用是声明解释器,仅在UNIX系统有效。

通常情况下,我们使用python main.py执行main.py脚本。 这里可以理解为告诉系统使用环境变量中的python去解释main.py。

如果我们在脚本的第一行声明了解释器,并对该脚本赋予执行权限。

1
chmod +x main.py

这样情况下,我们可以像执行shell脚本的方式./main.py执行脚本。

第二行的作用是声明编码。

默认编码是utf-8。

声明的编码必须是codecs支持的编码,如cp1252。

Negative Log Likelihood 对数似然损失函数

发表于 2019-09-24 | 更新于 2019-10-02 | 分类于 Calculus , Linear Algebra | 评论数:

摘要

这篇文章的目标是使用矩阵形式表示二分类问题的对数似然损失函数和损失函数对参数的梯度。

0,1编码

假设我们使用\(0, 1\)分别对负类,正类进行编码,Negative Log Likelihood如下:

\[ \begin{align*} \text{NLL} &= - \Big(\sum_{i=1}^m y^{(i)}\log(\frac{1}{1+\exp(-{\bf w}^T{\bf x^{(i)}})})+(1-y^{(i)})\log(1-\frac{1}{1+\exp(-{\bf w}^T{\bf x^{(i)}})})\Big)\\ &= - \Big(\sum_{i=1}^m -y^{(i)}\log\big(1+\exp(-{\bf w}^T{\bf x^{(i)}})\big)+(1-y^{(i)})\log(\frac{\exp(-{\bf w}^T{\bf x^{(i)}})}{1+\exp(-{\bf w}^T{\bf x^{(i)}})})\Big)\\ &= - \Big(\sum_{i=1}^m -y^{(i)}\log\big(1+\exp(-{\bf w}^T{\bf x^{(i)}})\big)-y^{(i)}\log(\frac{\exp(-{\bf w}^T{\bf x^{(i)}})}{1+\exp(-{\bf w}^T{\bf x^{(i)}})})+\log(\frac{\exp(-{\bf w}^T{\bf x^{(i)}})}{1+\exp(-{\bf w}^T{\bf x^{(i)}})})\Big)\\ &= - \bigg(\sum_{i=1}^m -y^{(i)}\log\Big(\big(1+\exp(-{\bf w}^T{\bf x^{(i)}})\big)\times\frac{\exp(-{\bf w}^T{\bf x^{(i)}})}{1+\exp(-{\bf w}^T{\bf x^{(i)}})}\Big)+\log(\frac{1}{1+\exp({\bf w}^T{\bf x^{(i)}})})\bigg)\\ &=- \Big(\sum_{i=1}^m -y^{(i)}\log\big(\exp(-{\bf w}^T{\bf x^{(i)}})\big) + \log(\frac{1}{1+\exp({\bf w}^T{\bf x^{(i)}})})\Big)\\ &=- \big(\sum_{i=1}^m y^{(i)}{\bf w}^T{\bf x^{(i)}} + \log(\frac{1}{1+\exp({\bf w}^T{\bf x^{(i)}})})\big)\\ &= \sum_{i=1}^m \Big(-y^{(i)}{\bf w}^T{\bf x^{(i)}} + \log\big(1+\exp({\bf w}^T{\bf x^{(i)}})\big)\Big)\\ &=-{\bf y}^TX{\bf w} + {\bf 1}^T\log\big(1+\exp(X{\bf w})\big) \end{align*} \]

微分如下: \[ \begin{align*} \text{d}l &= \text d\Big(-{\bf y}^TX{\bf w} + {\bf 1}^T\log\big(1+\exp(X{\bf w})\big)\Big)\\ &=\text d(-{\bf y}^TX{\bf w}) + \text d\Big({\bf 1}^T\log\big(1+\exp(X{\bf w})\big)\Big)\\ &=-{\bf y}^TX\text d{\bf w} + {\bf 1}^T\Big(\frac{1}{1 + \exp(X{\bf w})} \odot \big(\exp(X{\bf w})\odot (X\text d{\bf w})\big)\Big)\\ &=-{\bf y}^TX\text d{\bf w} + {\bf 1}^T \big(\frac{\exp(X{\bf w})}{1 + \exp(X{\bf w})}\odot (X\text d{\bf w})\big)\\ &= -{\bf y}^TX\text d{\bf w} + {\bf 1}^T \big(\frac{1}{1 + \exp(-X{\bf w})}\odot (X\text d{\bf w})\big)\\ &= \text tr(-{\bf y}^TX\text d{\bf w}) + \text tr\big({\bf 1}^T \big(\frac{1}{1 + \exp(-X{\bf w})}\odot (X\text d{\bf w})\big)\\ &= \text tr(-{\bf y}^TX\text d{\bf w}) + \text tr\Big({\bf 1} \odot \frac{1}{1 + \exp(-X{\bf w})})^T (X\text d{\bf w})\big)\Big)\\ &= \text tr(-{\bf y}^TX\text d{\bf w}) + \text tr\big((\frac{1}{1 + \exp(-X{\bf w})})^T X\text d{\bf w}\big)\\ &= \text tr\big((\frac{1}{1 + \exp(-X{\bf w})}- {\bf y})^TX\text d{\bf w}\big)\\ &= \text tr\Big(\big(X^T(\frac{1}{1 + \exp(-X{\bf w})}- {\bf y})\big)^T\text d{\bf w}\Big) \end{align*} \] 注意此处我们认为\(\bf w\)为\(n \times 1\)的矩阵,其对应梯度也为\(n\times 1\)的矩阵,即使用Denominator Layout表示。

所以,

梯度如下: \[ \begin{align*} \nabla_{\bf w} \text{NLL} = X^T(\frac{1}{1 + \exp(-X{\bf w})}- {\bf y}) \end{align*} \]

-1,1编码

假设我们使用\(-1, 1\)分别对负类,正类进行编码,loss function 如下: \[ \begin{align*} \text{NLL} &= - \sum_{i=1}^m \log(\frac{1}{1+\exp(-y^{(i)}{\bf w}^T{\bf x^{(i)}})})\\ &= \sum_{i=1}^m \log\big(1+\exp(-y^{(i)}{\bf w}^T{\bf x^{(i)}})\big)\\ &= {\bf 1}^T\log\Big(1+ \exp\big(-{\bf y} \odot (X{\bf w})\big)\Big) \end{align*} \]

微分如下: \[ \begin{align*} {\text d}(NLL) &= d\bigg({\bf 1}^T\log\Big(1+ \exp\big(-{\bf y} \odot (X{\bf w})\big)\Big)\bigg)\\ &= {\bf 1}^T\bigg(\frac{1}{1+ \exp\big(-{\bf y} \odot (X{\bf w})\big)} \odot\Big(\exp\big(-{\bf y} \odot (X{\bf w})\big) \odot \big(-{\bf y} \odot (X\text d{\bf w})\big)\Big)\bigg)\\ &= {\bf 1}^T(-{\bf y} \odot\frac{1}{1+\exp\big({\bf y} \odot (X\text d{\bf w})\big)}\odot X\text d{\bf w})\\ &= \text tr\big({\bf 1}^T(-{\bf y} \odot\frac{1}{1+\exp\big({\bf y} \odot (X\text d{\bf w})\big)}\odot X\text d{\bf w})\big)\\ &= \text tr \big((-{\bf 1} \odot {\bf y} \odot \frac{1}{1+\exp\big({\bf y} \odot (X\text d{\bf w})\big)})^TX\text d{\bf w}\big)\\ &= \text tr \Big(\big(X^T(-{\bf y} \odot \frac{1}{1+\exp\big({\bf y} \odot (X\text d{\bf w})\big)})\big)^T\text d{\bf w}\Big) \end{align*} \]

所以,

梯度如下: \[ \begin{align*} \nabla_{\bf w} \text{NLL} = X^T(-{\bf y} \odot \frac{1}{1+\exp\big({\bf y} \odot (X\text d{\bf w})\big)}) \end{align*} \]

多元正态分布 Multivariate Normal Distribution

发表于 2019-09-13 | 更新于 2019-09-24 | 分类于 Statistics | 评论数:

摘要

这篇文章的目标是多元正态分布的概率密度函数。

独立多元正态分布

为了推导多元分布的一般形式,我们先从基本形式开始。假设一组互相独立的变量, \[ \bf{X_i} \sim \mathcal{N}(0, \sigma_i^2) \quad \forall i = 1, 2, \dots, n \] 我们记它们的密度函数: \[ f_{X_i}(x) = \frac{1}{\sqrt{2\pi}\sigma_i}\exp({-\frac{x^2}{2\sigma_i^2}}) \] 因为变量的独立性, 联合概率密度函数为各变量密度函数的乘积: \[ \begin{align*} f_X({\bf x}) &= \prod_{i=1}^nf_{X_i}(x_i)\\ &=\prod_{i=1}^n\frac{1}{\sqrt{2\pi}\sigma_i}\exp({-\frac{x_i^2}{2\sigma_i^2}})\\ &=\frac{1}{(\sqrt{2\pi})^n} \times \frac{1}{\prod_{i=1}^n\sqrt{\sigma_i^2}}\times \exp(\sum_{i=1}^n-\frac{x_i^2}{2\sigma_i^2})\\ &=(2\pi)^{-\frac{n}{2}}\times\frac{1}{\sqrt{\det(\Sigma)}}\times \exp(-\frac{1}{2}{\bf x}^T \text{diag}(\frac{1}{\sigma_1^2}, \frac{1}{\sigma_2^2}, \dots, \frac{1}{\sigma_n^2}){\bf x})\\ &=(2\pi)^{-\frac{n}{2}}\det(\Sigma)^{-\frac{1}{2}}\exp(-\frac{1}{2}{\bf x}^T\Sigma^{-1}{\bf x}) \end{align*} \] 注意此处: \[ \Sigma = \text{diag}(\sigma_1^2, \sigma_2^2, \dots, \sigma_n^2)\\ \det(\Sigma) = \sigma_i^2\sigma_2^2 \cdots \sigma_n^2\\ \Sigma^{-1} = \text{diag}(\frac{1}{\sigma_1^2}, \frac{1}{\sigma_2^2}, \dots, \frac{1}{\sigma_n^2}) \] 所以,我们得到了在各分量互相独立和均值为0条件下的多元正态分布: \[ {\bf X} \sim \mathcal{N}({\bf 0}, \Sigma) \]

随机变量的仿射变换

考察仿射变换: \[ L({\bf x}) =A{\bf x}+ \bf b \] 其中\(A\)是大小为n*n的可逆矩阵,\(\bf b\)是长度为n的常数向量。

我们记变换后随机变量组为\(\bf Y\)及其期望: \[ \begin{align*} {\bf Y}&=L({\bf X})\\ E{\bf Y}&=E(A{\bf X}+{\bf b})\\ &=A(E{\bf X})+{\bf b}\\ &=L(E{\bf X})\\ \end{align*} \] 协方差: \[ \begin{align*} \Sigma_{\bf Y}&=E[({\bf Y}-E{\bf Y})({\bf Y}-E{\bf Y})^T]\\ &= E[\big(A{\bf X}+{\bf b}-A(E{\bf X}+{\bf b})\big)\big(A{\bf X}+{\bf b}-A(E{\bf X}+{\bf b})\big)^T]\\ &= E[A({\bf X}-E{\bf X})\big(A({\bf X}-E{\bf X})\big)^T]\\ &= E[A({\bf X}-E{\bf X})({\bf X}-E{\bf X})^TA^T]\\ &=A\Sigma_XA^T \end{align*} \] 所以出发点是,假设我们有一组随机变量\(\bf Z\)符合多元正态分布且各分量互相独立,均值为\(0\),方差为\(1\): \[ {\bf Z} \sim \mathcal{N}({\bf 0}, I) \] 和一组随机变量\(\bf Y\)符合一般多元正态分布: \[ {\bf Y} \sim \mathcal{N}({\bf \mu_{\bf Y}}, \Sigma_{\bf Y}) \] 我们希望寻找一个仿射变换\(L({\bf x})=A{\bf x}+b\)使得: \[ \mu_{\bf Y} = {\bf b}\\ \Sigma_{\bf Y} = AIA^T \] 对\(\Sigma_{\bf Y}\)为实对称矩阵,使用特征分解: \[ \Sigma_{\bf Y} = Q \Lambda Q^{-1} = Q \Lambda Q^{T} \] 记\(n \times n\)矩阵\(U\): \[ U = Q\text{diag}(\sqrt \sigma_1, \sqrt \sigma_2, ..., \sqrt \sigma_n)\\ UU^T=Q\text{diag}(\sqrt \sigma_1, \sqrt \sigma_2, ..., \sqrt \sigma_n)\text{diag}(\sqrt \sigma_1, \sqrt \sigma_2, ..., \sqrt \sigma_n)^TQ^T\\ UU^T=Q\Lambda Q^T=\Sigma_{\bf Y} \] 得到所需仿射变换: \[ {\bf y} =U{\bf z} + \mu_{\bf Y} \]

仿射变换与概率密度函数

现在我们得到了有限制条件下的多元正态分布\({\bf Z} \sim \mathcal{N}({\bf 0}, I)\)和所需的仿射变换\({\bf Y} = L({\bf Z})\)。

所以出发点是,我们需要用仿射变换的概率密度函数把有限制条件情况的概率密度函数对一般情况进行推广: \[ \begin{align*} f_{\bf Y}({\bf y}) &= f_{\bf Z}({\bf Z})|\det(\frac{d{\bf z}}{d{\bf y}})|\\ &=f_{\bf Z}\big(L^{-1}({\bf y})\big)|\det(\frac{d{\bf z}}{d{\bf y}})| \end{align*} \] 其中\(L^{-1}(\bf y)\)是\(L(\bf x)\)的逆变换: \[ {\bf z} = U^{-1}({\bf y}-\mu_{\bf Y})\\ \frac{d{\bf z}}{d{\bf y}}=U^{-1}\\ \det(U^{-1})=\frac{1}{\det(U)}\\ \det(\Sigma_{\bf Y}) = \det(UU^T)=\det(U)\det(U^{T}) = \det(U)^2 \geq 0\\ |\det(U^{-1})|=\frac{1}{\sqrt{\det(\Sigma_{\bf Y})}} \]

多元正态分布的概率密度函数

我们有\({\bf Z} \sim \mathcal{N}({\bf 0}, I)\)的概率密度函数: \[ \begin{align*} f_{\bf Z}(z)&=(2\pi)^{-\frac{n}{2}}\det(\Sigma_{\bf Z})^{-\frac{1}{2}}\exp(-\frac{1}{2}{\bf x}^T\Sigma_{\bf Z}^{-1}{\bf x})\\ &=(2\pi)^{-\frac{n}{2}}\det(I)^{-\frac{1}{2}}\exp(-\frac{1}{2}{\bf x}^TI^{-1}{\bf x})\\ &=(2\pi)^{-\frac{n}{2}}\exp(-\frac{1}{2}{\bf x}^T{\bf x}) \end{align*} \] 所以,\(\bf Y\sim \mathcal N(\mu_{\bf Y}, \Sigma_{\bf Y})\)的概率密度函数: \[ \begin{align*} f_{\bf Y}({\bf y})&=f_{\bf X}\big(U^{-1}({\bf y}-\mu_{\bf Y})\big)|\det(U^{-1})|\\ &=(2\pi)^{-\frac{n}{2}}\exp\Big(-\frac{1}{2}\big(U^{-1}({\bf y}-\mu_{\bf Y})\big)^T\big(U^{-1}({\bf y}-\mu_{\bf Y})\big)\Big)\frac{1}{\sqrt{\det(\Sigma_{\bf Y})}}\\ &=(2\pi)^{-\frac{n}{2}}\det(\Sigma_{\bf Y})^{-\frac{1}{2}}\exp\big(-\frac{1}{2}({\bf y}-\mu_{\bf Y})^T(U^{-1})^TU^{-1}({\bf y}-\mu_{\bf Y})\big)\\ &=(2\pi)^{-\frac{n}{2}}\det(\Sigma_{\bf Y})^{-\frac{1}{2}}\exp\big(-\frac{1}{2}({\bf y}-\mu_{\bf Y})^T\Sigma_{\bf Y}^{-1}({\bf y}-\mu_{\bf Y})\big)\\ \end{align*} \]

Python String Formatting

发表于 2019-08-06 | 更新于 2019-09-10 | 分类于 Python | 评论数:

摘要

Python 3.0 之后,str的对象支持一个method,str.format()。它是针对原来str所支持的%operator一个优化。这里简单地记录一些用法和例子。

常见使用方法

  1. 使用{}作为输出内容的占位符。

    1
    2
    >>>'{} {}'.format('Hello','World')
    'Hello World'

  2. 添加key指定输出对应的参数。key为数字时是参数位置的索引,为字符串时是关键字的索引。

    1
    2
    >>>'{1} {0} {a}'.format('Hello','World', a='!')
    'World Hello !'

  3. 结合*operator解析list,dict。

    1
    2
    3
    4
    5
    6
    >>>lst = ['Hello', 'World']
    >>>'{} {}'.format(*lst)
    Hello World
    >>>dct = {'a':'Hello', 'b':'World'}
    >>>'{a} {b}'.format(**dct)
    Hello World

  4. Py3.6后还可以用f-string的方式直接制定输出变量。

    1
    2
    3
    >>>string = 'Hello World'
    >>>f'{string}'
    Hello World

输出格式

  1. 格式化输出的用法如下面例子。:前的部分是上文提及的key,指定输出的内容。:后的.1和.3分别指以小数点后保留1位和3位的格式输出。
1
2
3
4
5
>>>num = 0.1313
>>>'{:.1}'.format(num)
'0.1'
>>>f'{num:.3}'
'0.131'
  1. 格式的一般形式如下:

[[fill]align][sign][#][0][minimumwidth][.precision][type]

  1. 如上文提及[.precision]是指小数点后显示的位数。minimumwidth则是指输出的规定长度。
1
2
3
4
5
6
>>>f'{num:13}'
' 0.1313'
>>>f'{num:13.3}'
' 0.131'
>>>f'{string:13}'
'Hello World '
  1. [[fill]align]指定在内容长度小于规定长度时输出的位置和是否padding补全。 align为<,^,>分别指居左,居中,居右。输出内容是字符串,默认居左。输出内容是数字,默认居右。align还有一种选择是=,指padding补全在符号后数字前。 fill指定padding的字符,默认为空格。

    1
    2
    3
    4
    5
    6
    >>>f'{num:0<13}'
    '0.13130000000'
    >>>f'{string:-^13}'
    '-Hello World-'
    >>>'{:0=13}'.format(-1) # fill:0 align:= minimumwidth:13
    '-000000000001'

  2. [sign]指显示数字符号的格式。+表示正负数均带符号。-表示正数不带符号,负数带负号。空格表示正数保留一个空格,负数带负号。

1
2
3
4
5
6
>>>'{:+} {:+}'.format(1, -1)
'+1 -1'
>>>'{:- :-}'.format(1, -1)
'1 -1'
>>>'{: } {: }'.format(1, -1)
' 1 -1'
  1. 参照datetime模块可以实现日期按照指定格式输出。关于%a等指代意义可以参照datetime的官方文档。
1
2
3
>>>from datetime import datetime
>>>'{:%a %b %d %Y}'.format(datetime.now())
'Tue Aug 06 2019'

关于格式化其他参数的用法可以参照PEP 3101。

第一篇日志

发表于 2019-05-29 | 更新于 2019-09-10 | 分类于 个人日志 | 评论数:

很久很久没有写日志之类的东西了。

最近两天部署好了自己的主页,有一丁点的不一样的__感觉__。

时间不大够、以后慢慢补主页、

例如相册啊,可以秀恩爱,或者听歌,继续听我的红豆、

在部署过程中,发现自己的毛病又出来了。

本来npm的依赖其实可搞可不搞,我手痒搞了两天、

所以时间终究要挥霍一下才能显得珍贵吗?

我的园园猪猪最珍贵。

时间不大够、现在好好学习、

Jason Chan

Jason Chan

Math
9 日志
6 分类
16 标签
GitHub QQ Weibo FB Page
Creative Commons
Links
  • NetEaseBlog
  • Linear Algebra
© 2019 – 2020 Jason Chan
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Gemini v7.1.1