HelloDavid


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

随机森林和决策树

发表于 2019-06-07 | 分类于 机器学习

决策树

本质是一颗由多个判断节点组成的树。决策树算法的核心是通过对数据的学习,选定判断节点,构造一颗合适的决策树。

树模型不需要做归一化:

  1. 归一化的目的是为了加快梯度下降法的收敛速度,但是决策树模型不需要计算梯度
  2. 树模型只考虑特征的划分界限,而不需要考虑特征的值范围

决策树的关键是选择最优划分属性。

一个属性会有多个取值,根据这个属性的不同取值将输入的数据划分为多个样本集合,一个取值对应一个分支集合,

(注意,CART树只选取一个取值,因此是划分为二叉树)

使得每个取值分支集合中的样本尽可能属于同一类别,即分支集合的纯度越高。

三种选择方式:

阅读全文 »

推荐系统36式笔记(一)

发表于 2019-06-07 | 分类于 推荐系统

为知识付费:https://time.geekbang.org/column/intro/74

本文仅为个人学习笔记。

推荐系统:是一种信息过滤系统,预测用户(User)对物品(Item)的评分和偏好。

推荐系统的问题模式

分为评分预测和行为预测。

评分预测

假如用户消费完一个物品之后会给出一个打分,比如通常是 1~5分,那么我们要做的就是建立一个模型,利用用户历史上打过分的物品,预测用户对一个没有见过的物品的打分。

显示反馈:用户对物品的明确评分,直接表达了用户对物品的态度。

隐式反馈:与显示反馈相对,实际中用户的物品的评分这类数据不易收集,我们需要利用隐式反馈,即用户的各种行为(如点击,浏览,收藏等),去找到用户对物品的态度。即行为预测。

阅读全文 »

Ubuntu Tmux 启用鼠标滚动

发表于 2019-06-07 | 分类于 linux

Ubuntu Tmux 启用鼠标滚动

在Ubuntu上使用Tmux是一件非常舒服的事,但有时使用鼠标滚轮时,和平时使用终端的习惯不怎么一致,因此可以设置启用鼠标滚轮。
具体方式:
按完前缀ctrl+B后,再按分号:进入命令行模式,
输入以下命令:

1
set -g mouse on

就启用了鼠标滚轮,可以通过鼠标直接选择不同的窗口,也可以上下直接翻页。

Tip
但在以上设置下,会发现无法用中键向 tmux 中复制文本,也无法将 tmux 中选择好的文本中键复制到系统其他应用程序中。
这里有一个 trick,那就是在 tmux 中不论选择还是复制时,都按住 Shift 键,你会发现熟悉的中键又回来了 :-) 此外,还可以使用 Shift+Insert 快捷键将系统剪切板中的内容输入 tmux 中。 相对于 tmux 原生的选择模式(不加 shift 键),使用系统选择有个缺陷,即当一行内存在多个面板时,无法选择单个面板中的内容,这时就必须使用 tmux 自带的复制粘贴系统了。

参考:https://superuser.com/questions/210125/scroll-shell-output-with-mouse-in-tmux,
http://mindonmind.github.io/notes/linux/tmux_copy_paste_by_mouse.html
里面有人说输入setw -g mouse on,但我没有成功,我的ubuntu版本为14.04。

A Trip to XiaMen

发表于 2019-06-07 | 分类于 travel

Day1

南普陀寺(2.5h) - 厦门大学(3h) - 厦大白城沙滩 (2h) - 环岛路 (2h)

8.20 出发,宾馆-南普陀寺 公交 30min

9.00 南普陀寺 (免费)

寺庙上五老峰 1h

12.00 厦门大学

厦门大学 (凭身份证进入, 西门或西北门)

开放时间:周一至周五 12.00-14.00 晚间:17.00-24.00 周末全天开放

钟灵美广场,群贤楼,颂恩楼,芙蓉湖,情人谷,芙蓉隧道,

建南大礼堂,上弦场,白城校门

15.00 白城沙滩 (1h)

16.00 环岛路 (租自行车)

胡里山炮台(1h),

书法广场,

17.30 曾厝垵 (网红美食,晚饭 18.00左右)

闽台肠粉,五兰沙茶面,三年二班,八婆婆烧仙草,黄则和花生汤

>

音乐广场,

白石炮台,

黄厝沙滩,椰风寨 (可选)

21.30 左右返回宾馆 滴滴打车半小时 (40元)

阅读全文 »

tf.concat中axis的含义与使用

发表于 2019-06-07 | 分类于 tensorflow

tensorflow中tf.concat的axis的使用我一直理解的比较模糊,这次做个笔记理下自己的思路。

1
2
3
import tensorflow as tf
tf.enable_eager_execution()
import numpy as np

先生成两个矩阵m1, 和m2, 大小为两行三列

1
2
3
4
5
6
7
8
m1 = np.random.rand(2,3) # m1.shape (2,3)
m1
>>array([[0.44529968, 0.42451167, 0.07463199],
[0.35787143, 0.22926186, 0.34583839]])
m2 = np.random.rand(2,3) # m2.shape (2,3)
m2
>>array([[0.92811531, 0.6180391 , 0.71969461],
[0.00564108, 0.55381637, 0.17155987]])

接下来采用tf.concat进行连接,简单来说,axis=0实际就是按行拼接,axis=1就是按列拼接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# axis = 0
m3 = tf.concat([m1,m2],axis=0)
m3
>> array([[0.44529968, 0.42451167, 0.07463199],
[0.35787143, 0.22926186, 0.34583839],
[0.92811531, 0.6180391 , 0.71969461],
[0.00564108, 0.55381637, 0.17155987]])
m3.shape
>> (4,3)

# axis = 1
m4 = tf.concat([m1,m2],axis=1)
m4
>>array([[0.44529968, 0.42451167, 0.07463199, 0.92811531, 0.6180391 ,
0.71969461],
[0.35787143, 0.22926186, 0.34583839, 0.00564108, 0.55381637,
0.17155987]])
m4.shape
>>(2,6)

但这实际上这只有在我们的输入是二维矩阵时才可以这样理解。axis的实际含义是根据axis指定的维度进行连接,如矩阵m1的维度为(2,3), 那么axis=0就代表了第一个维度‘2’,因此,将m1和m2按照第一个维度进行连接,得到的新的矩阵就是将第一维度进行相加,其余维度不变,即维度变成了(4,3).

同理,axis=1时就是将矩阵的第二维度进行合并,其余维度不变,即维度变成了(2,6)。

接下来处理三个维度的数据,这也是我们在神经网络数据中经常要用到的,增加的一个维度通常代表了batch_size. 如下面的m5, batch_size=5, 可以理解为每个样本是个2*3的矩阵,一次将5个样本放在一起。

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
27
28
29
30
31
32
m5 = np.random.rand(5,2,3)
m6 = np.random.rand(5,2,3)
m5
>>array([[[0.04347217, 0.03368232, 0.36017024],
[0.74223151, 0.06609717, 0.38155531]],

[[0.50602728, 0.355745 , 0.93379797],
[0.97572621, 0.53745311, 0.66461841]],

[[0.92832972, 0.02441683, 0.48436203],
[0.69651043, 0.24194495, 0.64623769]],

[[0.66667596, 0.60053027, 0.2970753 ],
[0.13281764, 0.29326326, 0.32393028]],

[[0.40892782, 0.48516547, 0.02298178],
[0.51239083, 0.40151008, 0.29913204]]])
m6
>>array([[[0.58001909, 0.56925704, 0.09798246],
[0.20841893, 0.62683633, 0.17923217]],

[[0.91216164, 0.0200782 , 0.3986682 ],
[0.86687006, 0.83730576, 0.48443545]],

[[0.65641654, 0.59786311, 0.2055584 ],
[0.65391822, 0.74093133, 0.02416627]],

[[0.80778861, 0.22644312, 0.91610686],
[0.0789411 , 0.86955002, 0.41437046]],

[[0.97821668, 0.97118328, 0.97714882],
[0.21543173, 0.06964724, 0.35360077]]])

在这种情况下,axis=0代表的第一个维度的含义就不再是之前认为的行的概念了,现在m5的第一维度的值是5,代表的是batch_size。仍然按照之前的理解,如果设置axis=0, axis=0就是将第一维度进行相加,其余维度不变,因此我们可以得到新的维度为(10,2,3)。

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
27
28
29
30
31
32
33
m7 = tf.concat([m5, m6],axis=0)
m7
>> array([[[0.04347217, 0.03368232, 0.36017024],
[0.74223151, 0.06609717, 0.38155531]],

[[0.50602728, 0.355745 , 0.93379797],
[0.97572621, 0.53745311, 0.66461841]],

[[0.92832972, 0.02441683, 0.48436203],
[0.69651043, 0.24194495, 0.64623769]],

[[0.66667596, 0.60053027, 0.2970753 ],
[0.13281764, 0.29326326, 0.32393028]],

[[0.40892782, 0.48516547, 0.02298178],
[0.51239083, 0.40151008, 0.29913204]],

[[0.58001909, 0.56925704, 0.09798246],
[0.20841893, 0.62683633, 0.17923217]],

[[0.91216164, 0.0200782 , 0.3986682 ],
[0.86687006, 0.83730576, 0.48443545]],

[[0.65641654, 0.59786311, 0.2055584 ],
[0.65391822, 0.74093133, 0.02416627]],

[[0.80778861, 0.22644312, 0.91610686],
[0.0789411 , 0.86955002, 0.41437046]],

[[0.97821668, 0.97118328, 0.97714882],
[0.21543173, 0.06964724, 0.35360077]]])
m7.shape
>>(10,2,3)

同理,也可以进行axis=1, axis=2的concat操作。

此外,axis的值也可以设置为负数,如axis=-1实际上就是指倒数第一个维度,如m5的倒数第一个维度的值就是‘3’。因此,axis=2的操作和axis=-1的操作是等价的。

SVM 支持向量机

发表于 2019-06-07 | 分类于 机器学习

通俗来讲,它是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

SVM

SVM的目标函数基本型

函数间隔和几何间隔,假设超平面为$w^Tx+b=0$:

函数间隔:

用$|w^Tx+b|$衡量点x到超平面的远近,若$w^Tx+b$的符号与类标记符号y一致,则分类正确。

因此可以用$y(w^Tx+b)$的正负性判断分类正确性。

定义函数间隔为$r=y(W^Tx+b)$

几何间隔:

点到超平面的距离为$\frac{|w^Tx+b|}{||w||}$

定义几何间隔为$r=\frac{y(w^Tx+b)}{||w||}$

因此,几何间隔实际上相当于函数间隔初上$||w||$

基本型中函数间隔取1,目标函数的最大化几何间隔$2/||w||$, 约束中要满足每个样本的函数间隔大于1.

阅读全文 »

Splunk-SDK-Python学习

发表于 2019-06-07 | 分类于 python

Splunk

最近在公司实习用到了splunk,需要调用splunk sdk进行一些简单的开发,目前把我这个星期的一些体会记录下。

什么是splunk

简单来说,Splunk是一个托管的日志文件管理工具,它的主要功能包括:
· 日志聚合功能
· 搜索功能
· 提取意义
· 对结果进行分组,联合,拆分和格式化
· 可视化功能
· 电子邮件提醒功能
而目前我通过splunk sdk主要实现的功能就是搜索功能,即搜索到我想要的日志。

Splunk SDK for Python

通过Splunk SDK我们可以和Splunk引擎进行交互。Splunk SDK是基于REST API的,因此通过简短的代码实现我们想要的功能。
官方文档:http://dev.splunk.com/python

安装

! 注意, splunk SDK 目前只支持python2,不支持python3.
Ubuntu下安装步骤:

1
2
3
4
5
6
7
sudo apt-get install python-pip //第一步:安装pip工具

pip freeze //查看是否已安装splunk sdk

pip install splunk-sdk //第二步:下载splunk sdk

export PYTHONPATH=~/splunk-sdk-python //添加到python环境变量

模块介绍

主要有4个模块:

  • binding: 基于HTTP的抽象层
  • client: 基于REST API的抽象层,其中Service类是其最重要的类,并且client模块比binding模块有更多的好处。
  • results: 对splunk返回的数据进行处理
  • data: 将Atom Feed data转换为python格式
    目前我主要用到的模块是client和results模块。

与Splunk enterprise建立连接

python2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import splunklib.client as client

HOST = "localhost"
PORT = 8089
USERNAME = "admin"
PASSWORD = "changeme"

# Create a Service instance and log in
service = client.connect(
host=HOST,
port=PORT,
username=USERNAME,
password=PASSWORD)

# Print installed apps to the console to verify login
for app in service.apps:
print app.name

存在的问题:splunk服务器的8089没有打开,因此连接不上
解决:
splunk的服务器是在一个虚拟网络下的,8089端口不对公网开放,因此可以在该网络下另起一个ubuntu虚拟机,然后ubuntu虚拟机通过22端口与请求相连接,收到请求后,由于ubuntu和splunk server是在一个内网中,因此ubuntu虚拟机可以与splunk server的8089端口通信,获得数据后再返回给请求端。

Search的一些术语

  • search query:即查询命令的集合,例如:
    * | head 10```
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    * saved search: 被保存的可以被再次使用的搜索查询。
    * search job:即一次搜索操作的具体实例。
    * Normal search: 异步搜索,能够立刻返回serach job而不用等到结果都搜索完。
    * Blocking search:同步搜索,只有所有搜索全都完成后才返回job.
    * Oneshot: blocking serach,直接返回搜索结果而不是返回job
    ...

    ### 创建一个blocking serach
    与normal search的不同点是blocking search是堵塞的,也就是创建job后不会立刻返回,而是等待所有结果搜索结束后才返回,此时job包含了所有的搜索结果。
    ```python
    # Get the collection of jobs
    jobs = service.jobs

    # Run a blocking search--search everything, return 1st 100 events
    kwargs_blockingsearch = {"exec_mode": "blocking"}
    searchquery_blocking = "search * | head 100"

    print "Wait for the search to finish..."

    # A blocking search returns the job's SID when the search is done
    job = jobs.create(searchquery_blocking, **kwargs_blockingsearch)
    print "...done!\n"

创建一个normal search

normal search 是异步的,即立刻返回job, 但是实际结果并没有返回,因此会存在操作job时没有event返回的情况,我目前的做法是,如果知道大致的搜索时间,则设置一定时间等待后再对job进行操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import splunklib.results as results

# Initialize your service like so
# import splunklib.client as client
# service = client.connect(username="admin", password="changeme")

searchquery_normal = "search * | head 10"
kwargs_normalsearch = {"exec_mode": "normal"}
job = service.jobs.create(searchquery_normal, **kwargs_normalsearch)

# Get the results and display them
for result in results.ResultsReader(job.results()):
print result

job.cancel()

创建一个oneshot search

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import splunklib.results as results

# Run a one-shot search and display the results using the results reader

# Set the parameters for the search:
# - Search everything in a 24-hour time range starting June 19, 12:00pm
# - Display the first 10 results
kwargs_oneshot = {"earliest_time": "2014-06-19T12:00:00.000-07:00",
"latest_time": "2014-06-20T12:00:00.000-07:00"}
searchquery_oneshot = "search * | head 10"

oneshotsearch_results = service.jobs.oneshot(searchquery_oneshot, **kwargs_oneshot)

# Get the results and display them using the ResultsReader
reader = results.ResultsReader(oneshotsearch_results)
for item in reader:
print(item)

…待续

windows下搭建spark环境出现ChangeFileModeByMask error

发表于 2019-06-07 | 分类于 spark

按照

Spark在Windows下的环境搭建

这篇文章搭建spark环境时,处理winutil.exe时遇到了ChangeFileModeByMask error (3): ??????????? 这个问题。

解决办法

在C盘创建tmp/hive文件夹(关键),

然后输入命令行:

1
F:\Program Files\hadoop\bin\winutils.exe chmod 777 C:/tmp/hive

即可。

Python 正则表达式 匹配邮箱地址

发表于 2019-06-07 | 分类于 python
1
2
3
4
5
import re
pat = r'^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$'
email_address = 'ddy_davie@aaa.com'
matched_address = re.match(pat, email_address)
print(matched_address.group())

pat = r’^(\w)+(.\w+)*@(\w)+((.\w+)+)$’ ,

这个正则表达式目前尝试了基本可以覆盖大部分邮箱类型。

我的一些成长经历

发表于 2019-06-07 | 分类于 personal

实习

秋招还在进行中,这次秋招确定的工作也将作为我人生的一个新的阶段了。先说下手上目前已经拿到的offer情况,网易考拉,京东, 网易游戏,携程,银联,vivo, 华为,基本上也就这些了。

我比较想从我的第一次实习开始说起,于我而言,从我找的第一份实习开始到现在,可能会作为一个整体贯穿在我的人生中。

阅读全文 »
12…5
David

David

From Zero to One

45 日志
16 分类
39 标签
© 2019 David 苏ICP备17049163号-2
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4