Jun 24, 2015 - Linux权限解读

查看权限

ls -l file来查看某个文件的权限,结果的前10个字符代表权限信息。这十位字符,可分为四组,第一个字符一组,剩余九个每三个一组。

第一个字符可是是d或者-:

  • d: 文件夹
  • -: 文件

比如drwxrwxr-x 6 yalei yalei 4096 Jun 18 08:50 ××××××,表示这是一个文件夹,剩下三组的意思是:

  • rwx: 当前用户的权限:读,写,执行。r,w和x分别对应read,write和execute

  • rwx: 当前用户所属的用户组权限:读,写,执行

  • r-x: 其他用户的权限:读,执行

类似的,下边的文件,当前用户有读写权限;而该用户所属的用户组有读的权限,不能写入;其他用户组的用户没有任何权限。

-rw-r-----  1 yalei yalei 3052535 Jun 23 15:54 ××××××

更改权限

chmod xxx file_name命令修改权限。其中参数xxx主要是u o g+-r w x的不同组合。u,g,o分别代表user,group和others;即当前用户,用户组和其他用户。+ -表示赋予和撤消,r w x即读,写,执行。合在一起就是给用户赋予或撤消某种权限。

chmod u+x file # 只给当前用户加上可执行权限
chmod u+rwx,o+rw,g-rwx file # 当前用户加读写和执行权限,用户组加读写权限,其他用户撤消所有权限

更改权限的另一种方式是把参数xxx写成三位数的形式,比如chmod 777 file就是给所有用户赋予所有权限。解读方式是:

  • 4 读
  • 2 写
  • 1 执行

所以7=4+2+1,表示读写和执行权限,6表示读写,5表示可读和可执行,3表示可写和可执行(这个比较奇葩,能写但不能读),0表示没有任何权限。777分别对应的是user,group和others的权限。那么chmod 600 file就是只给当前用户读写权限。

如果更改整个文件夹的所有文件,加上chmod -R ...的参数就好。

更改拥有者

通常有权限问题都是因为该文件(夹)不属于自己。比如下边的文件夹,文件夹属于root这个用户和wheel这个用户组。可以看到用户组也是没有写入权限的,只有root用户有权限。

$ ll /etc
lrwxr-xr-x@ 1 root  wheel    11B Aug  5  2015 /etc -> private/etc

这时需要写入操作的话,有好几种方案:

(1) 可以在命令前加上sudo关键字,表示以超级管理员的身份运行,需要输入密码。适用于不常用的特殊写入访问,比如修改host文件。最后,如果你的用户不是超级管理员,那就放弃吧。

(2) 添加用户组的写入权限并把自己的用户加到该用户组。适用于公共目录下常用的写入操作,此处公共目录就是除自身主目录的其他所有目录。

sudo chmod -R 775 /etc      # 添加用户组的写入权限
sudo usermod -a -G wheel YOUR_USER_NAME  # 给自己的用户添加用户组

(3) 更改文件夹的拥有者(owner)。适用于一些私密文件夹里常用的写入操作,比如一些文件夹不想让其他用户访问。 比如经常需要装Python的包,但又不想让其他用户乱装。跟第二个方案差不多。

/etc文件夹改成某个用户和某个用户组下的命令:

sudo chown -R /etc YOUR_USER_NAME:USER_GROUP

Apr 28, 2015 - Rmd到PDF的转换

对于用惯了Word的来说,Latex大概是一个噩梦,好在能用惯Word的人并不多。各位观众应该都或多或少的见过各种Word排版技巧充斥在朋友圈,人人网,QQ空间等。跟Latex的命令一样,让人看了就头疼。

如果你会用Knitr,那就一定也会用Markdown(二者都不会的看官请移步这里)。Markdown是HTML的简化,语法简洁,十分钟就能学完。只是Knitr初出之时,Markdown也就只能转成HTML而已。如今Knitr已3岁有余,从Markdown到PDF的转化也很成熟了。话不多说,让我们直奔主题。

预先安装

  • 最新版本的Rstudio(已经内置的Pandoc工具,没听说过这个工具也没关系,装上最新版的Rstudio就是了)。
  • R包:knitrrmarkdown,均可从CRAN上直接下载。
  • Tex环境。Windows用户安装CTEX,Linux用户安装Texlive,Mac用户安装MacTex。似乎各种版本都有精简版和完整版,建议安装完整版。

英文环境

新建一个Rmd文档,其头文件应该是以下这种格式:

---
title: "XXX"
author: "xxx"
date: "xxx"
output: html_document
---

如果你的Rmd文档是全英的,只需要把html_document改成pdf_document。Ctrl+S保存后,编译按钮会自动从Knit HTML变成Knit PDF,轻点鼠标即大功告成。

这里简单说下转换的流程是:

  1. knitr运行Rmd中的代码,生成md文件
  2. 神器Pandoc把md文件转化为tex文件
  3. Latex环境编译tex文件生产PDF

中文环境

如果Rmd文档中有中文字符,那你就呵呵了。因为在第二步md到tex的转化中,是按照预先设置的模板来的,而默认的模板中并没有设置中文字体。

如果你是Latex和Padoc的高手,折腾一下模板就能搞定了。初学者也不用紧张,已经有高手把模板封装打包了,只需安装rticles这个包即可:

devtools::install_github("rstudio/rticles")

安装完成后,新建一个Rmd文件,从模板中选择CTex Documents

可以看到,rticles还提供了其他的模板如ACMACSJournal of Statistical Software等。没错,以后要投稿这些期刊的话,你可以直接用Markdown的语法来写了!回到CTex Documents模板中来,作者已经里边阐述了各系统下Rmd到PDF的转化问题。如果你是Windows用户,轻点鼠标即可生产精致的PDF文件。如果你是Linux或者Mac用户,只能无奈的再次呵呵了。不过别急着丧气,读读模板中的内容,其中已有妙计相赠。

其他

(1)对于其他的Rmd文档,想转成PDF的话,只需要把CTex Documents模板中的头信息粘贴过去,修改其中的title和author信息即可。

---
title: "在R Markdown文档中使用中文"
author:
  - 谢益辉
  - 邱怡轩
  - 于淼
documentclass: ctexart
output:
  pdf_document:
    fig_caption: yes
    latex_engine: xelatex
    number_sections: yes
    template: !expr rticles::ctex_template()
    toc: yes
classoption: "hyperref`r if (.Platform$OS.type != 'windows') ',nofonts'`"
---

(2)按钮Knitr PDF背后所做的事是由rmarkdown包的render函数支持的,相应的代码是:

rmarkdown::render('toremove.Rmd', pdf_document())

如果有多个文档,写个脚本就能把整个流程完全自动化了。

(3)如果Markdown中包含HTML标签,输出HTML是毫无影响的。比如<img src=picture.png/>![pic](picture.png)是等价的,前者是HTML标签,后者是md语法。但是Pandoc并不能识别前者的HTML标签并转化成相应的Tex代码。所以从md到PDF的转化,不能夹杂HTML标签。

Oct 28, 2014 - Logistic Regression in R and Python

python中的scikit-learn库提供了一系列机器学习的算法,其中包括Logistic Regression。不过默认的,该库提供的是加入L2惩罚项的Logistic回归。但是程序设置上,python与R语言中有点出入,使得默认设置下同样数据出现的结果相差很大。

R语言

在R语言中执行带惩罚项的Logistic回归,需要加载glmnet包。包中Logistic回归的优化目标是:

其中$\text{nobs}$代表样本量。惩罚项如果是L2惩罚,则是$\frac{1}{2} \parallel \theta \parallel_2^2$,其中不包含截距项。如果是L1惩罚,就是$ \theta _1$.

glmnet的设置:

  • family=‘binomial’ 代表Logistic回归;
  • alpha 表示elasticnet的混合参数:

所以$\alpha=1$表示lasso的L1惩罚,$\alpha=0$表示岭回归的L2惩罚; lambda 就是优化目标中的参数λ 默认的,glmnet会添加截距项,并对自变量进行标准化。

python

python的scikit-learn中,Logistic回归是参考的这篇文献。文献中二阶惩罚优化的目标函数是:

与R语言的区别在于,这里的惩罚项里包含截距项。另外参数设置上,这里的$C$相当于$\lambda$,都是作为一个权衡似然函数和惩罚项的参数。

若想要与R语言的优化目标一致,则需要满足:

  • 不含截距项
  • $n\lambda = \frac{1}{C}$

其中,$n$表示样本量,$\lambda$是R语言glmnet函数中的lambda参数,$C$是python中的参数。

Code

选择iris数据的前100行,作一个二分类的Logistic回归。设置python中$C=1$,R语言中应该有$n\lambda=1$,所以lambda应该是$\frac{1}{n}=0.01$。

无截距项

python:无截距项

from sklearn import linear_model
from sklearn import datasets
iris = datasets.load_iris()
index = iris.target != 2
logit = linear_model.LogisticRegression(C=1.0,  tol=1e-8, fit_intercept= False)
logit.fit(iris.data[index, ], iris.target[index])
print [logit.coef_, logit.intercept_]
[array([[-0.44234418, -1.48544863,  2.23987714,  1.01147778]]), 0.0]

R语言:无截距,不标准化

library(glmnet)
index = 1:100
iris.x = as.matrix(iris[index, 1:4])
iris.y = as.factor(as.character(iris[index, 5]))
# 不标准化自变量,不添加截距项
logit = glmnet(iris.x, iris.y, family="binomial", alpha=0, lambda=1/100, standardize=F, thresh =1e-8, intercept = F)
coef(logit)
5 x 1 sparse Matrix of class "dgCMatrix"
                     s0
(Intercept)   .        
Sepal.Length -0.4385104
Sepal.Width  -1.4868544
Petal.Length  2.2384771
Petal.Width   1.0031797

结果基本一致。

添加截距项?

最后,若想添加截距项后两个程序结果一致,可以修改python中的intercept_scaling参数,其参数解释为:

when self.fit_intercept is True, instance vector x becomes [x, self.intercept_scaling], i.e. a “synthetic” feature with constant value equals to intercept_scaling is appended to the instance vector. The intercept becomes intercept_scaling * synthetic feature weight Note! the synthetic feature weight is subject to l1/l2 regularization as all other features. To lessen the effect of regularization on synthetic feature weight (and therefore on the intercept) intercept_scaling has to be increased.

具体的计算原理不清楚,但依据解释,只要增大intercept_scaling就可以减少惩罚项对截距的影响。

先来看看python中添加截距项的默认结果:

logit = linear_model.LogisticRegression(C=1.0,  tol=1e-8, fit_intercept= True)
logit.fit(iris.data[index, ], iris.target[index])
print [logit.coef_, logit.intercept_]
[array([[-0.4070443 , -1.46126494,  2.23984278,  1.00849909]]), array([-0.26042082])]

增大intercept_scaling=100000的结果:

logit = linear_model.LogisticRegression(C=1.0,  tol=1e-8, fit_intercept= True, intercept_scaling=1e5)
logit.fit(iris.data[index, ], iris.target[index])
print [logit.coef_, logit.intercept_]
[array([[-0.44234418, -1.48544863,  2.23987714,  1.01147778]]), 0.0]

R语言中添加截距项的结果:

logit = glmnet(iris.x, iris.y, family="binomial", alpha=0, lambda=1/100, 
               standardize=F, thresh = 1e-8, intercept = T)
coef(logit)
5 x 1 sparse Matrix of class "dgCMatrix"
                     s0
(Intercept)  -6.6114025
Sepal.Length  0.4403477
Sepal.Width  -0.9070024
Petal.Length  2.3084749
Petal.Width   0.9623247

增大intercept_scaling=100000后与R语言的结果基本一致了。