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

阿弥陀佛

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

 
 
 

日志

 
 
关于我

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

网易考拉推荐

weka3.7.12 KDTree scala 测试  

2014-05-30 16:04:13|  分类: weka |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
package wekapp
import weka.core.{ EuclideanDistance, Instance, Instances, Attribute, DenseInstance }
import weka.core.neighboursearch.KDTree;
import scala.collection.immutable.SortedMap
import java.util.{ ArrayList }
import models.{ Sta, DbChinaSta }
/**
 * 目的:根据离散站点经纬度,建立KDTree。并:
 * 1. 查询最近站点
 * 2. 查询邻近站点集
 * 何险峰 2014-05-30于成都

实际工作中检验,weka的KDTree,不好用。可能是还不得要领。
 */
object StaKDTree {
  def main(args: Array[String]) {
    val stakdtree = new StaKDTree
    val sid = "56178"
    val s = stakdtree.stadict(sid)
    val f = stakdtree.kNearestNeighbours(s.lon + 0.001, s.lat - 0.01, 5)
    println(f)
  }
}
class StaKDTree {
  val db = DbChinaSta.db
  def stadict = db.stadict
  def staIds = stadict.keySet
  val numSta = staIds.size
  val alon = new Attribute("lon")
  val alat = new Attribute("lat")
  val asta = new Attribute("sta")
  val attrs = mkStruct
  val sta_instances = mkStaInstances

  val distfunc = new EuclideanDistance
  distfunc.setDontNormalize(true)
  distfunc.setAttributeIndices("first-2")
 
  val kdtree = new KDTree()
  kdtree.setDistanceFunction(distfunc)
  kdtree.setInstances(sta_instances)

  def kNearestNeighbours(lon: Double, lat: Double, k: Int) = {
    var ds = SortedMap[Double, String]()
    val inst = mkInstance(lon, lat, 0)
    inst.setDataset(sta_instances)
    val neighbors = kdtree.kNearestNeighbours(inst, k)
    val dists = kdtree.getDistances
    for (i <- 0 until neighbors.size) {
      val n = neighbors.get(i)
      val ss = n.value(asta)
      ds += dists(i) -> ss.toInt.toString
      println(i+","+dists(i)+"->"+ss)
    }
    ds
  }
 
  def nearestNeighbour(lon: Double, lat: Double) = {
    val inst = mkInstance(lon, lat, 0)
    inst.setDataset(sta_instances)
    val neighbor = kdtree.nearestNeighbour(inst)
    val dists = kdtree.getDistances
    dists(0)
  }

  private def mkStaInstances: Instances = {
    val dataset = new Instances("Sta lon lat", attrs, stadict.keySet.size)
    staIds.foreach { id =>
      val s = stadict.get(id).get
      val dat = mkInstance(s.lon, s.lat, s.sta.toDouble)
      dat.setDataset(dataset)
      dataset.add(dat)
    }
    dataset.setClassIndex(attrs.size - 1)
    //ds.compactify()
    dataset
  }
  private def mkStruct = {
    val attrs = new ArrayList[Attribute]()
    attrs.add(alon)
    attrs.add(alat)
    attrs.add(asta)
    attrs
  }

 
  private def mkInstance(lon: Double, lat: Double, sta: Double) = {
    val vals = Array[Double](lon,lat,sta)
    val inst = new DenseInstance(1.0,vals)
    inst
  }
 
/*
  private def mkInstance(lon: Double, lat: Double, sta: Double) = {
    val dat = new DenseInstance(attrs.size)
    dat.setValue(alon, lon)
    dat.setValue(alat, lat)
    dat.setValue(asta, sta)
    dat
  }
  */
}
=============================================================
获取国家站数据
取测站字典....2809
0,0.010049875621122922->56178.0
1,0.48476044599368573->56263.0
2,0.576054172799751->56168.0
3,0.7577852004361091->56273.0
4,0.9225443512373823->56172.0
Map(0.010049875621122922 -> 56178, 0.48476044599368573 -> 56263, 0.576054172799751 -> 56168, 0.7577852004361091 -> 56273, 0.9225443512373823 -> 56172)
  评论这张
 
阅读(430)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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