抽样 拉希里法的变形(Lahiri)

本文探讨Spark 1.3.0版本中KMeans算法的抽样策略,特别是涉及概率计算的部分。通过实例测试解释了如何根据点与中心的距离进行随机抽样的原理,并尝试理解代码中特定随机种子生成方式的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看spark1.3.0 kmeans源码碰到抽样理论问题:下面是摘录的程序注释与关键代码

// On each step, sample 2 * k points on average for each run with probability proportional
// to their squared distance from that run's centers. Note that only distances between points
// and new centers are computed in each iteration.
val rand = new XORShiftRandom(seed ^ (step << 16)^index)
  pointsWithCosts.flatMap { case (p, c) =>
    val rs = (0 until runs).filter { r =>
      rand.nextDouble() < 2.0 * c(r) * k / sumCosts(r)
    }
    if (rs.length > 0) Some(p, rs) else None
  }
}.collect()

对于这句
rand.nextDouble() < 2.0 * c(r) * k / sumCosts(r)
很不理解。
然后我就做了下面的测试,当然测试了很多种——从循环次数到数组的值、数组元素个数及分布形式都作了大范围测试,下面的仅仅是其中之一,但不失为好示例。


import scala.util.Random
  val abf = new ArrayBuffer[Double]
  var r = 0.0
  for (i <- 1 to 4)
  {
    abf += 0.25//
  }
  r = abf.sum//随机数之和
  var j = 0
  val mx = abf.max
  for (t <-1 to 500000;i<- 0 until 4)
    {
      if ( abf(i) > Random.nextDouble()*0.05 )//按照值越大取出的概率越大的策略
        j += 1
    }
  println(j/500000.0)//打印5次中,平均每次取出了几个数
  println(r)//打印随机数之和
  println(mx)

输出结果:
4.0
1.0
0.25

Process finished with exit code 0


这个原理困扰了我近一天的时间,查阅了很多资料,现对上述测试总结如下:

0<y<xi (i=1,2,...N)的概率为xi ,所以对于第i次,j增加1的概率为xi ;

又因为∑xi =1,所以取到的次数为1.

而且满足线性性质:

     (1) 随机数y乘以正因子α,取到的xi 个数为min(1/α,N),Nxi个数

     (2) xi乘以正因子α,取到的xi 个数为1*α

     (3) N的个数没限制,但做实验的次数要高:

          for (t <-to 500000;i<- until 2)

             这里N=2,实验次数为500000


当然你也可以用随机数产生之和为1的数组来做测试。怎么之和为1呢?就是每个随机数除以随机数之和,就可以了。

这里的方法应该是对拉稀里法的扩展,Lahiri法本身没说明这些性质。
相关资料截图及链接:




http://wenku.baidu.com/link?url=BkQBiS_w4F_IxGhook6lf8DD4RWJfaWT3zMwuuPfJH8VT0cKggngjcgGdzSt06OaSI3Y5xYo5AnvuM4Z9_hBUj7Bf7qRLrrIwuNPF2UFPVC
http://www.doc88.com/p-0837238499730.html

然而,我对源码中的
seed ^ (step << 16) ^ index)
并未理解,除了提高速度,更加随机外,左移16位有何考量,index为何不左移?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值