‘壹’ 多层次渐进式空间采样网络体系设计
结合区位论、空间插值、智能空间推理等知识,多层次渐进式空间采样网络体系主要包括多层次渐进式空间采样网络框架设计、最优样本量获取、采样样点布设等几个方面。
( 一) 多层次渐进式空间采样网络框架设计
当前空间采样网络设计主要包括基于模型的方法和基于设计的方法。基于模型的方法主要采用统计学中采样模型、优化模型等,运用采样网络设计规则 ( 包括克里金方差最小原则、WM 原则等) 自动生成采样网络; 基于设计的方法则主要依据专家对研究区域的先验知识,人工布设采样样点形成采样网络。两种方法均存在一定的不足,基于模型的方法存在一定的不稳定性,基于设计的方法则受专家主观意识的影响。基于此,本研究提出多层次渐进式空间采样网络框架设计技术,集合了基于模型方法和基于设计方法各自的优点,旨在消除采样网络设计过程中客观不确定性和主观不一致性的影响,使得采样网络客观反映研究区的区域特征,提高采样和监测精度。
多层次渐进式空间采样网络框架设计技术充分考虑了研究区存在监测样点布局和不存在监测样点布局两种情况,首先基于采样模型自动计算最优样本量并完成样点布设,然后根据专家的先验知识以及空间采样数据对采样网络进行优化,剔除异常点,从而提高采样精度和效率。
( 二) 最优样本量获取
在总体中抽出一定量的样本,用所抽样本的均值与方差能较好地估计总体的均值与方差,即抽取样本的均值具有足够的精度和较大概率近似于总体均值。
当所研究的属性在统计学上具有正态分布特征时,可构造统计量公式,在专家指导下( 包括专家对于研究区的先验知识和预采样数据等) 推导出采样需要置信限下的合理采样数:
退化废弃地遥感信息提取研究
式中:η为采样精度;μ为总体均值;σ为标准差;xn为第n个采样点。
上述样本量为指定采样精度下的最小样本量,从而既保证了采样精度,又提高了采样效率。
(三)采样样点布设
传统的空间采样网络设计较多依靠专家对研究区以及监测指标的先验知识,按着一定的布点方法人工确定样点布局,常用的布点方法包括功能区布点法和几何图形布点法,其中几何图形布点法包括网格布点法、同心圆布点法和扇形布点法。随着抽样理论和地统计学理论的发展,简单随机抽样模型、系统抽样模型和分层抽样模型等抽样模型被广泛应用。
1.简单随机抽样
简单随机抽样是指从总体N个单位中任意抽取n个单位作为样本,使每个可能的样本被抽中的概率相等。简单随机抽样分为重复抽样和不重复抽样。在重复抽样中,每次抽中的单位仍放回总体,样本中的单位可能不止一次被抽中;不重复抽样中,抽中的单位不再放回总体,样本中的单位只能抽中一次。简单随机抽样的具体方法包括抽签法和随机数字表法。
2.系统抽样
系统抽样是纯随机抽样的变种,先将总体从1~N相继编号,并计算抽样距离K=N/n(N为总体单位总数,n为样本容量),然后在1~K中抽一随机数k1作为样本的第一个单位,接着取k1+K,k1+2K,…,直至抽够n个单位为止。系统抽样要防止周期性偏差,因为其会降低样本的代表性。
3.分层抽样
又称分类抽样或类型抽样,先将总体的单位按某种特征分为若干次级总体(层),然后再从每一层内进行单纯随机抽样,组成一个样本。将总体划分为若干个同质层,再在各层内随机抽样或系统抽样,分层抽样的特点是将科学分组法与抽样法结合在一起,分组减小了各抽样层变异性的影响,抽样保证了所抽取的样本具有足够的代表性。
分层抽样根据在同质层内抽样的方式不同,又可分为一般分层抽样和分层比例抽样,一般分层抽样是根据样品变异性大小来确定各层的样本容量,变异性大的层多抽样,变异性小的层少抽样,在事先并不知道样品变异性大小的情况下,通常多采用分层比例抽样。
分层抽样比单纯随机抽样所得到的结果准确性更强,组织管理更方便,而且能保证总体中每一层都有个体被抽到。这样除了能估计总体的参数值,还可以分别估计各个层内的情况,因此分层抽样技术常被采用。
将上述模型应用到空间采样领域,通过引入空间相关系数表征样点之间的空间结构性,结合传统采样模型动态计算最优样本量并进行样点布设,通过专家的指导对布设的样点进行优化,从而使样点布局与指标空间结构基本吻合,提高了采样精度。
‘贰’ 想做一份调查问卷,样本量应该取多少
按照每个学校30-50份答卷来取就可以了,如果有5个学校,大概到150-200份就足够了。30份是一个底限,如果你有足够的预算,多些样本也不错
‘叁’ BP神经网络的训练集需要大样本吗一般样本个数为多少
BP神经网络的训练集需要大样本吗?一般样本个数为多少?
BP神经网络样本数有什么影响
学习神经网络这段时间,有一个疑问,BP神经网络中训练的次数指的网络的迭代次数,如果有a个样本,每个样本训练次数n,则网络一共迭代an次,在n>>a 情况下 , 网络在不停的调整权值,减小误差,跟样本数似乎关系不大。而且,a大了的话训练时间必然会变长。
换一种说法,将你的数据集看成一个固定值, 那么样本集与测试集 也可以按照某种规格确定下来如7:3 所以如何看待 样本集的多少与训练结果呢? 或者说怎么使你的网络更加稳定,更加符合你的所需 。
我尝试从之前的一个例子中看下区别
如何用70行Java代码实现深度神经网络算法
作者其实是实现了一个BP神经网络 ,不多说,看最后的例子
一个运用神经网络的例子
最后我们找个简单例子来看看神经网络神奇的效果。为了方便观察数据分布,我们选用一个二维坐标的数据,下面共有4个数据,方块代表数据的类型为1,三角代表数据的类型为0,可以看到属于方块类型的数据有(1,2)和(2,1),属于三角类型的数据有(1,1),(2,2),现在问题是需要在平面上将4个数据分成1和0两类,并以此来预测新的数据的类型。
图片描述
我们可以运用逻辑回归算法来解决上面的分类问题,但是逻辑回归得到一个线性的直线做为分界线,可以看到上面的红线无论怎么摆放,总是有一个样本被错误地划分到不同类型中,所以对于上面的数据,仅仅一条直线不能很正确地划分他们的分类,如果我们运用神经网络算法,可以得到下图的分类效果,相当于多条直线求并集来划分空间,这样准确性更高。
图片描述
简单粗暴,用作者的代码运行后 训练5000次 。根据训练结果来预测一条新数据的分类(3,1)
预测值 (3,1)的结果跟(1,2)(2,1)属于一类 属于正方形
这时如果我们去掉 2个样本,则样本输入变成如下
//设置样本数据,对应上面的4个二维坐标数据
double[][] data = new double[][]{{1,2},{2,2}};
//设置目标数据,对应4个坐标数据的分类
double[][] target = new double[][]{{1,0},{0,1}};
1
2
3
4
1
2
3
4
则(3,1)结果变成了三角形,
如果你选前两个点 你会发现直接一条中间线就可以区分 这时候的你的结果跟之前4个点时有区别 so 你得增加样本 直到这些样本按照你所想要的方式分类 ,所以样本的多少 重要性体现在,样本得能反映所有的特征值(也就是输入值) ,样本多少或者特征(本例子指点的位置特征)决定的你的网络的训练结果,!!!这是 我们反推出来的结果 。这里距离深度学习好像近了一步。
另外,这个70行代码的神经网络没有保存你训练的网络 ,所以你每次运行都是重新训练的网络。其实,在你训练过后 权值已经确定了下来,我们确定网络也就是根据权值,so只要把训练后的权值保存下来,将需要分类的数据按照这种权值带入网络,即可得到输出值,也就是一旦网络确定, 权值也就确定,一个输入对应一个固定的输出,不会再次改变!个人见解。
最后附上作者的源码,作者的文章见开头链接
下面的实现程序BpDeep.java可以直接拿去使用,
import java.util.Random;
public class BpDeep{
public double[][] layer;//神经网络各层节点
public double[][] layerErr;//神经网络各节点误差
public double[][][] layer_weight;//各层节点权重
public double[][][] layer_weight_delta;//各层节点权重动量
public double mobp;//动量系数
public double rate;//学习系数
public BpDeep(int[] layernum, double rate, double mobp){
this.mobp = mobp;
this.rate = rate;
layer = new double[layernum.length][];
layerErr = new double[layernum.length][];
layer_weight = new double[layernum.length][][];
layer_weight_delta = new double[layernum.length][][];
Random random = new Random();
for(int l=0;l<layernum.length;l++){
layer[l]=new double[layernum[l]];
layerErr[l]=new double[layernum[l]];
if(l+1<layernum.length){
layer_weight[l]=new double[layernum[l]+1][layernum[l+1]];
layer_weight_delta[l]=new double[layernum[l]+1][layernum[l+1]];
for(int j=0;j<layernum[l]+1;j++)
for(int i=0;i<layernum[l+1];i++)
layer_weight[l][j][i]=random.nextDouble();//随机初始化权重
}
}
}
//逐层向前计算输出
public double[] computeOut(double[] in){
for(int l=1;l<layer.length;l++){
for(int j=0;j<layer[l].length;j++){
double z=layer_weight[l-1][layer[l-1].length][j];
for(int i=0;i<layer[l-1].length;i++){
layer[l-1][i]=l==1?in[i]:layer[l-1][i];
z+=layer_weight[l-1][i][j]*layer[l-1][i];
}
layer[l][j]=1/(1+Math.exp(-z));
}
}
return layer[layer.length-1];
}
//逐层反向计算误差并修改权重
public void updateWeight(double[] tar){
int l=layer.length-1;
for(int j=0;j<layerErr[l].length;j++)
layerErr[l][j]=layer[l][j]*(1-layer[l][j])*(tar[j]-layer[l][j]);
while(l-->0){
for(int j=0;j<layerErr[l].length;j++){
double z = 0.0;
for(int i=0;i<layerErr[l+1].length;i++){
z=z+l>0?layerErr[l+1][i]*layer_weight[l][j][i]:0;
layer_weight_delta[l][j][i]= mobp*layer_weight_delta[l][j][i]+rate*layerErr[l+1][i]*layer[l][j];//隐含层动量调整
layer_weight[l][j][i]+=layer_weight_delta[l][j][i];//隐含层权重调整
if(j==layerErr[l].length-1){
layer_weight_delta[l][j+1][i]= mobp*layer_weight_delta[l][j+1][i]+rate*layerErr[l+1][i];//截距动量调整
layer_weight[l][j+1][i]+=layer_weight_delta[l][j+1][i];//截距权重调整
}
}
layerErr[l][j]=z*layer[l][j]*(1-layer[l][j]);//记录误差
}
}
}
public void train(double[] in, double[] tar){
double[] out = computeOut(in);
updateWeight(tar);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
下面是这个测试程序BpDeepTest.java的源码:
import java.util.Arrays;
public class BpDeepTest{
public static void main(String[] args){
//初始化神经网络的基本配置
//第一个参数是一个整型数组,表示神经网络的层数和每层节点数,比如{3,10,10,10,10,2}表示输入层是3个节点,输出层是2个节点,中间有4层隐含层,每层10个节点
//第二个参数是学习步长,第三个参数是动量系数
BpDeep bp = new BpDeep(new int[]{2,10,2}, 0.15, 0.8);
//设置样本数据,对应上面的4个二维坐标数据
double[][] data = new double[][]{{1,2},{2,2},{1,1},{2,1}};
//设置目标数据,对应4个坐标数据的分类
double[][] target = new double[][]{{1,0},{0,1},{0,1},{1,0}};
//迭代训练5000次
for(int n=0;n<5000;n++)
for(int i=0;i<data.length;i++)
bp.train(data[i], target[i]);
//根据训练结果来检验样本数据
for(int j=0;j<data.length;j++){
double[] result = bp.computeOut(data[j]);
System.out.println(Arrays.toString(data[j])+":"+Arrays.toString(result));
}
//根据训练结果来预测一条新数据的分类
double[] x = new double[]{3,1};
double[] result = bp.computeOut(x);
System.out.println(Arrays.toString(x)+":"+Arrays.toString(result));
}
}
‘肆’ 残差网络
残差网络(Resial Network简称ResNet)是在2015年继Alexnet Googlenet VGG三个经典的CNN网络之后提出的,并在ImageNet比赛classification任务上拔得头筹,ResNet因其简单又实用的优点,现已在检测,分割,识别等领域被广泛的应用。
ResNet可以说是过去几年中计算机视觉和深度学习领域最具开创性的工作,有效的解决了随着网络的加深,出现了训练集准确率下降的问题,如下图所示:
做过深度学习的同学应该都知道,随着网络层数的增加而导致训练效果变差的一个原因是梯度弥散和梯度爆炸问题(vanishing/exploding gradients),这个问题抑制了浅层网络参数的收敛。但是这个问题已经通过一些参数初始化的技术较好的解决了,有兴趣的同学可以看参考文献中的以下几篇文章:[2][3][4][5][6]。
但是即便如此,在网络深度较高的时候(例如图中的56层网络)任然会出现效果变差的问题,我们在先前的Alexnet Googlenet VGG三个模型中可以看出,网络的深度在图片的识别中有着至关重要的作用,深度越深能自动学习到的不同层次的特征可能就越多,那到底是什么原因导致了效果变差呢?
Fig. 3
左侧19层的VGG模型的计算量是 19.6 billion FLOPs 中间是34层的普通卷积网络计算量是3.6 billion FLOPs。
右边是34层的ResNet计算量是3.6billion FLOPs,图中实线的箭头是没有维度变化的直接映射,虚线是有维度变化的映射。通过对比可以看出VGG虽然层数不多但是计算量还是很大的,后面我们可以通过实验数据看到34层的ResNet的表现会比19层的更好。
从图中可以看出在效果上,34层的残差网络比VGG和GoogleNet都要好,A,B,C三种方案中C方案效果最好,但是B,C方案在计算量上比A方案要大很多,而效果提升的又很少,所以论文作者建议还是使用A方案较为实用。
下面我们介绍层数在50及以上的残差网络的结构: Deeper Bottleneck Architectures。这种结构是作者为了降低训练时间所设计的,结构对比如下图所示:
ResNet通过残差学习解决了深度网络的退化问题,让我们可以训练出更深的网络,这称得上是深度网络的一个历史大突破吧。也许不久会有更好的方式来训练更深的网络,让我们一起期待吧!
目前,您可以在 人工智能建模平台 Mo 找到基于tensorflow 的34层的残差网络(ResNet)实现样例,数据集是CIFAR-10 (CIFAR的十分类数据集),这个样例在测试集上的精度为90%,验证集上的精度为98%。主程序在ResNet_Operator.py中,网络的Block结构在ResNet_Block.py中,训练完的模型保存在results文件夹中。
项目源码地址: http://momodel.cn/explore/5d1b0a031afd944132a0797d?type=app
参考文献:
[1] _K. He, X. Zhang, S. Ren, and J. Sun. Deep resial learning for image recognition. arXiv preprint arXiv:1512.03385,2015.
[2] Y. LeCun, L. Bottou, G. B. Orr, and K.-R.M¨uller. Efficient backprop.In Neural Networks: Tricks of the Trade, pages 9–50. Springer, 1998.
[3] X. Glorot and Y. Bengio. Understanding the difficulty of training deep feedforward neural networks. In AISTATS, 2010.
[4] A. M. Saxe, J. L. McClelland, and S. Ganguli. Exact solutions to the nonlinear dynamics of learning in deep linear neural networks.arXiv:1312.6120, 2013.
[5] K. He, X. Zhang, S. Ren, and J. Sun. Delving deep into rectifiers:Surpassing human-level performance on imagenet classification. In ICCV, 2015.
[6] S. Ioffe and C. Szegedy. Batch normalization: Accelerating deep network training by recing internal covariate shift. In ICML, 2015.
Mo (网址: momodel.cn )是一个支持 Python 的 人工智能在线建模平台 ,能帮助你快速开发、训练并部署模型。
Mo 人工智能俱乐部 是由网站的研发与产品设计团队发起、致力于降低人工智能开发与使用门槛的俱乐部。团队具备大数据处理分析、可视化与数据建模经验,已承担多领域智能项目,具备从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析与人工智能技术,并以此来促进数据驱动的科学研究。
‘伍’ 人工神经网络分析需要样本量一般多大
1.样本量的确定是费用与精度的函数,取决于研究的精度和费用,特别是实践中费用考虑的更多!
2.抽样调查,特别是随机抽样,样本有代表性,往往比普查更有效率,甚至精度更高,这里我们主要计算和讨论抽样误差,非抽样误差是人为因素,考质量控制;
3.样本量的确定有赖于随机抽样,或者说主要是针对随机抽样,需要统计推断下的计算样本量,如果是非概率抽样,理论上没有计算和控制样本量的问题;
4.如果研究只要40-50个样本,感觉上应该是非概率抽样(依赖被访者选择方式)
5.即使是非概率抽样,我们很多时候也采用概率和统计分析及推断思想来进行数据分析和下结论!只是这种方法没有完善的理论支持,或者说有可能因为研究者的主观判断失误造成偏差;
6.无论是概率抽样还是非概率抽样,样本量越大当然效果越好,结论越稳定(理论上说)
7.40-50个样本在统计上属于小样本,t-检验,如果样本大于60或理想120以上,t分布就是正态分布了,所以40个样本在统计上是最小推断总体的样本,换句话说40-50个样本是介于小样本和正态分布大样本的临界样本量;如果不严格的话40个样本就可以比较总体之间的统计差异了;
8.所以,一般来讲,针对一个研究对象和人群,要进行比较最少40个样本,比如男女差异,应该各拥有40人(80人),或者说你们进行配额样本的时候要保证统计比较的类别至少有40个样本;
9.那么40个样本有代表性吗? 当然越多越好,越有代表性
10.但如果调查对象非常一致,没有差异,只要问一个人就行了,所以要考虑研究对象的差异性,如果差异大,当然样本量要大,如果没有差异,同质性较高样本量就少;
11.总体的大小对样本量的选择没有影响,调查研究一般必须在研究前明确总体是谁,大总体没有影响(上万人),中等总体有点影响(5000人),小总体有很大影响(千百个人);总体是你要推断的人群;
12.再者要考虑研究对象在总体中拥有的比例(比如要找艾滋病人),如果比例非常低的话,需要大样本才能找到;但往往商业研究就采用非概率抽样了,比如滚雪球抽样,专家判断抽样,配额抽样等;
13.另外,选择40个人,如果是经过我们主观判断的,有一种说法:叫条件概率,也就是我们越了解研究目的和对象,我们就越能够做出正确判断;比如P(A|B),也就是说我们越了解B事件发生的概率,那么A发生的概率就越确定;就像我们在Google中搜东西,你的关键词=B越准确,得到的结果A就越是你想要的东西;
14.当然,如果你的主观判断错了,就会犯更大的错误
15.还有就是希望得到的精度;如果得到的结果是70%加减10%误差我们可以接受,但如果是总体本身就不到8%,那8%加减10%,尾巴比头都大显然不行,当然到底如何确定精度,是研究前你们与客户要明确的,事先研究设计确定的,不能事后来说;
16.记住:有时候我们研究本身不需要那么高的精度
17.整个研究设计过程的质量控制可以更有效提升研究品质
18.研究测试的技术(接近自然科学仪器测量)可获得更好研究品质
19.根据精确的抽样,需要采用精确的统计分析,否则也达不到效果
20.任何研究都不会完美,都是权衡和保守的过程,总的来讲保守不犯错
21.如果研究有实验设计和研究设计,所以实验设计,包括所谓双盲实验、正交设计、拉丁方格等,确定样本分组是非常精细的,有助于研究品质;但设计缺陷会造成降低品质;
22.处置组和对照组的设计,主要应用在传播效果、广告效果研究上,需要有设计原则
23.实验设计也强调对其它影响因素的控制,也就是X对Y的影响,要控制住Z的干扰,更能提高研究品质
24.被访者的参与度(你的激励方式)也重要,一分钱一分货;我们是花钱买信息
25.任何理由都是可解释的,但这里主要是要用术语,越专业越说行话,别人更相信,所以解释样本量的科学性,有时候要用科学,也就是理论;
26.因为有理论,显得有水平,因为有水平就有话语权,就有执行力!所以权威部门的设计或出面,客户就相信了!
27.研究过程,不断修正,比如追加样本也是解决问题的办法
28.连续性研究,也会解决或减少对样本量的需求
29.广告效果研究经常采用rolling data的方式,因为广告效果有延迟效应,每周50个样本,4周一个分析,就是200样本,第五周分析前4周,第六周分析2-5周数据,进行比较和检验,这是常有方法;
‘陆’ BP神经网络学习样本是不是越多越好!
这个没有明确要求,样本也不是越多越好。通常情况下,你的样本可以一部分用来做验证。加速你有100个样本,90%用来做训练,10%用来做验证等,当然,有时候还得留下10%做测试用。我个人的经验是,样本数尽量在10以上吧。
‘柒’ rbf神经网络的训练样本要多大
因课题而异。
1、样本最关键在于正确性和准确性。你所选择的样本首先要能正确反映该系统过程的内在规律。我们从生产现场采得的样本数据中有不少可能是坏样本,例如由于测量仪器故障导致测量数据误差较大等,这样的样本会干扰你的神经网络训练。通常我们认为坏样本只是个别现象,所以我们希望通过尽可能大的样本规模来抵抗坏样本造成的负面影响。
2、其次是样本数据分布的均衡性。你所选择的样本最好能涉及到该系统过程可能发生的各种情况。例如某化工生产中某反应炉的温度主要分布在350度—400度,且出现在380度的情况较多,那么你的样本数据最好也是在350-400度各种情况都有,并且也是在380度左右的样本较多些,这样可以极大可能的照顾到系统在各个情况下的规律特征。通常我们对系统的内在规律不是很了解,所以我们希望通过尽可能大的样本规模来“地毯式”覆盖对象系统的方方面面。
3、再次就是样本数据的规模,也就是你要问的问题。在确保样本数据质量和分布均衡的情况下,样本数据的规模决定你神经网络训练结果的精度。样本数据量越大,精度越高。还用刚才的例子,假如反应炉的温度主要均匀分布在375-385度之间,那么你用100个均衡分布在375-385度的训练样本去训练,经过无限次或者说是足够多次迭代之后,理论上你的神经网络的精度就是0.1度。如果你觉得0.1度足够细腻了,那么样本规模为100也就可以接受了。由于样本规模直接影响计算机的运算时间,所以在精度符合要求的情况下,我们不需要过多的样本数据,否则我们要等待很久的训练时间。
补充说明一下,不论是径向基(rbf)神经网络还是经典的bp神经网络,都只是具体的训练方法,对于足够多次的迭代,训练结果的准确度是趋于一致的,方法只影响计算的收敛速度(运算时间),和样本规模没有直接关系。