Jiahong的个人博客

凡事预则立不预则废


  • Home

  • Tags

  • Archives

  • Search

Ubuntu-Jupyter——修改默认路径

Posted on 2018-09-20

Ubuntu下修改Jupyter的默认路径


查看配置文件

  • 首先查看是已经生成Jupyter的配置文件,默认新装的Jupyter根目录为~/, 是没有配置文件的
    1
    2
    # 查看配置文件命令
    cat ~/.jupyter/jupyter_notebook_config.py

生成配置文件

  • 如果没有配置文件,则首先需要生成新的配置文件

    1
    2
    # 生成配置文件命令
    jupyter notebook --generate-config
    • root用户执行时可能需要按照要求加上参数

编辑配置文件有两种方式

相对路径方式

打开配置文件修改相对目录c.NotebookApp.default_url,这里默认为/tree, 修改成自己想要的地址即可

1
2
3
# /tree表示当前路径pwd, 如下则表示当前终端路径下的/Coding路径
c.NotebookApp.default_url = '/tree/Coding'
# 这种情况以后打开Jupyter时都需要到指定的文件目录下才行,适用于多个jupyter路径的情况

一般使用这种情况时建议直接保留相对目录/tree即可,这样可以在启动Jupyter时直接在那个文件目录下启动

绝对路径方式

打开配置文件配置绝对目录c.NotebookApp.notebook_dir

1
2
# 这种情况下无论在哪里打开都是绝对目录 	
c.NotebookApp.notebook_dir = u'/home/jiahong/JupyterWorkspace'

如果两种情况都配置了,默认以第一中情况为主,因为第一个是redirect的
如果两种情况都没配置,默认等价于配置了c.NotebookApp.default_url = '/tree'

Python——如何优雅的导入自定义的Python包

Posted on 2018-09-19

对于IDEA的管理

  • 在IDEA中运行文件时,当前项目根目录会默认被添加为Python的搜索路径
  • 根目录下的文件可以直接被访问
  • 根目录的子目录需要每一层都添加__init__.py文件,将其编译为包

IDEA项目用命令行运行

  • 在运行的第一个文件中添加IDEA项目的根目录作为搜索路径

    • 这里的根目录最好是绝对路径

      1
      2
      import sys
      sys.path.append("/home/xxx/xxx/xxx")
    • 如果是想使用相对路径,从而方便移植也行,但需要获取当前文件的文件路径,然后从当前文件与根目录的关系解析出根目录

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      import os
      thisFileDir = os.path.split(os.path.realpath(__file__))[0]
      # we have to modify the tail if we change the path of this python file
      tail = 6
      rootPath = thisFileDir[0:-tail]
      if rootPath[-1] != "/" and rootPath[-1] != "\\":
      message = "Error root path [%s]\n\tPlease check whether you changed the path of current file" % rootPath
      raise Exception(message)
      print "Current root path: %s" % rootPath

      import sys
      sys.path.append(rootPath)
  • 其他的和在IDEA中运行一样,需要添加的库加上__init__.py即可

Python——list返回最大的K个元素的索引

Posted on 2018-09-18

自定义的一个有用的Python方法


返回最大的K个值的索引

引用自Stack Overflow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def get_top_k_indexes_of_list(target_list, k, is_max=True, min_value=None):
"""
get the top k indexes of elements in list
Example:
Problem: I have a list say a = [5,3,1,4,10],
and I need to get a index of top two values of the list viz 5 and 10.
Is there a one-liner that python offers for such a case?
Usage: get_top_k_indexes_of_list(target_list=a, k=2, is_max=True)
link: https://stackoverflow.com/questions/13070461/get-index-of-the-top-n-values-of-a-list-in-python
:param target_list: target list
:param k: the number of indexes
:param is_max: True means max else False means min
:param min_value: if min_value is not None
filter the indexes whose value less than or equals to min_value
:return: a list of indexes
"""
indexes = sorted(range(len(target_list)), key=lambda i: target_list[i], reverse=is_max)[:k]
result = list()
if min_value is not None:
for index in indexes:
if target_list[index] <= min_value:
break
result.append(index)
else:
result = indexes
return result

一次性索引出多个元素

1
2
3
4
5
6
7
8
9
def get_elements_from_list(target_list, indexes):
"""
get elements from target_list by indexes
:param target_list: target list
:param indexes: a list of indexes
:return: a list of elements
"""
elements = [target_list[i] for i in indexes]
return elements

Python-Jupyter——配置跨机器使用

Posted on 2018-09-18

Jupyter notebook默认是不能跨机器使用的,只能使用localhost访问,本文讲述了让其能跨机器访问的方法


Jupyter notebook跨机器使用配置说明

生成配置文件

1
jupyter notebook --generate-config
* 如果是`root`用户可能会存在问题,按照提示操作即可

生成密码

1
jupyter notebook password
* 按照提示输入密码,这就是以后在远程访问时使用的密码
* 生成的秘钥在`~/.jupyter/jupyter_notebook_config.json`下

修改配置文件

1
vim  jupyter_notebook_config.py
  • 需要修改以下行
    1
    2
    3
    4
    c.NotebookApp.ip='*' # 这里可以写成本机的公网ip,或者是局域网ip
    c.NotebookApp.password = u'sha1:***' # 这里需要复制修改成刚才生成的密文
    c.NotebookApp.open_browser = False # 启动Jupyter时是否自动打开Web页面
    c.NotebookApp.port =8888 #可自行指定一个端口, 访问时使用该端口

Linux——Logstash时区问题

Posted on 2018-09-07

有时候Linux系统重启或者有修改后会造成时区被修改,默认一般是UTC时间,有时候会变成CST时间
在阿里云主机扩展后出现过一次,造成了Logstash 使用JDBC连接数据库时读取报错:大概是JavaLang::IllegalArgumentException: HOUR_OF_DAY: 2 -> 3这样的错


解决方案:

改系统时区

  • 将系统的时区改回去,然后重启
    1
    2
    3
    4
    # 修改时区命令:	
    timedatectl set-timezone UTC
    # 重启命令:
    shutdown -r now

重启后继续运行之前出错的程序,成功解决问题

链接时加参数

  • 在连接mysql-connector时加上一个时区参数

  • 以logstash为例子

    • 在mysql.config中修改连接语句原来为(连接到名称为”docker“的数据库,但是没有指定参数)

      1
      jdbc:mysql://localhost:3306/docker
    • 修改后连接语句为(制定参数为UTC)

      1
      jdbc:mysql://localhost:3306/docker?serverTimezone=UTC

注意,这种方式修改后我的系统时区可为任意的,比如我的系统时区就一直为CST

替换JDBC版本【未测试】

  • 网上有博客指出可以通过换jdbc connector的版本解决问题

Linux——find命令详解

Posted on 2018-09-07

本文介绍Linux下find命令的使用方法

  • 参考博客: https://www.cnblogs.com/weijiangbao/p/7653588.html

常用方法说明

  • find命令用于在给定目录下查找符合给定条件的文件

  • 用法:

    1
    Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
  • 常用的用法:

    1
    2
    find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;
    find 目标目录 选项 查找完成后执行的操作
  • 实例:

    1
    find . -name "*a*.py" -exec cat {} \; | grep test
    • 解析:将当前文件夹下的名字能匹配*a*.py的文件找出来,并输出其中含有”test”的行
      • .对应path参数,代表搜索路径为当前文件夹, 默认会递归搜索
      • -name "*a*.py"对应选项,指出找文件的筛选条件
      • -exec cat {} \; | grep test指明找到文件后需要执行的操作,{}用于表示前面被固定下来的接受参数, 由于{}后面必须使用分号;,而命令行中分号需要转义字符转义,所以就是\;
        • 注意: 这里{} \;中间必须空一格,且{} \;中间不能加任何字符或命令等
1
find . -maxdepth 1 -name "test*.py" -exec cat {} \;| grep test
* 在前面的基础上指定只从第一层目录中查找,不递归

参数和选项详解

1
find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

参数

  • -print: find命令将匹配的文件输出到标准输出。
  • -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和;之间的空格。
  • -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行

选项

  • -name: 按照文件名查找文件。
  • -perm: 按照文件权限来查找文件。
  • -prune: 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
  • -user: 按照文件属主来查找文件。
  • -group: 按照文件所属的组来查找文件。
  • -mtime -n +n: 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
  • -nogroup: 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
  • -nouser: 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
  • -newer file1 ! file2: 查找更改时间比文件file1新但比文件file2旧的文件。
  • -type: 查找某一类型的文件
    • 默认是查找所有类型
参数 文件类型
d 目录
c 字符设备文件
p 管道文件
f 普通文件
l 符号链接文件
b 块设备文件

Python-Jupyter——将ipynb文件转成py文件

Posted on 2018-09-06
jupyter nbconvert --to script test.ipynb 

ML——损失函数总结

Posted on 2018-09-04

各种损失函数(Loss Function)总结,持续更新


综述

  • 损失函数(Loss Function)又称为代价函数(Cost Function)
  • 损失函数用于评估预测值与真实值之间的不一致程度
  • 损失函数是模型的优化目标函数,(神经网络训练的过程就是最小化损失函数的过程)
  • 损失函数越小,说明预测值越接近于真实值,模型表现越好

各种损失函数介绍

平方损失函数

最常用的回归损失函数

  • 基本形式
    $$loss = (y - f(x))^{2}$$
  • 对应模型
    • 线性回归
      • 使用的均方误差来自于平方损失函数
        $$loss = \frac{1}{m}\sum_{i=1}^{m}(y_{i} - f(x_{i}))$$

绝对值损失函数

最常用的回归损失函数

  • 基本形式
    $$loss = |y - f(x)|$$

对数似然损失函数(交叉熵损失函数)

最常见的损失函数,又名交叉熵损失函数

  • 基本形式
    $$loss=L(P(Y|X))=-logP(Y|X)$$
  • 二分类中对于单个样本的损失一般写为:
    $$loss(x_i) = -y_ilogy_i’ - (1-y_i)log(1-y_i’)$$
  • 写成最容易看清楚的形式为:
    $$
    \begin{align}
    loss(x_i) &= -logy_i’, &\quad y_i = 1 \\
    loss(x_i) &= -log(1-y_i’), &\quad y_i = 0
    \end{align}
    $$
    • \(y_i\) 为样本 \(x_i\)的真实类别
    • \(y_i’\) 为样本\(x_i\)在模型中的预测值(这个值在二分类中为Sigmoid函数归一化后的取值,代表样本分类为\(y_i=1\)的概率)
  • 凡是极大似然估计作为学习策略的模型,损失函数都为对数似然损失函数
    • 因为极大化似然函数等价于极小化对数似然损失函数
    • <<统计学习方法>>第十二章中LR使用的是极大似然估计但是对应的损失函数是逻辑斯蒂损失函数,这里可以证明LR中对数似然损失函数和逻辑斯蒂损失函数完全等价,证明见统计学习方法212页笔记
  • 对应模型
    • 所有使用极大似然估计的模型
    • 最大化后验概率等价于最小话对数似然损失函数
      $$\theta^{\star} = \arg\max_{\theta} LL(\theta) = \arg\min_{\theta} -LL(\theta) = \arg\min_{\theta} -logP(Y|X) = \arg\min_{\theta} -\sum_{i=1}^{m}logp(y_{i}|x_{i})$$

逻辑斯蒂损失函数

LR模型的损失函数

  • 基本形式
    $$loss=L(y,f(x))=log(1+e^{-yf(x)})$$
  • 在LR和最大熵模型中与对数似然损失函数等价(可以带入\(f(x)=wx\)并分\(Y=1 or Y=-1\)两种情况分别证明)
  • 对应模型
    • 逻辑回归模型
    • 最大熵模型

指数损失函数

提升方法的损失函数

  • 基本形式
    $$loss=L(y,f(x))=e^{-yf(x)}$$
  • 对应模型
    • 提升方法

0-1损失函数

最理想的损失函数,但是不光滑,不可导

  • 基本形式
    $$loss=L(y,f(x))=0, if yf(x)>0 \\
    loss=L(y,f(x))=1, if yf(x)<0$$
  • 在由\(f(x)\)符号判断样本的类别的二分类问题中
    • 分类正确时总有\(yf(x)>0\),损失为0
    • 分类错误时总有\(yf(x)<0\),损失为1
  • 在特定的模型中,比如要求\(f(x)=y\)才算正确分类的模型中
    • 0-1损失函数可定义为如下
      $$loss=L(y,f(x))=0, if y=f(x) \\
      loss=L(y,f(x))=1, if y\neq f(x)$$

合页损失函数

支持向量机的损失函数

  • 基本形式
    $$loss=L(y,f(x))=[1-yf(x)]_{+}$$
  • \([z]_{+}\)表示
    • \(z>0\)时取\(z\)
    • \(z\leq 0\)时取0
  • 对应模型
    • 支持向量机

感知机的损失函数

感知机特有的损失函数<<统计学习方法>>

  • 基本形式
    $$loss=L(y,f(x))=[-yf(x)]_{+}$$
  • 与合页损失函数对比
    • 相当于函数图像整体左移一个单位长度
    • 合页损失函数比感知机的损失函数对学习的要求更高
    • 这使得感知机对分类正确的样本就无法进一步优化(分类正确的样本损失函数为0),学到的分类面只要能对样本正确分类即可(不是最优的,而且随机梯度下降时从不同点出发会有不同结果)
    • 而SVM则需要学到最优的才行,因为即使分类正确的样本,依然会有一个较小的损失,此时为了最小化损失函数,需要不断寻找,直到分类面为最优的分类面位置
  • 对应模型
    • 感知机

感知损失函数

与感知机没有任何关系

  • 基本形式
    $$L(y,f(x))=1, if \left | y-f(x)\right |>t \\
    L(y,f(x))=0, if \left | y-f(x)\right |< t$$
  • 这里”感知”的意思是在一定范围内认为\(y\approx f(x)\),满足小范围差距时,损失函数为0

Focal Loss

论文原文为: ICCV 2017: Focal Loss for Dense Object Detection

  • 主要是为了解决正负样本严重失衡的问题
  • 是交叉熵损失函数的一种改进
  • 回归交叉熵损失函数的表达式为:
    $$
    \begin{align}
    loss(x_i) &= -logy_i’, &\quad y_i = 1 \\
    loss(x_i) &= -log(1-y_i’), &\quad y_i = 0
    \end{align}
    $$
  • Focal Loss的损失函数如下
    $$
    \begin{align}
    loss(x_i) &= -(1-y_i’)^\gamma logy_i’, &\quad y_i = 1 \\
    loss(x_i) &= -y_i^\gamma log(1-y_i’), &\quad y_i = 0
    \end{align}
    $$
    • \(\gamma\)的取值在原始论文中使用了 0, 0.5, 1, 2, 5 等
    • 当 \(\gamma > 0\) 时显然有
      • 分类输出与真实标签越大的样本,他们的损失权重越大
      • 分类输出与真实标签越接近的样本,他们的损失权重越小
      • 以上两点给了模型重视分类错误样本的提示
    • \(\gamma = 0\)时Focal Loss退化为交叉熵损失函数
    • \(\gamma\) 越大,说明, 分类错误的样本占的损失比重越大
  • 实际使用中, 常加上\(\alpha\)平衡变量
    $$
    \begin{align}
    loss(x_i) &= -\alpha(1-y_i’)^\gamma logy_i’, &\quad y_i = 1 \\
    loss(x_i) &= -(1-\alpha)y_i^\gamma log(1-y_i’), &\quad y_i = 0
    \end{align}
    $$
    • \(\alpha\) 用于平衡正负样本的重要性
    • \(\gamma\) 用于加强对难分类样本的重视程度
  • 假设正样本数量太少, 负样本数量太多, 那么该损失函数将降低负样本在训练中所占的权重, 可以理解为一种困难样本挖掘
    • 困难样本挖掘的思想就是找到分类错误的样本(难以分类的样本), 然后重点关注这些错误样本
  • 原论文中的实验结果:

不同模型的损失函数

决策树的损失函数

  • 决策树有两个解释
    • if-then规则
    • 条件概率分布
  • <<统计学习方法>>: 决策树的损失函数是对数似然
    • 决策树可以看作是对不同概率空间的划分

Loss Function vs Cost Function

  • 损失函数(Loss Function)应用于一个特定的样本计算误差
  • 成本函数(Cost Function)是对所有样本而言的误差

Math——凸优化问题和拉格朗日对偶性

Posted on 2018-09-04

问题定义

  • 一般优化问题的定义:

$$
\begin{align}
\min_{w}\quad &f(w) \\
s.t. \quad &g_{i}(w) \leq 0, i = 1,2,\dots,k \\
&h_{j}(w) = 0, j = 1,2,\dots,l
\end{align}
$$

凸优化问题

  • 如果原始优化问题满足:
    • \(f(w)\)和\(g_{i}(w)\)都是\(\mathbb{R}^{n}\)上连续可微的凸函数
    • \(h_{j}(w)\)为\(\mathbb{R}^{n}\)上的仿射函数 (仿射函数是满足\(h_{j}(x) = a\cdot x + b\)的函数)
  • 那么,原始优化问题是凸优化问题

凸二次优化问题

  • 若上述凸优化问题还满足:
    • \(f(w)\)是二次函数
    • \(g_{i}(w)\)是\(\mathbb{R}^{n}\)上的仿射函数
  • 那么,原始优化问题是凸二次优化问题

朗格朗日对偶性

拉格朗日对偶性的推导
  • 原始问题定义为

$$
\begin{align}
\min_{w}\quad &f(w) \\
s.t. \quad &g_{i}(w) \leq 0, i = 1,2,\dots,k \\
&h_{j}(w) = 0, j = 1,2,\dots,l
\end{align}
$$

  • 引进拉格朗日函数有
    $$
    \begin{align}
    L(x,\alpha, \beta) = f(w) + \sum_{i=1}^{k}\alpha_{i}g_{i}(w) + \sum_{j=1}^{l}\beta_{j}h_{j}(w)
    \end{align}
    $$

  • 考虑到
    $$
    \begin{align}
    \max_{\alpha,\beta:\alpha_{i}\geq 0}L(x,\alpha, \beta)
    \end{align}
    $$

    • 当\(x\)满足原始问题的解时,上面的式子等价与\(f(x)\)
    • 否则上面的式子等于无穷大\(+\infty\)
  • 所以假设原始问题的最优值为\(p^{\star}\),那么
    $$
    \begin{align}
    p^{\star} = \min_{x}\max_{\alpha,\beta:\alpha_{i}\geq 0}L(x,\alpha, \beta)
    \end{align}
    $$

    • (\(p^{\star}\)不是最优参数,是最优参数对应的函数值,参数应该用\(\arg\max_{x}\)而不是\(\max_{x}\))
  • 定义对偶问题为:
    $$
    \begin{align}
    &\max_{\alpha,\beta:\alpha_{i}\geq 0}\min_{x}L(x,\alpha, \beta) \\
    &s.t.\quad \alpha_{i} \geq 0,\quad i=1,2,\dots,k
    \end{align}
    $$

  • 假设原始问题的最优解为\(d^{\star}\),则原始问题与对偶问题的关系为:
    $$
    \begin{align}
    d^{\star} = \max_{\alpha,\beta:\alpha_{i}\geq 0}\min_{x}L(x,\alpha, \beta) = \min_{x}\max_{\alpha,\beta:\alpha_{i}\geq 0}L(x,\alpha, \beta) = p^{\star}
    \end{align}
    $$

  • 满足下面条件的最优化问题,\(x^{\star}\)和\((\alpha^{\star}, \beta^{\star})\)分别是原始问题和对偶问题的解的充分必要条件是\((x^{\star}, \alpha^{\star}, \beta^{\star})\)满足KKT条件

    • 原始问题是凸优化问题
    • 不等式约束\(c_{i}(x) < 0\)是严格可行的,即:
      $$\exists x \quad \forall i, \quad c_{i}(x) < 0$$
  • 需要强调的是:

    • KKT条件是强对偶性成立的必要条件
    • 当原始问题是凸优化问题且不等式约束\(c_{i}(x) < 0\)是严格可行的时: KKT条件是强对偶性成立的充要条件
KKT条件:

$$
\begin{align}
\nabla_{x}L(x^{\star}, \alpha^{\star}, \beta^{\star}) &= 0 \\
\nabla_{\alpha}L(x^{\star}, \alpha^{\star}, \beta^{\star}) &= 0 \\
\nabla_{\beta}L(x^{\star}, \alpha^{\star}, \beta^{\star}) &= 0 \\
h_{j}(x^{\star}) &= 0 \quad j=1,2,\dots,l \\
c_{i}(x^{\star}) &\leq 0, i=1,2,\dots,k \\
\alpha_{i}^{\star} &\geq 0, i=1,2,\dots,k \\
\alpha_{i}^{\star}c_{i}(x^{\star}) &= 0, i=1,2,\dots,k
\end{align}
$$

  • 补充说明:
    • \(x^{\star}\)是原始问题的解
    • \((\alpha^{\star}, \beta^{\star})\)是对偶问题的解
  • 理解:
    • 前三个无约束最优化时求极值的方法,导数为0
    • 中间两个是原始问题中的要求
    • 倒数第二个\(\alpha_{i}^{\star} \geq 0\)是为了保证\(f(x)\)的梯度和\(c_{i}(x)\)的梯度方向相反,详情参考周志华<<机器学习>>P404
    • 最后一个KKT条件可通过梯度方向推出,详情参考周志华<<机器学习>>P404

Math——函数空间总结

Posted on 2018-09-04

希尔伯特空间,欧几里得空间,巴拿赫空间或者拓扑空间都是函数空间

参考博客:欧几里得空间与希尔伯特空间

1…91011…20
Joe Zhou

Joe Zhou

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

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