随机游走(Random Walk)算法

随机游走

  • 英文:random walk

  • 定义:随机游走,概念接近于布朗运动,是布朗运动的理想数学状态。

  • 核心概念:任何无规则行走者所带的守恒量都各自对应着一个扩散运输定律。

  • 随机游走算法基本思想是:
    从一个或一系列顶点开始遍历一张图。在任意一个顶点,遍历者将以概率1-a游走到这个顶点的邻居顶点,以概率a随机跳跃到图中的任何一个顶点,称a为跳转发生概率,每次游走后得出一个概率分布,该概率分布刻画了图中每一个顶点被访问到的概率。用这个概率分布作为下一次游走的输入并反复迭代这一过程。当满足一定前提条件时,这个概率分布会趋于收敛。收敛后,即可以得到一个平稳的概率分布。

随机游走过程

一维的随机游走可定义如下: 每过一个单位时间,游走者从数轴位置x出发以固定概率随机向左或向右移动一个单位.
不妨将n时刻游走者的位置记为Ln,则有
在这里插入图片描述
其中X1,X2,…,Xn为相互独立的随机变量,满足
在这里插入图片描述

  • 最经典的一维随机游走问题有赌徒输光问题酒鬼失足问题

(1)赌徒在赌场赌博,赢的概率是p,输的概率1-p,每次的赌注为1元,假设赌徒最开始时有赌金1元,赢了赌金加1元,输了赌金减1元。问赌徒输光的概率是多少?
(2)一个醉鬼行走在一头是悬崖的道路上,酒鬼从距离悬崖仅一步之遥的位置出发,向前一步或向后退一步的概率皆为1/2,问酒鬼失足掉入悬崖的概率是多少?

**

一维有边界的随机游走问题

**

  • 下面先对一维双边界随机游走问题进行求解:
  • 设初始位置为
    x=n,边界为x=0和x=w,其中0<=n<=w,n、w为整数。游走者每个单位时间移动一次,向左、向右移动的概率都为1/2,达到边界后停止移动。

若用Sn表示初始位置为x=n时最终落入边界x=0的概率。显然我们会有S0=1和Sw=0,即初始位置为边界的情况。
若0<n<w,则考虑其下一次移动。有1/2的概率向左到达 n-1,有1/2的概率向右到达n+1。 则由全概率公式可得,
在这里插入图片描述
整理得到
在这里插入图片描述
利用
在这里插入图片描述
可得
在这里插入图片描述
累加法可得,
在这里插入图片描述
由S0=1,Sw=0,可得
在这里插入图片描述
同理,Tn初始位置为x=n时最终落入边界x=w的概率,可得Tn=n/w。 对于单边界情况,可以令w趋于正无穷得到,即可得Sn=1,Tn=0。

  • 40
    点赞
  • 218
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
随机游走算法可以用来进行图像分割,其基本思想是通过在图像中随机游走来确定像素点所属的区域。具体流程如下: 1. 定义随机游走的步长和游走的次数。 2. 随机选择一个像素点作为起点。 3. 从起点开始进行随机游走,每次按照随机方向前进一个步长,并将当前像素点标记为该区域的一部分。 4. 重复进行步骤3指定次数,得到一个区域。 5. 选择另一个未标记的像素点作为起点,重复步骤3-4直到所有像素点都被标记为一个区域。 以下是一个使用随机游走算法进行图像分割的Python示例代码: ```python import numpy as np from PIL import Image def random_walk(image, step_size, num_iterations): """ 随机游走算法 :param image: 待分割的图像,PIL Image对象 :param step_size: 游走的步长 :param num_iterations: 游走的次数 :return: 分割结果,Numpy数组 """ # 将图像转换为灰度图像 gray = image.convert('L') # 获取图像的宽度和高度 width, height = gray.size # 初始化标记矩阵,所有像素点都标记为未访问 visited = np.zeros((height, width), dtype=np.bool) # 初始化分割结果矩阵,所有像素点都标记为0 result = np.zeros((height, width), dtype=np.int) # 定义随机方向数组 directions = [(-1, 0), (0, -1), (1, 0), (0, 1)] # 随机选择一个起点 start_x, start_y = np.random.randint(width), np.random.randint(height) # 重复进行游走,直到所有像素点都被标记为一个区域 while not visited.all(): # 如果当前起点已被访问,则选择另一个起点 if visited[start_y, start_x]: start_x, start_y = np.random.randint(width), np.random.randint(height) continue # 标记当前像素点已被访问 visited[start_y, start_x] = True # 进行随机游走 for i in range(num_iterations): # 随机选择一个方向 dx, dy = directions[np.random.randint(4)] # 计算新的像素点坐标 new_x, new_y = start_x + dx * step_size, start_y + dy * step_size # 如果新的像素点超出图像边界,则选择另一个方向 if new_x < 0 or new_x >= width or new_y < 0 or new_y >= height: continue # 如果新的像素点已被访问,则选择另一个方向 if visited[new_y, new_x]: continue # 标记新的像素点已被访问 visited[new_y, new_x] = True # 将新的像素点标记为当前区域的一部分 result[new_y, new_x] = result[start_y, start_x] # 选择一个未被标记的像素点作为下一个起点 unvisited_indices = np.transpose(np.nonzero(~visited)) if len(unvisited_indices) > 0: start_y, start_x = unvisited_indices[np.random.randint(len(unvisited_indices))] # 选择一个未被标记的区域作为下一个区域的标记 if len(np.unique(result)) == 1: result[start_y, start_x] = 1 else: unvisited_region_indices = np.transpose(np.nonzero(result == 0)) if len(unvisited_region_indices) > 0: result[start_y, start_x] = np.unique(result[unvisited_region_indices])[0] return result # 测试代码 if __name__ == '__main__': # 读取图像文件 image = Image.open('test.jpg') # 进行图像分割 result = random_walk(image, 10, 100) # 将分割结果保存为图像文件 result_image = Image.fromarray((result * 255 / np.max(result)).astype(np.uint8)) result_image.save('result.jpg') ``` 在上述代码中,我们首先将图像转换为灰度图像,并初始化标记矩阵和分割结果矩阵。然后随机选择一个起点,并进行随机游走,将经过的像素点标记为当前区域的一部分,重复进行直到所有像素点都被标记为一个区域。选择下一个起点和下一个区域的标记的方法在代码中有详细的注释。最后将分割结果保存为图像文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunny.T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值