注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

阿弥陀佛

街树飘影未见尘 潭月潜水了无声 般若观照心空静...

 
 
 

日志

 
 
关于我

一直从事气象预报、服务建模实践应用。 注重气象物理场、实况场、地理信息、本体知识库、分布式气象内容管理系统建立。 对Barnes客观分析, 小波,计算神经网络、信任传播、贝叶斯推理、专家系统、网络本体语言有一定体会。 一直使用Java、Delphi、Prolog、SQL编程。

网易考拉推荐

Principal Component Analysis with Breeze (Scala)  

2015-03-08 08:25:09|  分类: breeze |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Principal Component Analysis with Breeze (Scala)
import breeze.linalg._
import java.io.File
import breeze.plot._
import util.Random._

object PCA extends App {

  val dimensions = 500
  val values = 2000
  val data = generateData

  val pcaRes = pca(data, 2)
  println("result pca \n" + pcaRes)

  val f1 = Figure("data")
  val f2 = Figure("pca")
  f1.subplot(0) += scatter(data(::, 0), data(::, 3), { _ => 0.1 })
  f2.subplot(0) += scatter(pcaRes(::, 0), pcaRes(::, 1), { _ => 0.1 })

  private def pca(data: DenseMatrix[Double], components: Int) = {
    val d = zeroMean(data)
    val (_, _, v) = svd(d.t)
    val model = v(0 until components, ::) //top 'components' eigenvectors
    val filter = model.t * model
    filter * d
  }

  private def mean(v: Vector[Double]) = (v.valuesIterator.sum) / v.size

  private def zeroMean(m: DenseMatrix[Double]) = {
    val copy = m.copy
    for (c <- 0 until m.cols) {
      val col = copy(::, c)
      val colMean = mean(col)
      col -= colMean
    }
//    println("data \n" + m)
//    println("mean \n" + copy)
    copy
  }

  //val data= csvread(new File("data.csv"), skipLines = 1).t
  //  val data = DenseMatrix(
  //    (2.0, 4.0, 5.1),
  //    (1.0, 2.5, 3.5),
  //    (8.0, 3.0, 6.4),
  //    (8.0, 5.0, 6.5),
  //    (4.3, 4.5, 6.4))

  private def generateData = {
    val data = DenseMatrix.zeros[Double](values, dimensions)
    for (d <- 0 until dimensions) {
      val c1 = 2 + 2 * (nextDouble - 0.5)
      val r1 = nextDouble * 2
      val c2 = -2 + 2 * (nextDouble - 0.5)
      val r2 = nextDouble * 2
      for (v <- 0 until values / 2) {
        val vv = c1 + r1 * nextDouble
        //      println(f"a:$a b:$b d:$d v:$v vv:$vv%2f")
        data.update(v, d, vv)
      }
      for (v <- values / 2 until values) {
        val vv = c2 + r2 * nextDouble
        //      println(f"a:$a b:$b d:$d v:$v vv:$vv%2f")
        data.update(v, d, vv)
      }
    }
    data
  }
}
  评论这张
 
阅读(330)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017