0%

python机器学习及实践

什么是机器学习

​ 如果一个程序在使用既有的经验(E)执行某类任务(T)的过程中被认定为是“具有学习能力的”,那么它一定需要展现出,利用现有经验(E)不断完善其任务(T)的性能(P)的特质。

机器学习三要素

​ 任务、经验、性能

机器学习类别

监督学习

对未知事物的表现和预测,其主要包括分类问题(classification)和回归问题(regression)

分类问题的缺陷:就是对所有需要预测的类别都是已知的,如果是新的物种我们便无法根据现有经验进行判断

无监督学习

无监督学习倾向于事物本身的特性分析,数据降维(Dimensionality Reduction)和聚类问题(clustering)

为什么使用python作为机器学习的语言

  1. 方便调试的解释型语言

  2. 跨平台作业执行

  3. 广泛的编程应用接口

  4. 丰富完备的工具包

    如 pandas、numpy、scripy、matplotlib、scrikit-learn

Scala 学习笔记

Scala 函数柯里化(Currying)

柯里化(currying)是指将原来接收两个参数的函数变成新的接收一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。

实例

首先我们定义一个函数

1
def add(x:Int,y:Int)=x+y

那么我们应用的时候,应该是这样用:add(1,2)

现在我们把这个函数变一下形:

1
def add(x:Int)(y:Int)=x+y

那么我们应用的时候应该这样用:add(1)(2)最后结果一样都是3,这种方程(过程)就叫错柯里化(currying)

阅读全文 »

SPARK GRAPHX 学习

Pregel的计算模型

Pregel计算模型三要素:

  1. 作用于每个顶点的处理逻辑 vertexProgram
  2. 消息发送,用于相邻节点间的通讯 sendMessage
  3. 消息合并逻辑 messageCombining

Pregel API

​ 图是固有的递归数据结构,因为顶点的属性取决于其邻居的属性,而邻居的属性又取决于邻居的属性。因此,许多重要的图形算法迭代地重新计算每个顶点的属性直到达到一个定点条件。已经提出了一系列图平行抽象来表达这些迭代算法。GraphX公开了Pregel API的变体。

​ 在高层次上,GraphX中的Pregel操作符是一种限制于图形拓扑的批量同步并行消息抽象 。Pregel算子在一系列超级步骤中执行,其中顶点从前一个超级步骤接收入站消息的总和,计算顶点属性的新值,然后在下一个超级步骤中将消息发送到相邻顶点。与Pregel不同,消息作为边三元组的函数并行计算,消息计算可以访问源和目标顶点属性。不接收消息的顶点在超级步骤内跳过。Pregel运算符终止迭代,并在没有剩余消息时返回最终图形。

请注意,与更多标准Pregel实现不同,GraphX中的顶点只能将消息发送到相邻的顶点,并且使用用户定义的消息传递函数并行完成消息构造。这些约束允许在GraphX中进行额外的优化。

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
class GraphOps[VD, ED] {
def pregel[A]
(initialMsg: A,
maxIter: Int = Int.MaxValue,
activeDir: EdgeDirection = EdgeDirection.Out)
(vprog: (VertexId, VD, A) => VD,
sendMsg: EdgeTriplet[VD, ED] => Iterator[(VertexId, A)],
mergeMsg: (A, A) => A)
: Graph[VD, ED] = {
// 为每个顶点初始化消息
var g = mapVertices( (vid, vdata) => vprog(vid, vdata, initialMsg) ).cache()
// 第一次调用消息传递
var messages = g.mapReduceTriplets(sendMsg, mergeMsg)
var activeMessages = messages.count()
// 循环直到没有消息或者达到最大迭代次数
var i = 0
while (activeMessages > 0 && i < maxIterations) {
// 接收消息更新顶点信息
g = g.joinVertices(messages)(vprog).cache()
val oldMessages = messages
// 发送消息, 跳过没有接收到消息的边
// 我们必须缓存消息,以便下次迭代时能够使用到
messages = g.mapReduceTriplets(
sendMsg, mergeMsg, Some((oldMessages, activeDirection))).cache()
activeMessages = messages.count()
i += 1
}
g
}
}

请注意,Pregel有两个参数列表(即,graph.pregel(list1)(list2))。第一个参数列表包含配置参数,包括初始消息,最大迭代次数以及发送消息的边缘方向(默认沿着边缘)。第二个参数列表包含接收消息(顶点程序vprog),计算消息(sendMsg)和组合消息的用户定义函数 mergeMsg

例子-使用Pregel计算最短路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import org.apache.spark.graphx.{Graph, VertexId}
import org.apache.spark.graphx.util.GraphGenerators

// A graph with edge attributes containing distances
val graph: Graph[Long, Double] =
GraphGenerators.logNormalGraph(sc, numVertices = 100).mapEdges(e => e.attr.toDouble)
val sourceId: VertexId = 42 // The ultimate source
// Initialize the graph such that all vertices except the root have distance infinity.
val initialGraph = graph.mapVertices((id, _) =>
if (id == sourceId) 0.0 else Double.PositiveInfinity)
val sssp = initialGraph.pregel(Double.PositiveInfinity)(
(id, dist, newDist) => math.min(dist, newDist), // Vertex Program
triplet => { // Send Message
if (triplet.srcAttr + triplet.attr < triplet.dstAttr) {
Iterator((triplet.dstId, triplet.srcAttr + triplet.attr))
} else {
Iterator.empty
}
},
(a, b) => math.min(a, b) // Merge Message
)
println(sssp.vertices.collect.mkString("\n"))

PageRank 算法

什么是PageRank

PageRank是Google专有的算法,用于衡量特定网页相对于搜索引擎索引中其他网页而言的重要程度。他由Larry Page 和 Sergey Brin在20世纪90年代后期发明。PageRank实现将连接价值作为排名因素。

PageRank的核心思想

”在互联网上,如果一个网页被很多其它网页所链接,说明它受到普遍的承认和依赖,那么它的排名就很高。“ (摘自数学之美第10章)

Spark PageRank代码走读

Spark verison: 2.1

Scala version: 2.11

1
org.apache.spark.graphx.lib.PageRank.scala

hexo常用命令

1
hexo new page "categories"

将生成source/categories目录以及source/categories/index.md

index.md文件内容

1
2
3
title: categories
date: 2017-11-13 21:57:57
type: categories

source下的目录标识一个菜单,需要和跟所选主题配置文件中配置保持一致

1
hexo new "page-name"

在 source/_post/目录下生成page-name.md

page-name.md带有文件头

1
2
3
title: page-name
date: 2017-11-13 21:57:57
categories: "类别1"

会将该内容归入到对应的类别中

1
2
3
4
hexo s 启动本地预览
hexo clean 清空内容
hexo g 生成页面
hexo d 内容发布

命令连续执行可以用 &&

如 hexo clean && hexo g && hexo d

概述

本文主要针对mac OS

我们可能看见过类似于这样的博客

WX20170527-115859

相对于csdn、简书等网站,个人博客更加自由,文章格式排版等能够自定义。程序员更应该搭建一个专属于自己的博客了。

hexo可以基于github打造一套快捷编写以及独特的个人网站

1.创建Github 域名和空间

1.1 注册GitHub账号

注意注册账号后,username必须小写,你的域名将会是 username.github.io(此处不会修改username自行谷歌)

1.2 创建仓库

点击首页任意位置出现的 New repository按钮创建仓库, Respository name 中的username.github.io 的username 一定与前面的Owner 一致,记住你的username下面会用到

WX20170527-124416

2.安装hexo

Hexo 可以说是目前最流行的博客框架了,基于Nodejs,更多信息可以google,下面需要安装的工具包括 Git,Nodejs,Hexo

  1. 安装git

    1
    2
    3
    // 如果已安装HomeBrew 无需执行此行
    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    $ brew install git // 安装Git
  2. 安装Node.js

  3. Homebrew 安装方式,此安装方式无需重启

    1
    2
    3
    4
    $ brew install nvm  
    $ mkdir ~/.nvm
    $ echo "export NVM_DIR=~/.nvm" >> .bash_profile
    $ echo ". $(brew --prefix nvm)/nvm.sh" >> .bash_profile
  4. 重启终端,生效

  5. nvm help 验证nvm是否正确安装
  6. 安装Node.js

    1
    $ nvm install 4
  7. 安装Hexo

1
$ sudo npm install hexo-cli -g

编写博客,发布到线上

接下来通过Hexo初始化博客

创建博客

将命令中的username换成你自己的username,注意和github上username保持一致,执行成功后会创建出一个名为username.github.io的文件夹(/Users/wuming目录下)

1
$ hexo init username.github.io

更改配置

主题

Hexo有更多主题

1
2
$ cd username.github.io
$ git clone https://github.com/iissnan/hexo-theme-next themes/next

基础配置

打开username.github.io的文件夹中的_config.yml文件,修改几个键值对并保存,键值之间之间一定要有空格,否则发布时报错. 更多设置

1
2
3
4
5
6
7
title: dimsky 的 9 维空间    //你博客的名字
author: dimsky //你的名字
language: zh-Hans //语言 中文
theme: next //刚刚安装的主题名称
deploy:
type: git //使用Git 发布
repo: https://github.com/username/username.github.io.git // 刚创建的Github仓库

主题配置
主题配置文件在username.github.io/themes/next/_config.yml中修改。设置详情

3.写文章

在username.github.io/source/_posts下创建你的第一个博客吧,例如,创建一个名为HelloWorld.md的文件,用Markdown大肆发挥吧,注意保存

测试

运行命令后,可以在浏览器中输入https://localhost:4000 访问了,注意关掉全局翻墙哦!

1
2
$ hexo s
安装部署发布工具
1
$ npm install hexo-deployer-git --save

发布

如果是第一次,终端会让输入GitHub的账号和密码,正确输入后,博客会传至GitHub仓库中,进入仓库中查看提交记录,正确提交后,就可以线上进入自己的博客地址啦!

1
$ hexo clean && hexo g && hexo d