精华内容
下载资源
问答
  • 什么是dom? dom不是javascript,dom是文档。 dom是一组用来描述脚本怎么与结构化文档进行交互和访问的web标准。 dom定义了一系列对象、方法和属性,用于访问、操作和创建文档中的内容、结构、样式以及行为。...

    什么是dom?
    dom不是javascript,dom是文档。
    dom是一组用来描述脚本怎么与结构化文档进行交互和访问的web标准。
    dom定义了一系列对象、方法和属性,用于访问、操作和创建文档中的内容、结构、样式以及行为。
    dom可以说就是为了获得对象而存在的。
    如果你有其他的方法,你就可以替代dom的作用。


    节点

    根据DOM,HTML文档中的每个成分都是一个节点。
    DOM是这样规定的:
    整个文档是一个文档节点
    每个HTML标签是一个元素节点
    包含在HTML元素中的文本是文本节点
    每一个HTML属性是一个属性节点
    注释属于注释节点

    document.getElementById() 根据Id获取元素节点

    document.getElementsByName() 根据name获取元素节点

    document.getElementsByTagName() 根据HTML标签名获取元素节点,注意getElements***的选择器返回的是一个NodeList对象,能根据索引号选择其中1个,可以遍历输出。
    复制代码

    document.getElementsByClassName() 根据class获取元素节点

    javascript中的CSS选择器


    文档结构和遍历 ———

    (1)作为节点数的文档
    1、parentNode    获取该节点的父节点    
    2、childNodes    获取该节点的子节点数组
    3、firstChild    获取该节点的第一个子节点
    4、lastChild    获取该节点的最后一个子节点
    5、nextSibling    获取该节点的下一个兄弟元素
    6、previoursSibling    获取该节点的上一个兄弟元素
     7、nodeType    节点的类型,9代表Document节点,1代表Element点,3Text节点,8代表Comment节点,11代表DocumentFragment节点
    
    8、nodeVlue    Text节点或Comment节点的文本内容
    9、nodeName    元素的标签名(如P,SPAN,#text(文本节点),DIV),以大写形式表示
    
    注意,以上6个方法连元素节点也算一个节点。
    

    (2)作为元素树的文档
    1、firstElementChild 第一个子元素节点
    2、lastElementChild 最后一个子元素节点
    3、nextElementSibling 下一个兄弟元素节点
    4、previousElementSibling 前一个兄弟元素节点
    5、childElementCount 子元素节点个数量
    注意,此5个方法文本节点不算进去


    javascript操作HTML属性

     1、属性的读取,此处要注意的是,某些HTML属性名称在javascript之中是保留 字,因此会有些许不同,如class,lable中的for在javascript中变为       htmlFor,className。   
    
    2、属性的设置,此处同样要注意的是保留字
    
    3、非标准HTML属性
    getAttribute();    //注意这两个方法是不必理会javascript保留字的,HTML属性是什么就怎么写。
    setAttribute();
    
    4、Attr节点的属性
        attributes属性  非Element对象返回null,Element一半返回Attr对象。Attr对象是一个特殊的Node,通过name与value获取属性名称与值。
        如:document.getElementById("img1")[0];
           document.getElementById("img1").src;
    

    元素的内容
    1、innerText、textContent innerText与textContent的区别,当文本为空时,innerText是”“,而textContent是undefined
    2、innerHTML


    我是第一个P


    我是第个P



    window.onload = function () {
    alert(document.getElementById(“p1”).innerText); //注意火狐浏览器不支持innerText
    alert(document.getElementById(“p1”).textContent); //基本都支持textContent
    document.getElementById(“p1”).textContent = “我是p1,javascript改变了我”; //设置文档Text
    alert(document.getElementById(“p2”).textContent);
    alert(document.getElementById(“p2”).innerHTML); //innerHTML与innerText的区别,就是对HTML代码的输出方式Text不会输出HTML代码
    }


    创建,插入,删除节点

        1、document.createTextNode()    创建一个文本节点
    
    2、document.createElement()    创建一个元素节点
    
    3、插入节点
        appendChild()    //将一个节点插入到调用节点的最后面
        insertBefore()    //接受两个参数,第一个为待插入的节点,第二个指明在哪个节点前面,如果不传入第二个参数,则跟appendChild一样,放在最后。
      `<div id="div1">
            <p id="p1">我是第一个P</p>
        </div>
    
    window.onload = function () {
            var pNode1 = document.createElement("p");
            pNode1.textContent = "insertBefore插入的节点";
            var pNode2 = document.createElement("p");
            pNode2.textContent = "appendChild插入的节点";
            document.getElementById("div1").appendChild(pNode2);
            document.getElementById("div1").insertBefore(pNode1,document.getElementById("p1"));
        }`
    

    删除和替换节点。

    1、removeChild();    由父元素调用,删除一个子节点。注意是直接父元素调用,删除直接子元素才有效,删除孙子元素就没有效果了。
    
    2、replaceChild()    //删除一个子节点,并用一个新节点代替它,第一个参数为新建的节点,第二个节点为被替换的节点
    

    javascript操作元素CSS

        通过元素的style属性可以随意读取和设置元素的CSS样式,例子:

    展开全文
  • 深度学习在用户画像标签模型中的应用

    万次阅读 热门讨论 2018-02-14 01:18:28
    最近一段时间都在学习深度学习,想着在用户画像标签模型中看能不能用上,终于,用了一个多月的时间,结合实际的场景和数据,搭建了一套“孕妇标签”的深度学习模型。这篇文章重点介绍了在用户画像标签模型中运用深度...

    最近一段时间都在学习深度学习,想着在用户画像标签模型中看能不能用上,终于,用了一个多月的时间,结合实际的场景和数据,搭建了一套“孕妇标签”的深度学习模型。这篇文章重点介绍了在用户画像标签模型中运用深度学习建模的过程中,我们遇到的一些问题,以及其中的一些体会和思考,对于深度学习的一些基础概念和模型,文章没有过多的介绍。另外,自己也属于深度学习的入门阶段,若有理解有误的地方,欢迎大家指正。

    什么是用户画像标签

    基于用户事实数据,进行一定抽象后的用户特征表示

    拿电商为例,用户的购物性别,年龄,消费能力等都是用户画像的标签。这些标签能帮助我们理解用户,将用户进行归类,进一步进行个性化运营,例如针对高消费人群,那我们可以展示比较有品味的服装给用户。

    标签建模的方法

    标签建模有什么方法?可分为两大类:

    • 人工建模

      凭借经验,对标签定义一个数据描述口径,通过大数据ETL跑出标签结果,再逐步通过调整口径达到运营可接受的模型。

    • 机器建模

      通过机器对标签样本数据的多维度学习,建立机器自学习的标签模型,可通过对样本数据的调整以及模型结构及参数的调整来逐步优化模型。

    两种建模方式各有优缺点,这里介绍如何运用深度学习进行机器建模。

    下面以“孕妇标签”为例(电商场景下),我们是怎样一步步完成深度学习建模的。

    简陋的模型

    一开始思路很简单,将用户的各个品类购买行为做为模型训练的特征,并通过对品类划分中挑出和孕妇明显相关的品类(例如孕期护理,孕妇装,高跟鞋,彩妆等),通过某些品类的购买行为筛选出训练正负样本,例如按一年统计用户对各个品类的购买次数,若孕妇相关品类购买次数超过5次,则标识为正样本,若高跟鞋,彩妆类购买次数超过5次,则标识为负样本。

    正负样本,模型训练需要的特征数据都有了,最简单的就是构造一个浅层神经网络模型,将数据丢给模型,看看模型能否自我训练学习,这就是模型最初的样子:

    image

    这个版本的模型直接用Keras构造,非常简单,也可以直接看到实时训练的情况。准备了5万的样本训练数据,大概几分钟就可以发现模型的Training accuracy和Validate accuracy都达到了0.9以上,可以试试模型的效果,但要再找出一批已知是否孕妇的数据,是个大难题,所以比较直接的就是找了几个(女)同事的帐号,虽然测试数量少,但比较有代表性,很容易发现模型的问题: 对于几个月前是孕妇,现在已经是妈妈的情况,没有准确的识别出来。想想,因为模型输入的数据是过去一年的购买记录,模型无法感知数据在时间维度上的变化。

    时序模型

    由于孕妇标签的时间敏感性,模型中需要考虑时间维度,比如6个月前有购买过孕妇类,最近2个月已经不再买了,而是开始买婴幼品类的商品,这个说明现在已经不再是孕妇了,应该打上新生妈妈的标签了。

    因此,首先在模型的特征维度上需要将一年的购买行为按时间间隔(月)拆开,同时将用户的购买行为数据放在一个时间轴上,这样可以提供更立体的特征数据给模型训练,于是我们选用了可以感知时序数据的RNN模型,对用户某段短时间内的购买行为综合分析学习,这样模型更容易准确地判断出孕妇标签。

    比如,用户购买平底鞋这个行为,一般情况下,对孕妇标签的判断没有太大的作用,但如果用户购买平底鞋的时候,还买了孕妇裤,这就不同了,购买平底鞋这个行为就变得和孕妇行为相关了,和标签结果就有一定的相关性。就是因为加上用户前后购买行为这个Context,而让数据更立体,更丰富,模型对标签的判断也就更准确。

    image

    模型的特征是用户每个月对各个品类的购买次数,比如我们对最近18个月的,2000个品类进行统计,得到18*2000的矩阵,作为一个用户的特征表示,所以模型的inputs维度是:user_num * months * categorys (e.g. 10000 * 18 * 2000),output targets维度是:user_num * 1 (e.g. 10000 * 1)

    模型采用LSTM,对LSTM的最后一个output通过sigmoid映射到[0,1]后和target对比,计算得出cost函数。

    模型训练完后,再用测试数据校验了下,已经可以准确区分出新生妈妈和孕妇了。

    但这个模型的输入特征不够丰富,用户的行为除了购买之外,点击行为也是放进来,让学习维度更加丰富。

    多时序模型

    从用户的浏览->点击->购买这个转化漏斗可以知道,用户的点击行为远比购买行为更频繁。以月为单位,一个用户在某个品类的购买次数一般为1次,很少超过10次。但点击不同,如果以月为单位统计,点击的数量会很大,这样会有什么问题?

    假设按自然月统计,如果一个用户在1号那天就对某个品类点击次数达到10次,我们知道用户对这个品类是有偏好的,但如果放到1个月统计这个维度,10次可能还没达到模型认为有强相关的程度。换句话说,就是模型无法实时感知到用户的偏好变化

    所以,针对点击行为,我们得采用以天为单位统计用户在各个品类下的点击次数,作为模型的输入。这样就出现了购买行为和点击行为的两套时序模型,他们的时间维度不同,不能放在一套LSTM模型里,只能分开两套,再通过一层fully connected layer,将两套LSTM的输出作为这层的输入,得到最终的模型结果。

    image

    模型调优

    结合点击和购买时序行为的模型,使用样本的筛选规则得到的数据,都可以准确的识别出结果,但模型的泛化能力如何,会不会overfit,由于缺乏更丰富的数据样本,并不好验证这点。

    所以,对于模型的评估,我们采取人工伪造数据的方式来校验,比如将训练样本中的购买数据全部抹掉,这样用一份只有点击的数据来校验模型对点击行为的学习能力;再比如将训练样本中强孕妇相关品类的购买,点击数据抹掉,来验证模型对其他“潜在”的相关维度的学习能力。

    值得一提的是,模型的训练样本是按照一定的规则进行人工筛选标注完成的,而筛选的条件同时也是模型的学习维度中的一部分,这意味着模型很容易学习到这些“人工设定”的规则,而忽略那些“潜在”的维度和结果之间的相关性。模型容易出现“Memorize more than Learning”,也就是缺失泛化能力。

    如何提高模型的泛化能力:

    • 减少Hidden Size,降低模型记忆单元数
    • 增加Dropout,通过随机抹掉部分hidden layer的节点,类似通过让模型变得简单,同时通过将多个简单的模型的结果综合起来,达到提高泛化能力的目的
    • 采用L2 Regularizer,通过对权重的惩罚,来提高模型泛化能力
    • 提供更丰富的训练样本,让模型接触更多不一样的数据

    体会和思考

    • 深度学习模型更像一个黑盒子,无法通过因果关系进行逻辑推导,而只能通过不同的数据不断从外部试探,理解模型

    • 人的很多特征都是会随着时间变化的,用户画像的标签建模是需要考虑好时间维度的数据

    • 用户画像标签模型的数据样本获取成本大,通过规则筛选的数据,不够丰富,容易导致模型泛化能力差

    展开全文
  • 空间后方交会模型

    千次阅读 2018-05-08 08:41:16
    一般来说就是在已知地面上若干点的地面坐标以后,反求该相应摄影光束的外参数,当用以作摄影机的标定时,还可借以同时求出摄影的内...具体的说就是一个多元线性模型,根据不同的需求可以基于它进一步构建各种平差模型

    前言

    单像空间后方交会原理非常简单,稍稍懂一点线性代数和微分学知识就很容易理解。但它的意义很大,所有的基于视觉技术的定位(测量)都是从它扩展来的,没有它就没有后面的复杂算法的演进,以面向更复杂的场景以及需求。这块内容一般来说就是在已知地面上若干点的地面坐标以后,反求该相应摄影光束的外参数,当用以作摄影机的标定时,还可借以同时求出摄影的内参数。具体的说就是一个多元线性模型,根据不同的需求可以基于它进一步构建各种平差模型。

    中心投影的构像方程式

    由于我们使用的工业相机最多的是基于针孔相机模型,所以首先需要建立中心投影的几何模型,先从较为简单的模型开始谈起:如下图所示,此时像空间坐标系统与物空间坐标系统的轴线相互平行。
    这里写图片描述
    按照三角形相似关系得出:
    (XXs):x=(YYs):y=(ZZs):(f)(X-X_{s}):x=(Y-Y_{s}):y=(Z-Z^{_{s}}):(-f)

    经整理得
    x=fXXsZZsy=fYYsZZs}\left.\begin{matrix} x=-f \frac{ X-X_{s} } { Z-Z_{s} } \\ \\ y=-f \frac{Y-Y_{s}} {Z-Z_{s}} \end{matrix}\right\}

    由上述得正直摄影模型可扩展为一般的情况,如下图所示:

    这里写图片描述

    为了要确定物象坐标系的关系,只需做一个简单的正交变换即可,对应于线性模型中乘上一个正交矩阵,假设像坐标系x,y,zx,y,z,物坐标系u,v,wu,v,w,其关系公式可整理为:
    u=a1x+a2ya3fv=b1x+b2yb3fw=c1x+c2yc3f}\left.\begin{matrix} u=a_{1}x+a_{2}y-a_{3}f\\ v=b_{1}x+b_{2}y-b_{3}f\\ w=c_{1}x+c_{2}y-c_{3}f \end{matrix}\right\}
    可进一步抽象成矩阵表达,设矩阵RR
    R=[a1a2a3b1b2b3c1c2c3]R=\begin{bmatrix} a_{1} &amp;a_{2} &amp; a_{3}\\ b_{1} &amp;b_{2} &amp; b_{3}\\ c_{1} &amp;c_{2} &amp; c_{3} \end{bmatrix}
    则得出:
    [uvw]=R[xyf]\begin{bmatrix} u\\ v\\ w \end{bmatrix}=R\begin{bmatrix} x\\ y\\ -f \end{bmatrix}
    RR矩阵是正交矩阵,属于特殊正交群,是一个三维流形,理论上用三个参数即可有效的表达,这样模型就变成了:
    [XXsYYsZZs]=λ[uvw]=λR[xyf]=λ[a1x+a2ya3fb1x+b2yb3fc1x+c2yc3f]\begin{bmatrix} X-X_{s}\\ Y-Y_{s}\\ Z-Z_{s} \end{bmatrix}=\lambda \begin{bmatrix} u\\ v\\ w \end{bmatrix}=\lambda \cdot R\begin{bmatrix} x\\ y\\ -f \end{bmatrix}=\lambda \begin{bmatrix} a_{1}x+a_{2}y-a_{3}f\\ b_{1}x+b_{2}y-b_{3}f\\ c_{1}x+c_{2}y-c_{3}f \end{bmatrix}

    通过整理,便可得到中心投影的构像方程式,它是视觉测量中最主要的一个方程式:

    x=fa1(XXs)+b1(YYs)+c1(ZZs)a3(XXs)+b3(YYs)+c3(ZZs)y=fa2(XXs)+b2(YYs)+c2(ZZs)a3(XXs)+b3(YYs)+c3(ZZs)}\left.\begin{matrix} x=-f\frac{a_{1}(X-X_{s})+b_{1}(Y-Y_{s})+c_{1}(Z-Z_{s})}{a_{3}(X-X_{s})+b_{3}(Y-Y_{s})+c_{3}(Z-Z_{s})}\\ y=-f\frac{a_{2}(X-X_{s})+b_{2}(Y-Y_{s})+c_{2}(Z-Z_{s})}{a_{3}(X-X_{s})+b_{3}(Y-Y_{s})+c_{3}(Z-Z_{s})} \end{matrix}\right\}

    平差模型的建立

    如果是六个外参数(XsX_{s}YsY_{s}ZsZ_{s}φ\varphiω\omegaκ\kappa)需要拟合,模型至少利用三个已知点:A(XA,YA,ZA)A(X_{A},Y_{A},Z_{A})B(XB,YB,ZB)B(X_{B},Y_{B},Z_{B})C(XC,YC,ZC)C(X_{C},Y_{C},Z_{C}),以及对应的图像坐标:a(xa,ya)a(x_{a},y_{a})b(xb,yb)b(x_{b},y_{b})c(xc,yc)c(x_{c},y_{c})。如果拟合的参数大于六个,就需要更多个观测点。目前矩阵RR还是未知的,建立平差模型前首先要根据具体需求确立RR的模型,一般来说,欧拉角模型要尽量避免了,除非保证三个偏转角都很小。附加正交的条件也不是很好的选择,因为这相当于提前做降维处理了,但相对于直接拟合欧拉角会好很多,在较为追求效率的场合下,也是可以选择。如果对效率要求不是那么高,可以拟合九参数模型,然后再把拟合好的矩阵投影到特殊正交群上去。
    然后就是确定要拟合的参数,假如是要同时得到内外参,就是把矩阵参数以及XsX_{s}YsY_{s}ZsZ_{s}ff作为待定参数。把中心投影的构像方程式展成一阶泰勒,也就是对它进行线性化处理。接着就是对其进行移相整理成如下形式:V=AXlV=AX-l其中,XX是待定参数,这里假如X=[XsYsZsfa1a2a3b1b2b3c1c2c3]X=\begin{bmatrix} X_{s} &amp;Y_{s} &amp;Z_{s} &amp;f &amp;a_{1} &amp;a_{2} &amp;a_{3} &amp;b_{1} &amp;b_{2} &amp;b_{3} &amp;c_{1} &amp;c_{2} &amp;c_{3} \end{bmatrix}
    这时AA就是2×132\times 13矩阵:
    A=[xXsxYsxZsxfxa1xa2xa3xb1xb2xb3xc1xc2xc3yXsyYsyZsyfya1ya2ya3yb1yb2yb3yc1yc2yc3]A=\begin{bmatrix} \frac{\partial x}{\partial X_{s}}&amp; \frac{\partial x}{\partial Y_{s}} &amp; \frac{\partial x}{\partial Z_{s}} &amp; \frac{\partial x}{\partial f} &amp; \frac{\partial x}{\partial a_{1}} &amp;\frac{\partial x}{\partial a_{2}} &amp;\frac{\partial x}{\partial a_{3}} &amp;\frac{\partial x}{\partial b_{1}} &amp;\frac{\partial x}{\partial b_{2}} &amp;\frac{\partial x}{\partial b_{3}} &amp;\frac{\partial x}{\partial c_{1}} &amp; \frac{\partial x}{\partial c_{2}} &amp;\frac{\partial x}{\partial c_{3}} \\ \frac{\partial y}{\partial X_{s}}&amp; \frac{\partial y}{\partial Y_{s}}&amp; \frac{\partial y}{\partial Z_{s}} &amp;\frac{\partial y}{\partial f} &amp; \frac{\partial y}{\partial a_{1}} &amp; \frac{\partial y}{\partial a_{2}} &amp; \frac{\partial y}{\partial a_{3}} &amp; \frac{\partial y}{\partial b_{1}} &amp; \frac{\partial y}{\partial b_{2}}&amp; \frac{\partial y}{\partial b_{3}} &amp; \frac{\partial y}{\partial c_{1}} &amp; \frac{\partial y}{\partial c_{2}} &amp; \frac{\partial y}{\partial c_{3}} \end{bmatrix}
    这里还涉及到初始化,假设初始化值:Xs0X_{s}^{0}Ys0Y_{s}^{0}Zs0Z_{s}^{0}f0f^{0}a10a_{1}^{0}a20a_{2}^{0}a30a_{3}^{0}b10b_{1}^{0}b20b_{2}^{0}b30b_{3}^{0}c10c_{1}^{0}c20c_{2}^{0}c30c_{3}^{0}。这样,ll可表示为:
    l=[x+f0a10(XXs0)+b10(YYs0)+c10(ZZs0)a30(XXs0)+b30(YYs0)+c30(ZZs0)y+f0a20(XXs0)+b20(YYs0)+c20(ZZs0)a30(XXs0)+b30(YYs0)+c30(ZZs0)]Tl=\begin{bmatrix} x+f^{0}\frac{a_{1}^{0}(X-X_{s}^{0})+b_{1}^{0}(Y-Y_{s}^{0})+c_{1}^{0}(Z-Z_{s}^{0})}{a_{3}^{0}(X-X_{s}^{0})+b_{3}^{0}(Y-Y_{s}^{0})+c_{3}^{0}(Z-Z_{s}^{0})}&amp; y+f^{0}\frac{a_{2}^{0}(X-X_{s}^{0})+b_{2}^{0}(Y-Y_{s}^{0})+c_{2}^{0}(Z-Z_{s}^{0})}{a_{3}^{0}(X-X_{s}^{0})+b_{3}^{0}(Y-Y_{s}^{0})+c_{3}^{0}(Z-Z_{s}^{0})} \end{bmatrix}^{T}其中,xxyyXXYYZZ都是已知的,这样就至少需要7个观测点。接下来如何确定矩阵AA将是主要问题。中心投影的构像方程式是一个分式,经求导运算可得:
    xXs=a1f+a3xa3(XXs)+b3(YYs)+c3(ZZs)\frac{\partial x}{\partial X_{s}}=\frac{a_{1}f+a_{3}x}{a_{3}(X-X_{s})+b_{3}(Y-Y_{s})+c_{3}(Z-Z_{s})}
    xa1=f(XXs)a3(XXs)+b3(YYs)+c3(ZZs)\frac{\partial x}{\partial a_{1}}=\frac{-f(X-X_{s})}{a_{3}(X-X_{s})+b_{3}(Y-Y_{s})+c_{3}(Z-Z_{s})}
    xa3=f[a1(XXs)+b1(YYs)+c1(ZZs)](XXs)[a3(XXs)+b3(YYs)+c3(ZZs)]2\frac{\partial x}{\partial a_{3}}=\frac{f\left [a_{1}(X-X_{s}) +b_{1}(Y-Y_{s}) +c_{1}(Z-Z_{s})\right ](X-X_{s})}{\left [ a_{3}(X-X_{s})+b_{3}(Y-Y_{s})+c_{3}(Z-Z_{s}) \right ]^{2}}
    xf=a1(XXs)b1(YYs)c1(ZZs)a3(XXs)+b3(YYs)+c3(ZZs)\frac{\partial x}{\partial f}=\frac{-a_{1}(X-X_{s}) -b_{1}(Y-Y_{s}) -c_{1}(Z-Z_{s})}{a_{3}(X-X_{s})+b_{3}(Y-Y_{s})+c_{3}(Z-Z_{s})}
    \cdots \cdots

    然后就是套用间接平差公式,这部分请参看测量平差之间接平差,文章写的比较详细,直接往接口传入相应的参数即可。下面是具体的代码实现,其中间接平差部分的代码没有给出,请参考上面的那篇博文。

    
    template<class T, int N>
    void getMatrixB(T matrixB[], double3 p3s[N], double2 p2s[N], const double f0
    				, const double3 S0, const double9 A0)
    {
    	memset(matrixB, 0, sizeof(T)*N * 2 * 13);
    
    	for (int i = 0; i != N; ++i)
    	{
    		matrixB[i * 26 + 0] = (A0[0] * f0 + A0[2] * p2s[i][0])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 1] = (A0[3] * f0 + A0[5] * p2s[i][0])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 2] = (A0[6] * f0 + A0[8] * p2s[i][0])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 3] = -1*(A0[0] * (p3s[i][0] - S0[0]) + A0[3] 
    							* (p3s[i][1] - S0[1]) + A0[6] * (p3s[i][2] - S0[3])) 
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 4] = -1*f0*(p3s[i][0]-S0[0])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 5] = -1 * f0*(p3s[i][1] - S0[1])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 6] = -1 * f0*(p3s[i][2] - S0[2])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 7] = 0;
    		matrixB[i * 26 + 8] = 0;
    		matrixB[i * 26 + 9] = 0;
    		matrixB[i * 26 + 10] = f0* (p3s[i][0] - S0[0])*((A0[0] * (p3s[i][0] - S0[0]) 
    							+ A0[3] * (p3s[i][1] - S0[1]) + A0[6] * (p3s[i][2] - S0[3])) 
    							/ pow(
    							(A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3])
    							, 2);
    		matrixB[i * 26 + 11] = f0* (p3s[i][1] - S0[1])*((A0[0] * (p3s[i][0] - S0[0]) 
    							+ A0[3] * (p3s[i][1] - S0[1]) + A0[6] * (p3s[i][2] - S0[3]))
    							/ pow(
    							(A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3])
    							, 2);
    		matrixB[i * 26 + 12] = f0* (p3s[i][2] - S0[2])*((A0[0] * (p3s[i][0] - S0[0]) 
    							+ A0[3] * (p3s[i][1] - S0[1]) + A0[6] * (p3s[i][2] - S0[3]))
    							/ pow(
    							(A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3])
    							, 2);
    
    
    
    		matrixB[i * 26 + 13] = (A0[1] * f0 + A0[2] * p2s[i][1])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 14] = (A0[4] * f0 + A0[5] * p2s[i][1])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 15] = (A0[7] * f0 + A0[8] * p2s[i][1])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 16] = -1 * (A0[1] * (p3s[i][0] - S0[0]) 
    							+ A0[4] * (p3s[i][1] - S0[1]) + A0[7] * (p3s[i][2] - S0[3]))
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 17] = 0;
    		matrixB[i * 26 + 18] = 0;
    		matrixB[i * 26 + 19] = 0;
    		matrixB[i * 26 + 20] = -1 * f0*(p3s[i][0] - S0[0])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 21] = -1 * f0*(p3s[i][1] - S0[1])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		matrixB[i * 26 + 22] = -1 * f0*(p3s[i][2] - S0[2])
    							/ (A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    
    
    		matrixB[i * 26 + 23] = f0* (p3s[i][0] - S0[0])*((A0[1] * (p3s[i][0] - S0[0]) 
    							+ A0[4] * (p3s[i][1] - S0[1]) + A0[7] * (p3s[i][2] - S0[3]))
    							/ pow(
    							(A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3])
    							, 2);
    		matrixB[i * 26 + 24] = f0* (p3s[i][1] - S0[1])*((A0[1] * (p3s[i][0] - S0[0]) 
    							+ A0[4] * (p3s[i][1] - S0[1]) + A0[7] * (p3s[i][2] - S0[3]))
    							/ pow(
    							(A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3])
    							, 2);
    		matrixB[i * 26 + 25] = f0* (p3s[i][2] - S0[2])*((A0[1] * (p3s[i][0] - S0[0]) 
    							+ A0[4] * (p3s[i][1] - S0[1]) + A0[7] * (p3s[i][2] - S0[3]))
    							/ pow(
    							(A0[2] * (p3s[i][0] - S0[0]) + A0[5] 
    							* (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3])
    							, 2);
    
    	}
    }
    
    
    template<class T, int N>
    void getL(T l[], double3 p3s[N], double2 p2s[N], const double f0
    		, const double3 S0, const double9 A0)
    {
    	memset(l, 0, sizeof(T)*N * 2);
    
    	for (int i = 0; i != N; ++i)
    	{
    		l[i * 2] = p2s[i][0]+f0*(A0[0] * (p3s[i][0] - S0[0]) 
    				+ A0[3] * (p3s[i][1] - S0[1]) + A0[6] * (p3s[i][2] - S0[3]))
    				/ (A0[2] * (p3s[i][0] - S0[0]) 
    				+ A0[5] * (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    		l[i * 2 + 1] = p2s[i][1] + f0*(A0[1] * (p3s[i][0] - S0[0]) 
    					+ A0[4] * (p3s[i][1] - S0[1]) + A0[7] * (p3s[i][2] - S0[3]))
    					/ (A0[2] * (p3s[i][0] - S0[0]) 
    					+ A0[5] * (p3s[i][1] - S0[1]) + A0[8] * (p3s[i][2] - S0[3]));
    	}
    
    }
    
    template<class T, int N>
    void getDeltaVector(T DeltaV[], double3 p3s[N], double2 p2s[N], const double f0
    					, const double3 S0, const double9 A0)
    {
    	T *matrixB = new T[N * 2 * 13];
    	T *l = new T[N * 2];
    
    	getMatrixB<T, N>(matrixB, p3s, p2s, f0, S0, A0);
    	getL<T, N>(l, p3s, p2s, f0, S0, A0);
    	GetCorrection(DeltaV, matrixB, l, N * 2, 13);
    
    	delete[] matrixB;
    	delete[] l;
    }
    
    

    最后拟合好的矩阵AA不保证是正交矩阵,这时候需要把拟合好的矩阵做投影,投到特殊正交群上去,具体做法就是对AAQRQR分解,把QQ矩阵赋给AA就完成了。QRQR分解的代码可参考下面:

    /// <summary>   
    /// QR分解
    /// </summary>  
    template<class T>
    int Bmaqr( T Myq[],T Myr[],T Mya[],int Mym,int Myn)
    {
    	int i,j,k,l,nn,p,jj;
    	T u,alpha,w,t;
    
    	if (Mym<Myn)
    	{
    		return(0);
    	}
    
    	for (i=0; i<=Mym-1; i++)
    	{
    		for (j=0; j<=Mym-1; j++)
    		{
    			l=i*Mym+j; 
    			Myq[l]=0.0;
    			if (i==j) 
    			{
    				Myq[l]=1.0;
    			}
    
    		}
    	}
    
    	for (i=0; i<=Mym-1; i++)
    	{
    		for (j=0; j<=Myn-1; j++)
    		{
    			l=i*Mym+j; 
    			Myr[l]=Mya[l];
    
    		}
    	}
    
    	for (i=0; i<=Mym-2; i++)
    	{
    		for (j=i+1; j<=Myn-1;j++)
    		{
    			p=i*Mym+j; 
    			l=j*Mym+i;
    			t=Myr[p]; 
    			Myr[p]=Myr[l]; 
    			Myr[l]=t;
    
    		}
    	}
    
    
    	nn=Myn;
    	if (Mym==Myn) 
    	{
    		nn=Mym-1;
    	}
    	for (k=0; k<=nn-1; k++)
    	{
    		u=0.0; 
    		l=k*Myn+k;
    		for (i=k; i<=Mym-1; i++)
    		{
    			w=fabs(Myr[i*Myn+k]);
    			if (w>u) 
    			{
    				u=w;
    			}
    
    		}
    		alpha=0.0;
    		for (i=k; i<=Mym-1; i++)
    		{
    			t=Myr[i*Myn+k]/u; 
    			alpha=alpha+t*t;
    		}
    		if (Myr[l]>0.0) 
    		{
    			u=-u;
    		}
    		alpha=u*sqrt(alpha);
    		if (fabs(alpha)+1.0==1.0)
    		{
    			return(0);
    		}
    		u=sqrt(2.0*alpha*(alpha-Myr[l]));
    		if ((u+1.0)!=1.0)
    		{
    			Myr[l]=(Myr[l]-alpha)/u;
    			for (i=k+1; i<=Mym-1; i++)
    			{
    				p=i*Myn+k; 
    				Myr[p]=Myr[p]/u;
    			}
    			for (j=0; j<=Mym-1; j++)
    			{
    				t=0.0;
    				for (jj=k; jj<=Mym-1; jj++)
    				{
    					t=t+Myr[jj*Myn+k]*Myq[jj*Mym+j];
    				}
    				for (i=k; i<=Mym-1; i++)
    				{
    					p=i*Mym+j; 
    					Myq[p]=Myq[p]-2.0*t*Myr[i*Myn+k];
    				}
    
    			}
    			for (j=k+1; j<=Myn-1; j++)
    			{
    				t=0.0;
    				for (jj=k; jj<=Mym-1; jj++)
    				{
    					t=t+Myr[jj*Myn+k]*Myr[jj*Myn+j];
    				}
    				for (i=k; i<=Mym-1; i++)
    				{
    					p=i*Myn+j; 
    					Myr[p]=Myr[p]-2.0*t*Myr[i*Myn+k];
    				}
    
    			}
    			Myr[l]=alpha;
    			for (i=k+1; i<=Mym-1; i++)
    			{
    				Myr[i*Myn+k]=0.0;
    			}
    
    		}
    
    	}
    
    	for (i=0; i<=Mym-2; i++)
    	{
    		for (j=i+1; j<=Myn-1;j++)
    		{
    			p=i*Mym+j; 
    			l=j*Mym+i;
    			t=Myr[p]; 
    			Myr[p]=Myr[l]; 
    			Myr[l]=t;
    
    		}
    	}
    	return (1);
    
    }
    
    

    当然,对于单像空间后方交会还有其他的拟合方式,比如教科书上一般是拟合欧拉角了,还可以拟合三角函数,或者附加限制条件……以及根据不同的情况对不同的参数进行拟合等等,在本文就不再赘述了。

    精度评定

    像点坐标量测的中误差m0m_{0}按下式计算(nn为控制点总数):m0=vTv2n6m_{0}=\sqrt{\frac{v^{T}v}{2n-6}}
    由平差理论可知,矩阵(ATA)1(A^{T}A)^{-1}等于未知数的协因数阵QxQ_{x},因此由下式计算未知数的中误差:
    mi=m0Qiim_{i}=m_{0}\sqrt{Q_{ii}}
    式中QiiQ_{ii}QxQ_{x}的主对角线元素。

    参考文献:

    [1] 摄影测量原理 王之卓编著
    [2] 摄影测量学(测绘工程专业) 王佩军,徐亚明编著

    转载请注明出处:https://blog.csdn.net/fourierFeng/article/details/80174613

    展开全文
  • 用户画像 客户消费模型

    千次阅读 2019-03-12 18:55:51
    =========== 如下 各维度表 最终合并为客户消费模型表 ============ 订单表 1.订单 主要信息表 1.订单 主要信息表 BDM层 bdm.itcast_bdm_order(时间分区) 2.订单 主要信息表 FDM层 fdm.it...
  • 立体对前方交会模型

    千次阅读 2018-08-23 23:13:07
    用两张相互重叠的相片构建三维基底是立体摄影测量的基础,同样也是视觉三维重建的基础。这样的原理很容易的扩展为由一系列对构建的摄影测量网中。...
  • 元二分模型是一种简单实用的遥感估算模型,它假设一个元的地表由有植被覆盖部分地表与无植被覆盖部分地表组成,而遥感传感器观测到的光谱信息也由这2个组分因子线性加权合成,各因子的权重是各自的面积在元中...
  • 移动端unet人像分割模型--3

    千次阅读 2018-10-18 17:13:02
    前两篇文章已经完成基本从mxnet到ncnn的unet模型训练和转换。不过还存在几个问题,1. 模型比较大,2. 单帧处理需要15秒左右的时间(MAC PRO,ncnn没有使用openmp的情况),3. 得到的mask结果不是特别理想。针对这三...
  • 用户画像中常用的用户模型

    千次阅读 2019-02-19 16:11:59
    促销敏感度模型 1.对于租凭公司平台而言,全范围的促销投放和对所有用户发放优惠券之类的,的确可以得到不错的效果,比如2019年的春节,公司通过对所有老用户发放优惠券,成功争取到了1000多订单。但是如果想进一步...
  • 移动端unet人像分割模型--1

    千次阅读 2018-10-12 17:18:05
    近期成功利用别人训练好的mtcnn和mobilefacenet模型制作了一个ios版本人脸识别swift版本demo。希望maskrcnn移植到ncnn,在手机端实现一些有趣的应用。因为unet模型比较简单,干脆就从这个入手。  基本的网络基于...
  • 这次实现利用IDL调用6S模型建立大气校正系数查找表然后对MERSI2进行逐元大气校正。 由于MERSI2自带的角度信息是逐元的数据,而我建立的查找表步长比较大,因此在进行校正前,先对角度信息和MODIS AOD...
  • 分析了复距离的统计特性,将识别领域常用的三种高斯模型——自适应高斯分类器(AGC)模型、联合高斯(JG)模型和概率主分量分析(PPCA)模型推广至复数域对复距离统计建模。研究表明,这三种模型及其参数估计结果均不...
  • 针对扫描反射镜和电荷耦合器件(CCD)时间延迟积分(TDI)无法完全补偿前向移和摆扫移的问题,提出了TDI-CCD全景航空相机移速度场的计算模型。根据相机结构和移补偿原理,用坐标变换和共线方程建立了成像几何...
  • 修改GDAL库支持RPC方改正模型

    千次阅读 热门讨论 2014-04-30 20:20:54
    最近在做基于RPC的方改正模型,方便对数据进行测试,修改了GDAL库中的RPC纠正模型,使之可以支持RPC方改正参数。下面是RPC模型的公式,rn,cn为归一化之后的图像行列号坐标,PLH为归一化后的经度纬度高程。将上面...
  • 基于线性混合模型/神经网络模型的高光谱混合元分解算法比较-以徐州地区Hyperion影像为例,蔡燕,赵银娣,混合元的普遍存在使得传统的基于元级的遥感分类和面积测量很难达到使用要求的精度,所以混合元的...
  • 移动端unet人像分割模型--2

    千次阅读 2018-10-15 00:10:47
    前一篇blog里提到的错误果然是mxnet网络的问题,pool5误敲成pool4修改之后,ncnn就不再crash,不过ncnn的mxnet2ncnn这个工具应该多加一些诊断确保转换的模型参数一致才对。  只是事情也没那么一帆风顺,转成ncnn后...
  • 元二分模型计算植被覆盖度

    千次阅读 2020-05-01 00:43:52
    关于改进的元二分模型第一次出现是在李苗苗老师的博士论文中,但她后来发表的一篇期刊文章把这一部分单独摘了出来并做了应用案例,期刊链接在下方。 密云水库上游植被覆盖度的遥感估算 论文要点 计算公式为:Fc ...
  • 文章目录三、模型构建3.1 贷款逾期数据分析3.1.1 描述性分析3.1.2 独立性分析3.1.2.1 单因素分析3.1.2.2 多因素分析3.1.3 模型构建3.1.3.1 特征筛选&特征工程3.1.3.2 训练集&测试集划分3.1.3.3 逻辑回归3.1....
  • 微软开源项目NeuronBlocks:搭积木一样构建自然语言理解深度学习模型 在构建自然语言理解深度学习模型时,工程师们经常需要在编程细节和代码调试上花费大量精力,而不是专注于模型架构设计与参数调节。为提升...
  • 元二分模型是一种简单实用的遥感估算模型,它假设一个元的地表由有植被覆盖部分地表与无植被覆盖部分地表组成,而遥感传感器观测到的光谱信息也由这2个组分因子线性加权合成,各因子的权重是各自的面积在元中...
  • 模型菜品的配方

    2011-02-07 22:52:00
    模型菜品的配方,当然,还应该加上制作的环境,因为必须能根据配方描述重现原有菜品味道,色泽,口感。对软件也一样,软件的模型定义就是要能根据模型直接生成应用系统,但实际上有些东西不是所有模型都能...
  • 9个新零售用户画像中常用的用户模型(附模型文档) 公众号:修炼大数据作者:某小编2018-06-04 09:04 新零售已经不是什么新鲜的概念,传统企业和大的互联公司都纷纷改革创新或者走向融合。新零售的“新”就新在对...
  • 一、流失预测意义 每个企业都渴望建立和保持一个忠实的客户群...分析模型标签我们知道,这是一个概率型的结论,如果通过一个普通的算术运算来得出的话,不会太靠谱! 那该怎么办呢? 要通过历史既定事实的经验(满足...
  • 在本文中,我们提出了目标检测的非对称性和反包装对模式表示模型(NAM)。一组独特的子模式(对部分)从一组对类的样本图像构造; 对图案然后使用子模式表示,连同空间关系的子模式中观察到的。许多特征描述...
  • 8大量化精分模型

    2018-04-23 20:50:26
    8大量化精分模型1、增长黑客模型AARRR2、刷量防御模型3、同期群分模型4、用户画像模型5、流失预测模型6、病毒传播k因子模型7、归因模型8、LTV模型这个博客的图片怎么总放不上去?...
  • 模型

    2013-08-20 15:50:27
    模型用于处理数据库的PHP类    模型类文件放在application/models/... 最基本的模型类必须这样。   class Model_name extends CI_Model{ function __construct(){ parent::_construct(); } }  类名首字母必
  • 遥感知识-元二分模型

    千次阅读 2019-03-25 20:33:06
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190325202913760.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3l1
  • 模型思维(让人终身受益的思维模型芒格一样智慧地思考!万维钢力荐2019年度好书,作者是斯科特•佩奇 。 【电子书获取方式】 ** 链接: https://pan.baidu.com/s/1hCwbuc7Rip5AGiE2Po1J9Q 提取码: sdun ** ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,030
精华内容 6,812
关键字:

像模型