首页 > 代码库 > Clojure数据分析秘笈 笔记

Clojure数据分析秘笈 笔记

Clojure数据分析秘笈

目录

  • 1导入分析数据
  • 2清洗和校验数据
  • 3使用并发编程管理复杂度
  • 4使用并行编程提高性能
  • 5Cascalog
  • 6使用Incanter数据集
  • 7使用Incanter准备并执行数据分析
  • 8使用Mathematica和R
  • 9聚类、分类和使用Weka
  • 10使用Incanter绘图
  • 11创建网页图表

导入分析数据

  1. $ lein new getting-data
  2. 从CSV
  3. 从JSON
  4. 使用Incanter
  5. 从JDBC
  6. 从XML
    1. 利用zipper浏览XML结构?
    2. ->> 流水线处理
  7. 从网页
    1. 项目依赖:project.clj
      1.  :dependencies [[org.clojure/clojure "1.4.0"] [incanter/incanter-core "1.4.1"] [enlive "1.0.1"]]
    2. (require ...)
    3. (use ‘incanter.core)
    4. (import [java.net URL]) #?这里的require、use、import 3条指令有什么区别?
    5. (let [html ... table (html/select html [:table#data]) headers (->> ...) rows (->> ...) (dataset headers rows)))
      1. 这里的主要html处理工作都在html/select调用上
  8. 读取RDF
  9. 使用SPARQL*

清洗和校验数据

  1. 正则表达式
    1. (def regex1 #"(?x) (\d{3}) ... ")
    2. if-let?
  2. 同义词
  3. 去重 (defn fuzzy= ...
    1. <= 这个指令是干嘛用的?忘了
  4. 标准化数字格式
  5. 调整词频
  6. 标准化日期和时间
    1. clj-time库?(对Joda的封装)
    2. (defprotocol ToFormatter (->formatter [fmt]))
    3. (extend-protocol ToFormatter ...)
  7. 大数据集的延迟处理
    1. lazy ...
  8. 抽样
    1. (defn range-from [x] (partial + x) (range)))
  9. 修正拼写错误
    1. 训练?编辑距离=1 or 2
    2. correct选出频率最高的
  10. 解析自定义格式
    1. (defn nl [] (chr-in #{\newline \return}))
    2. <|函数?
  11. Valip校验(DSL?)

使用并发编程管理复杂度

  1. STM
    1. (def total-hu (ref 0)) ;deref或@
    2. (dosync ...
    3. (doall (->> (lazy-read-csv data-file) with-header ... (float (/ @total-hu ...
  2. agent
    1. (def sums (agent 0)) --> (send sums + 4) --> @sums => 4
    2. (defn force-val [a] (await a) @a)
  3. commute
    1. 将更新操作加入队列,待引用未被占用时再执行:(dosync (commute total-hu #(+ sum-hu %)) ...
  4. 将agent和STM结合*
    1. (defn get-thunk [data-ref] (dosync (when-let [[s & ss] (seq @data-ref)] (ref-set data-ref ss) s)))
  5. ensure*
  6. 将安全的副作用引入STM*
    1. (defn debug! [msg] (io! (print (str msg \newline)) (.flush *out*)))
  7. validator:(set-validator! a v)
  8. watcher:(add-watch a :counter w)
  9. 从agent中错误恢复:
    1. set-error-mode! :fail/:continue
    2. set-error-handler!
  10. sized queue
    1. (take 20 (seque 5 (range Integer/MAX_VALUE)))

使用并行编程提高性能

  1. pmap
  2. Incanter
  3. 使用蒙特卡罗模拟划分使得pmap性能提升
  4. 使用模拟退火最优化分块大小
  5. reducers
    1. 如果是Java1.6需要ForkJoin库:[org.codehaus.jsr166-mirror/jsr166y "1.7.0"]
    2. (defn count-in-circle-r [n] (->>
      1. (repeatedly n rand-input)
      2. vec (r/map center-dist) (r/filter #(<= % 1.0)) (r/fold + count-items)))
  6. OpenCL和Calx
    1. 编译C代码???
    2. (defn -main [] ... (with-cl (with-program ... (let [out-seq (vec @(enqueue-read out))] ...
  7. 类型提示
    1. (defn mc-pi-hint (^double [n] ...
  8. Criterium基准
    1. (use ‘criterium.core) --> time / bench

Cascalog

  1. (?<- (stdout) (?name) (full-name _ ?name)) 基于实例的查询?IBQ
  2. 定义新操作符:defmapop defmapcatop deffilterop defbufferop defaggregateop ...
  3. 使用Pallet在EC2上执行查询*

使用Incanter数据集

  1. $选择列/行 ?
  2. $where
  3. $group-by
  4. $join

使用Incanter准备并执行数据分析

  1. $rollup
  2. 使用Zoo处理时间序列
  3. bootstrapping

使用Mathematica和R

  1. Clojuratica?怎么连接的(哦,Mathematica提供了Java接口!)
    1. FindRoot[{Exp[x-2] == y, y^2==x}, {{x,1}, {y,1}}]
    2. => (math (FindRoot [(==(Exp (- x 2)) y) (== (Power y 2) x)] [[x 1] [y 1]]))
  2. REngine/Rserve

聚类、分类和使用Weka

  1. ARFF格式数据?
  2. 层次聚类
  3. SOM聚类
  4. 决策树分类:(defanalysis j48 J48 buildClassifier [... options ...])
  5. 朴素贝叶斯
  6. SVM
  7. Apriori查找关联

使用Incanter绘图

创建网页图表

  1. Ring和Compojure
  2. Hiccup
  3. ClojureScript
  4. NVD3
  5. 力向布局(?)
  6. D3 

Clojure数据分析秘笈 笔记