随机算法

几种随机算法的实现原理

瘦欲@ 提交于 2020-02-14 00:17:03
转自:http://www.androidstar.cn/%E5%87%A0%E7%A7%8D%E9%9A%8F%E6%9C%BA%E7%AE%97%E6%B3%95%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86/   在日常工作中,经常需要使用随机算法。比如面对大量的数据, 需要从其中随机选取一些数据来做分析。 又如在得到某个分数后, 为了增加随机性, 需要在该分数的基础上, 添加一个 扰动 , 并使该扰动 服从特定的概率分布 ( 伪随机 )。本文主要从这两个方面出发, 介绍一些算法, 供大家参考。   首先假设我们有一个使用的随机函数float frand(), 返回值在(0, 1)上均匀分布。大多数的程序语言库提供这样的函数。 在其他的语言如C/C++中, 可以通过间接方法得到。如 frand()= ((float)rand() ) / RAND_MAX; 1, 随机选取数据   假设我们有一个集合A(a_1,…,a_n), 对于数m,0≤m≤n, 如何从集合A中 等概率地 选取m个元素呢?   通过计算古典概率公式可以得到, 每个元素被选取的概率为m/n。 如果集合A里面的元素本来就具有随机性, 每个元素在各个位置上出现的概率相等, 并且只在A上选取一次数据,那么直接返回A的前面m个元素就可以了,

【Machine Learning in Action --5】逻辑回归(LogisticRegression)

邮差的信 提交于 2020-02-13 20:49:53
1、概述   Logistic regression(逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性。   在经典之作《数学之美》中也看到了它用于广告预测,也就是根据某广告被用 户点击的可能性,把最可能被用户点击的广告摆在用户能看到的地方,然后叫他“你点我啊!”用户点了,你就有钱收了。这就是为什么我们的电脑现在广告泛滥的 原因。还有类似的某用户购买某商品的可能性,某病人患有某种疾病的可能性啊等等。这个世界是随机的(当然了,人为的确定性系统除外,但也有可能有噪声或产生错误的结果,只是这个错误发生的可能性太小了,小到千万年不遇,小到忽略不计而已),所以万物的发生都可以用可能性或者几率(Odds)来表达。“几率”指的是某事物发生的可能性与不发生的可能性的比值。 Logistic regression可以用来回归,也可以用来分类,主要是二分类。 2、基本理论 2.1Logistic regression和Sigmoid函数   回归:假设现在有一些数据点,我们用一条直线对这些点进行拟合(该条称为最佳拟合直线),这个拟合过程就称作回归。利用Logistic回归进行分类的思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归”一词源于最佳拟合,表示找到最佳拟合参数,使用的是最优化算法。   Sigmoid函数具体的计算公式如下:         z=w

随机采样方法整理与讲解(MCMC、Gibbs Sampling等)

拟墨画扇 提交于 2020-02-11 20:02:39
http://www.tuicool.com/articles/fqEf6f 本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅。其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!PRML的第11章也是sampling,有时间后面写到PRML的笔记中去:) 背景 随机模拟也可以叫做蒙特卡罗模拟(Monte Carlo Simulation)。这个方法的发展始于20世纪40年代,和原子弹制造的曼哈顿计划密切相关,当时的几个大牛,包括乌拉姆、冯.诺依曼、费米、费曼、Nicholas Metropolis, 在美国洛斯阿拉莫斯国家实验室研究裂变物质的中子连锁反应的时候,开始使用统计模拟的方法,并在最早的计算机上进行编程实现。[3] 随机模拟中有一个重要的问题就是给定一个概率分布 p ( x ) ,我们如何在计算机中生成它的样本。一般而言均匀分布 U n i f o r m ( 0 , 1 ) 的样本是相对容易生成的。 通过线性同余发生器可以生成伪随机数,我们用确定性算法生成 [ 0 , 1 ] 之间的伪随机数序列后,这些序列的各种统计指标和均匀分布 U n i f o r m ( 0 , 1 ) 的理论计算结果非常接近。这样的伪随机序列就有比较好的统计性质,可以被当成真实的随机数使用。 下面总结这么几点: 1、蒙特卡洛数值积分 2、均匀分布

MATLAB数学建模:智能优化算法-遗传算法

让人想犯罪 __ 提交于 2020-02-07 02:55:58
遗传算法 遗传算法是模拟自然界生物进化机制进行迭代优化的算法. 它通过模拟"适者生存, 优胜劣汰" 的法则, 在所有可能的解决方法中找出最符合该问题所要求的条件的解决办法. 文章目录 遗传算法 1. 基本原理 1.1 选择 1.2 交叉 1.3 变异 1.4 终止条件 2. 程序设计 1. 基本原理 在遗传算法中, 通过编码组成初始群体后, 遗传操作的任务就是通过对群体中的每个个体进行适应度评评估进而进行筛选, 从而实现"优胜劣汰"的"进化"过程. 从优化搜索的角度而言, 遗传操作可使问题的解一代代地优化, 从而逼近最优解. 遗传算法包含三个基本遗传算子(genetic operator): 选择, 交叉和变异. 需要注意的是, 虽然个体遗传算子的操作都是在随机扰动的情况下进行的, 但这种随机化操作和传统的随机搜索方法存在差别: 遗传操作所进行的是高效有向的搜索. 遗传操作的效果和上述三个遗传算子所取的操作概率, 编码方法, 群体大小, 初始群体和适应度函数的设定密切相关. 1.1 选择 我们称"从群体中选择优胜的个体, 淘汰劣质的个体"的操作为 选择 . 选择算子又称再生算子. 选择操作建立在群体中个体的适应度评估之上. 目前常用的选择算子有: 适应度比例法 , 随机遍历抽样法 , 局部选择法 . 轮盘赌选择法 是最简单最常用的选择法. 在该方法中,

Python决策树与随机森林简述

孤人 提交于 2020-02-07 00:24:30
关于决策树和随机森林的一些小知识我会在后面陆续更新 决策树属于经典的十大数据分析与挖掘,是一种类似流程图的树结构,其规则就是IF…THE…的思想,可以用于数值型因变量的预测和离散型因变量的分类。该算法简单直观、通俗易懂,不需要研究者掌握任何领域知识或数学推理。而且算法的结果输出具有很强的解释性。通常情况下,将决策树用作很好的预测准确率。 来源: CSDN 作者: Zhongxin#c 链接: https://blog.csdn.net/qq_44852536/article/details/104201215

【转】抢红包算法

≯℡__Kan透↙ 提交于 2020-02-07 00:09:46
发出一个固定金额的红包,由若干个人来抢,需要满足哪些规则? 1. 所有人抢到金额之和等于红包金额,不能超过,也不能少于。 2. 每个人至少抢到一分钱。 3. 要保证所有人抢到金额的几率相等。 小灰的思路是什么样呢? 每次抢到的金额 = 随机区间 ( 0, 剩余金额 ) 为什么这么说呢?让我们看一个栗子: 假设有 10 个人,红包总额 100 元。 第一个人的随机范围是 ( 0 , 100 元 ) ,平均可以抢到 50 元 。 假设第一个人随机到 50 元,那么剩余金额是 100-50 = 50 元。 第二个人的随机范围是 ( 0 , 50 元) ,平均可以抢到 25 元 。 假设第二个人随机到 25 元,那么剩余金额是 50-25 = 25 元。 第三个人的随机范围是 ( 0 , 25 元) ,平均可以抢到 12.5 元 。 以此类推,每一次随机范围越来越小。 方法 1 :二倍均值法 剩余红包金额为 M ,剩余人数为 N ,那么有如下公式: 每次抢到的金额 = 随机区间 ( 0 , M / N X 2 ) 这个公式,保证了 每次随机金额的平均值是相等的 ,不会因为抢红包的先后顺序而造成不公平。 举个栗子: 假设有 10 个人,红包总额 100 元。 100/10X2 = 20, 所以第一个人的随机范围是 ( 0 , 20 ) ,平均可以抢到 10 元 。 假设第一个人随机到 10

【转载】C&C控制服务的设计和侦测方法综述

不羁的心 提交于 2020-02-04 14:09:31
作者:转载 时间:2017-11-08 这篇文章总结了一些我在安全工作里见到过的千奇百怪的C&C控制服务器的设计方法以及对应的侦测方法,在每个C&C控制服务先介绍黑帽部分即针对不同目的的C&C服务器设计方法,再介绍白帽部分即相关侦测办法,大家来感受一下西方的那一套。这里的白帽部分有一部分侦测方法需要一些数据和统计知识,我也顺便从原理上简单讨论了一下用数据进行安全分析的方法,从数学和数据原理上思考为什么这么做,可以当作数据科学在安全领域的一些例子学习一下。 0x00 什么是C&C服务器 C&C服务器(又称CNC服务器)也就是 Command & Control Server,一般是指挥控制僵尸网络botnet的主控服务器,用来和僵尸网络的每个感染了恶意软件(malware)的宿主机进行通讯并指挥它们的攻击行为。每个malware的实例通过和它的C&C服务器通讯获得指令进行攻击活动,包括获取DDoS攻击开始的时间和目标,上传从宿主机偷窃的到的信息,定时给感染机文件加密勒索等。 为什么malware需要主动和C&C服务通讯?因为多数情况下malware是通过钓鱼邮件啊等方法下载到感染宿主机,攻击者并不能主动得知malware被谁下载,也不能主动得知宿主机的状态(是否开机是否联网等),除非malware主动告诉他,所以malware都会内置一套寻找C&C主控服务器的方法以保持和C

机器学习实战(五)逻辑回归实战篇之预测病马死亡率 (Peter Harrington著)

风格不统一 提交于 2020-02-02 07:51:07
一 前言 本文对梯度上升算法和改进的随机梯度上升算法进行了对比,总结了各自的优缺点,并对sklearn.linear_model.LogisticRegression进行了详细介绍。 二 改进的随机梯度上升算法 梯度上升算法在每次更新回归系数(最优参数)时,都需要遍历整个数据集。可以看一下我们之前写的梯度上升算法: def gradAscent(dataMatIn, classLabels): dataMatrix = np.mat(dataMatIn) #转换成numpy的mat labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置 m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。 alpha = 0.01 #移动步长,也就是学习速率,控制更新的幅度。 maxCycles = 500 #最大迭代次数 weights = np.ones((n,1)) for k in range(maxCycles): h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式 error = labelMat - h weights = weights + alpha * dataMatrix.transpose() * error

在矩形范围内种怪的算法问题

牧云@^-^@ 提交于 2020-01-31 05:07:53
今天在工作中遇到这样一个问题:给定1个矩形,左下角的点point(x, y),长w,高h,要在这个矩形里随机出n个不同的点用来种怪。这个算法该怎么写呢?这对于我来说确实成为了一个问题。图示如下: 由于任务时间紧,做的又是Demo的原因,我不假思索的写出了下面这个算法: //从[from, to]区间中随机一个整数 function randomInt (from, to) { //方法实现就不写了 }function randomCoords (point, w, h, n) { //目的数组 var coords = []; var map = {}; var count = n; if ((w + 1) * (h + 1) < n) { count = (w + 1) * (h + 1); } while (count > 0) { var x = randomInt(point.x, point.x + w); var y = randomInt(point.y, point.y + h); //已经随机出该点,就丢掉 if (map[x] && map[x][y]) continue; if (!map[x]) map[x] = {}; map[x][y] = true; coords.push({x:x, y:y}); count --; } return coords;

随机算法-java实现

百般思念 提交于 2020-01-26 19:49:28
**该随机算法可以实现权重随机也可以做一般随机抽奖。业务需求来源是有100个病人,按照1:1的比例进行随机分配到两个组里。** 算法:1 根据proportionMap分组,每个分组有最大和最小值 * 2 取随机数,看随机数落到哪个范围内就是哪个分组 * 3 如果分组数达到sum*weight,则进行满桶处理并且重复第二步直到成功分组。 * 目前用fullHandler方法进行满桶处理,getOverdueRandom方法有栈溢出风险,尽管风险很低(风险随着桶的数量和总数增加而增加)。 import java . math . BigDecimal ; import java . security . NoSuchAlgorithmException ; import java . security . SecureRandom ; import java . util . * ; /** * 随机算法工具 */ public class RandomizeUtil { private RandomizeUtil ( ) { } /** * 获取随机列表 * @param sum * @param proportionMap * @return */ public static List < Long > getRandomizeList ( int sum , Map <