yongrl


  • Home

  • About

  • Tags

  • Categories

  • Archives

  • Books

  • Movies

sklearn之样本数据

Posted on 2019-02-12 | In 工具
Words count in article: | Reading time ≈

当我们想要直接的查看某个算法在数据上的作用时,如果立即在我们的目标数据上做实验,需要做很多的数据预处理工作,甚至很多预备工作是针对该算法做的,经过千辛万苦之后发现这个算法和我们预期的不一样,那么就造成了资源的浪费,sklearn中有一些方法可以直接生成简单的各种数据,帮助我们对新的算法尽快上手,这篇主要总结sklearn中自带的数据及以及样本生成方法。

sklearn dataset mindmap

Hello World

Posted on 2019-02-01
Words count in article: | Reading time ≈

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

git 总结二

Posted on 2019-01-31 | In 工具
Words count in article: | Reading time ≈

来源:git教程 - 廖雪峰的官方网站

git总结一

工作区和暂存区

工作区(Working Directory)

工作区就是我们创建的learngit目录

版本库(Repository)和暂存区(stage)

工作区内隐藏的目录.git,这就是git的版本库,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
image

git add把文件添加进去,实际上就是把文件修改添加到暂存区;
git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改,可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改

管理修改

Git跟踪并管理的是修改,而非文件。比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。

对readme.txt做一个修改,比如加一行内容:

1
2
3
4
5
$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.

添加到stage

1
2
3
4
5
6
7
8
$ git add readme.txt
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#

在修改一次readme.txt:

1
2
3
4
5
$ cat readme.txt 
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.

直接提交:

1
2
3
$ git commit -m "git tracks changes"
[master 519219b] git tracks changes
1 file changed, 1 insertion(+)

查看git状态:

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

用git diff HEAD – readme.txt命令可以查看工作区和版本库里面最新版本的区别:

1
2
3
4
5
6
7
8
9
10
11
$ git diff HEAD -- readme.txt 
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.

第二次修改确实没有被提交。每次修改,如果不用git add到暂存区,那就不会加入到commit中。

git checkout –file撤销工作区修改

git checkout – file可以丢弃工作区的修改
命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

git reset HEAD 撤销暂存区的修改

用命令git reset HEAD 可以把暂存区的修改撤销掉(unstage),重新放回工作区,
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

git rm从版本库删除文件

将工作区的文件删除后,也要从版本库将文件删除:

1
2
3
4
5
6
7
$ git rm test.txt
rm 'test.txt'

$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt

如果工作区的文件删错了,因为版本库里还有呢,所以可以根据版本中很轻松地把误删的文件恢复到最新版本:

1
$ git checkout -- test.txt

git 总结一

Posted on 2019-01-31 | In 工具
Words count in article: | Reading time ≈

来源:git教程 - 廖雪峰的官方网站

git简介

git和Linux是同一个爸爸, 爸爸Linus在开始都是手工将世界各地的源代码合并,到2002年Linux发展十年,代码库之大让Linus很难继续通过手工方式管理了,Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。但2005年开发Samba的Andrew试图破解BitKeeper的协议,被BitMover公司发现了,于是BitMover公司怒了,要收回Linux社区的免费使用权。

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了。

git 尝试

git init 创建版本库

版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

创建一个版本库非常简单,首先创建一个空文件夹,进入文件夹后,打入git init命令即创建了一个共的版本库。

1
2
3
4
5
6
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

git init之后,目录下会多一个.git目录,这个目录就是git用来跟踪挂你版本库的。

git add 、git commit添加文件到版本库

在learngit文件夹下创建文件readme.txt,内容如下:

1
2
Git is a version control system.
Git is free software.

将readme.txt文件放到git仓库需要以下两步:

  • git add 将文件添加到仓库
1
$ git add readme.txt
  • git commit 将文件提交到仓库
1
$ git commit -m "wrote a readme file"

-m 参数是本次提交的说明文字,最好能说明此次改动之处。

git status 查看仓库当前状态

如果修改readme.txt文件:

1
2
Git is a distributed version control system
Git is free software

此时运行git status

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

get status告诉我们readme.txt文件被修改了,但是并没有提交。

git diff 查看文件修改内容

1
2
3
4
5
6
7
8
9
$ git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.

重新git add readme.txt,使用git status查看当前仓库的状态:

1
2
3
4
5
6
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: readme.txt

git status 表明将要提交的修改包括readme.txt,此时可以放心的提交:

1
2
3
$ git commit -m "add distributed"
[master e475afc] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)

再次使用git status查看仓库的状态:

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:

1
2
3
4
5
6
7
8
9
$ git diff readme.txt 
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个distributed单词。

知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add:

$ git add readme.txt
同样没有任何输出。在执行第二步git commit之前,我们再运行git status看看当前仓库的状态:

1
2
3
4
5
6
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: readme.txt

git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了:

1
2
3
$ git commit -m "add distributed"
[master e475afc] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)

提交后,我们再用git status命令看看仓库的当前状态:

1
2
3
$ git status
On branch master
nothing to commit, working tree clean

当前已没有需要提交的修改,且工作目录是干净的。

版本管理

假设对readme.txt文件进行了多次修改且上传,修改如下:

1
2
Git is a distributed version control system
Git is free software distributed under the GPL

提交:

1
2
$ git add readme.txt
$ git commit -m "append GPL"

此时,readme已经有三个版本了,commit信息分别为”wrote a readme file”、”add distributed”、”append GPL”

git log 查看历史记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:06:15 2018 +0800

append GPL

commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:03:36 2018 +0800

add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 20:59:18 2018 +0800

wrote a readme file

git log 命令显示从近到远的提交日志,如果觉得输出信息太多,可以加上–pretty=oneline参数

git reset 版本回退

将readme.txt回退到add distributed版本

1
2
$ git reset --hard HEAD^
HEAD is now at e475afc add distributed

HEAD表示当前版本,也就是最新的提交1094adb…,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

如果现在反悔了,想重新回退到append GPL的版本,此时只有记得append GPL的版本commit id的才能回退。

1
2
$ git reset --hard 1094a
HEAD is now at 83b0afe append GPL

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:

imageimage

git reflog 查看git的历史命令

1
2
3
4
5
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file

方差、协方差、相关系数的理解

Posted on 2019-01-28 | In 数学
Words count in article: | Reading time ≈

方差和协方差机器学习中常见的两个概念,公式也几乎是随处可见,但是每见一次都像是初次见面,又去想半天各种公式、概念和意义,所以下定决心整理一下。

方差和协方差

定义

方差

度量==单个==随机变量的离散程度,公式如下:
$$
\sigma^2_x = \frac{1}{n-1}\sum_{i=1}^n(x_i-\overline{x})^2
$$

协方差

度量==两个==随机变量(==变化趋势==)的相似程度,定义如下:
$$
\sigma(x,y)= \frac{1}{n-1}\sum_{i=1}^n(x_i-\overline{x})(y_i-\overline{y})
$$

$$
Cov(X,Y) = E[(X-\mu_x)(Y-\mu_y)]
$$

以上两个公式就可以看出,方差和协方差的定义同宗。

图解

那么方差是怎么衡量随机变量的离散程度的呢?协方差又怎么衡量变量的变化趋势的呢?

方差

方差示意图1图1

离散程度具体来说衡量的是随机变量偏离均值的幅度大小,单个数据点x的偏离幅度为x与x均值的距离平方和。

上图中的右上图和右下图,两个随机变量的均值虽然都为0,但是很明显右下图中随机变量偏离均值的幅度更大,各自的方差为:
$$
(2(70-0)^2+2(-70-0)^2+(-200-0)^2+(200-0)^2)=99600
$$

$$
(2(0.01-0)^2+2(-0.01-0)^2+(-0.02-0)^2+(0.02-0)^2)=0.001
$$

所以右上图的离散变量分布的更紧凑。

协方差

对于变量X、Y,协方差的定义为每个时刻的“X值与其均值之差”乘以“Y值与其均值之差”的均值(其实是求“期望”)。因此,如果x与x的均值差与y与y的均值差的符号相同,则协方差值大于0,符号相反,则协方差值小于0,总结如下:

image图2
image图3
image图4

在图2、3、4中的区域(1)中,有 X>EX ,Y-EY>0 ,所以(X-EX)(Y-EY)>0;

在图2、3、4中的区域(2)中,有 X0 ,所以(X-EX)(Y-EY)<0;

在图2、3、4中的区域(3)中,有 X<EX ,Y-EY<0 ,所以(x-ex)(y-ey)="">0;

在图2、3、4中的区域(4)中,有 X>EX ,Y-EY<0 ,所以(X-EX)(Y-EY)<0。

当X 与Y 正相关时,它们的分布大部分在区域(1)和(3)中,小部分在区域(2)和(4)中,所以平均来说,有E(X-EX)(Y-EY)>0 。

当 X与 Y负相关时,它们的分布大部分在区域(2)和(4)中,小部分在区域(1)和(3)中,所以平均来说,有(X-EX)(Y-EY)<0 。

当 X与 Y不相关时,它们在区域(1)和(3)中的分布,与在区域(2)和(4)中的分布几乎一样多,所以平均来说,有(X-EX)(Y-EY)=0 。

所以,我们可以定义一个表示X, Y 相互关系的数字特征,也就是协方差
cov(X, Y) = E(X-EX)(Y-EY)。

当 cov(X, Y)>0时,表明 X与Y 正相关;

当 cov(X, Y)<0时,表明X与Y负相关;

当 cov(X, Y)=0时,表明X与Y不相关。

image
图5

image图6

而大多数情况下,变量X,Y的变化趋势不会像图一一样严格的同增大同减小,大多如图5和图6一样,这时只要求期望就可以了。

相关系数

由协方差的概念相关系数,其定义如下:
$$
\rho = \frac{Cov(X,Y)}{\sigma_X\sigma_Y}
$$

就是用X、Y的协方差除以X的标准差和Y的标准差。

在图一中,情况一和情况二的协方差计算如下:

情况一
$$
[(100-0)\times(70-0)+(-100-0)\times(-70-0)+(-200-0)\times(-200-0)…]\div7\approx 15428.57
$$
情况二:
$$
[(0.01-0)\times(70-0)+(-0.01-0)\times(-70-0)+(-0.02-0)\times(-200-0)…]\div7\approx 1.542857
$$
由以上计算可知,除了协方差的正负号表示变量的变化趋势是否一致之外,数值的大小还表示变化相似的程度,而相关系数则是协方差的标准化,两种情况的相关系数如下:

情况一:
$$
\rho_1 = 15428.57 \div (130.9307 \times 119.2836) \approx 0.9879
$$
情况二:
$$
\rho_2 = 1.542857 \div (0.01309307 \times 119.2836) \approx 0.9879
$$

因此相关系数:

1、也可以反映两个变量变化时是同向还是反向,如果同向变化就为正,反向变化就为负。

2、由于它是标准化后的协方差,因此更重要的特性来了:它消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度。

参考:

如何通俗易懂地解释「协方差」与「相关系数」的概念? - GRAYLAMB的回答 - 知乎
https://www.zhihu.com/question/20852004/answer/134902061

终于明白协方差的意义了

pandas 之表的连接操作

Posted on 2019-01-25 | In python编程
Words count in article: | Reading time ≈

问题

在分析数据时,遇到了要处理多个dataframe按照关键词user_id连接的需求,在sql中只要多个表left join on 就可以了,那么在pandas中怎么操作呢?

DataFrame中的表连接方式

dataframe主要有三个函数可以用来做表的连接,分别是join、merge、concat,下面分别介绍这三个DataFrame的用法。

join

1
DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

通过列或者索引join “other” dataframe, 能高效的连接多个dataframe。

参数:

  • other:一个dataframe,或者是dataframe的list
  • on:列或索引名,或者是连接关键词的list
  • how:连接方式,可选{‘left’,’right’, ‘outer’, ‘inner’}, 默认值: ‘left’
  • lsuffix:左表交叉列的别名
  • rsuffix:右表交叉列的别名
  • sort:布尔值,是否按照连接关键词排序,默认为False

注意:多表连接只能通过索引,否则会报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-35-29a230cbe380> in <module>
----> 1 oned_beh_UserCou.join([threed_beh_UserCou.reset_index(),sixd_beh_UserCou.reset_index],how='left',on='user_id')

/usr/local/lib/python3.5/dist-packages/pandas/core/frame.py in join(self, other, on, how, lsuffix, rsuffix, sort)
5291 # For SparseDataFrame's benefit
5292 return self._join_compat(other, on=on, how=how, lsuffix=lsuffix,
-> 5293 rsuffix=rsuffix, sort=sort)
5294
5295 def _join_compat(self, other, on=None, how='left', lsuffix='', rsuffix='',

/usr/local/lib/python3.5/dist-packages/pandas/core/frame.py in _join_compat(self, other, on, how, lsuffix, rsuffix, sort)
5309 else:
5310 if on is not None:
-> 5311 raise ValueError('Joining multiple DataFrames only supported'
5312 ' for joining on index')
5313

ValueError: Joining multiple DataFrames only supported for joining on index

但是当对dataframe进行groupby、reset_index等操作后,此时的index可能并不是我们想要的索引列。可以通过以下函数来重置index:

1
2
3
pandas.DataFrame.reset_index()
pandas.DataFrame.set_index("",drop=True)
pandas.Series.reset_index()

merge

1
DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)[source]

merge类似于数据库中的join操作(database-style join),如果两表连接的字段是column,dataframe的index会被省略,如果是索引和索引或者索引和column的链接,最后仍会保留index

参数

  • right:连接的另一个dataframe
  • how: 连接方式,可选{‘left’,’right’, ‘outer’, ‘inner’}, 默认值: ‘inner’
  • on: 表的连接字段,column name 或者index name,这个字段必须出现在连接的两个dataframe中,如果该参数值为None,并且不是按照index连接,则表的连接字段为两个dataframe的公共字段
  • left_on: 左dataframe的连接column或index名,list或者array-like
  • right_on: 右dataframe的连接column或index名,list或者array-like
  • left_index: 布尔值,默认为False,使用左dataframe的index作为join的字段
  • right_index: 同left_index
  • sort: 布尔值,默认False,是否按键值排序
  • suffixes: 2-length sequence,公共字段别名
  • copy: 布尔值,默认True
  • indicator: 布尔或者字符串
  • validate: 字符串,默认None,检验merge是否为以下形式:”one_to_one”,”one_to_many”,”many_to_one”,”many_to_many”

concat

1
pandas.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)

按某一维度拼接pandas对象

参数:

  • objs:
  • axis: {0,1},默认为0
  • join: {‘inner’,’outer’},默认为outer,这个参数的意思是如果按行连接,列的处理方式,inner则只保留公共列,outer则列出所有列
  • join_axes:
  • ignore_index: 布尔值,默认为False,
  • key: sequence,默认None
1
2
3
4
import pandas as pd
df1 = pd.DataFrame([['a', 1], ['b', 2]],columns=['letter', 'number'])
df3 = pd.DataFrame([['c', 3, 'cat'], ['d', 4, 'dog']], columns=['letter', 'number', 'animal'])
pd.concat([df1, df3], join="inner")
1
2
3
4
5
letter	number
0 a 1
1 b 2
0 c 3
1 d 4
1
2
pd.concat([df1, df3], join="outer",ignore_index=True)
animal letter number
1
2
3
4
0	NaN	a	1
1 NaN b 2
2 cat c 3
3 dog d 4

总结

merge与join相比,join可以一次进行多个dataframe的连接,而merge一次只能进行两个dataframe, 但merge在连接字段的设置上更灵活,而concat只是进行dataframe的行或列的拼接。

test

Posted on 2019-01-24 | In 学习笔记
Words count in article: | Reading time ≈

yongrl

7 posts
4 categories
7 tags
GitHub E-Mail
© 2019 yongrl | Site words total count: