小编Pau*_*och的帖子

使用Microsoft Solution Foundation定义目标

计划目的:整合.我正在实现高维度(高达100)的自适应正交(又称数值积分)算法.该想法是通过使用与该点处的误差估计成比例的采样密度来评估点来随机地将体积分成更小的部分.在早期我"老化"一个统一的样本,然后根据估计误差的高斯分布随机选择点.以类似于模拟退火的方式,I"降低温度"并随着时间的推移降低高斯的标准偏差,因此低误差点最初有很大的选择机会,但后来选择稳定下降可能性.这使程序能够偶然发现由于错误功能的缺陷而可能错过的尖峰.(我的算法在精神上类似于马尔可夫链蒙特卡罗积分.)

功能特征.要整合的功能是由于自然灾害导致的多个建筑物的保险政策损失估计.政策功能并不顺利:有免赔额,最高限额,分层数(例如,零赔偿支出高达100万美元,100%支付从1-2百万美元,然后零支付超过200万美元)和其他奇怪的政策条款.这引入了非线性行为和在许多平面中没有衍生物的函数.在政策功能之上是损坏功能,它根据建筑类型和飓风强度而变化,绝对不是钟形.

问题上下文:错误功能.困难在于选择一个好的错误功能.对于每个点,我记录对此有用的度量:函数的大小,由于先前的度量(一阶导数的代理)而改变了多少,该点占据的区域的体积(更大的体积可以更好地隐藏错误),以及与区域形状相关的几何因子.我的误差函数将是这些度量的线性组合,其中每个度量被赋予不同的权重.(如果我得到的结果很差,我会考虑非线性函数.)为了帮助我完成这项工作,我决定对每个权重的各种可能值进行优化,因此微软解决方案基金会.

要优化的内容:错误等级.我的测量标准化,从零到一.随着集成的进行以反映函数值,变化等的近期平均值,这些错误值会逐步修改.因此,我不是要创建一个产生实际错误值的函数,而是生成一个对其进行排序的数字.真正的错误,即如果所有采样点都按此估计误差值排序,则它们应该接收与按真实误差排序时所接收的等级相似的等级.

并非所有点都相同.如果#1真正错误的点区域排名#1000(反之亦然),我非常在意,但如果#500点排名#1000,则非常小心.我衡量成功的标准是在算法执行的中途将许多区域的以下总和最小化:

ABS(Log2(trueErrorRank) - Log2(estimatedErrorRank))

对于Log2,我使用的函数返回小于或等于数字的最大2的幂.从这个定义来看,得到有用的结果.交换#1和#2需要花费一分,但交换#2和#3不需要任何费用.这具有将点分为两个范围的幂的效果.在范围内交换的点不会添加到该函数中.

我如何评估.我已经构建了一个名为Rank的类来执行此操作:

  1. 按真实误差对所有地区排名一次.

  2. 对于每组独立的参数化权重,它计算该区域的试验(估计)误差.

  3. 按试验错误对区域进行排序.

  4. 计算每个地区的试验等级.

  5. 添加两个等级的日志的绝对差异,并将其称为参数化的值,因此要最小化的值.

C#代码.完成所有这些后,我只需要一种方法来设置Microsoft Solver Foundation以找到最佳参数.语法让我难过.这是我到目前为止的C#代码.在其中,您将看到我已经确定的三个问题的评论.也许你可以发现更多!任何想法如何使这项工作?

public void Optimize()
{
    // Get the parameters from the GUI and figures out the low and high values for each weight.
    ParseParameters();

    // Computes the true rank for each region according to true error.
    var myRanker = new Rank(ErrorData, false);

    // Obtain Microsoft Solver Foundation's core solver object. …
Run Code Online (Sandbox Code Playgroud)

c# ms-solver-foundation numerical-integration

18
推荐指数
1
解决办法
2525
查看次数

如何判断javascript对象是Image还是Canvas?

我有一个具有属性的类,可以是Image(即IMG元素)或Canvas.当我将它序列化为JSON时,我需要将其转换为文本字符串.如果它是Canvas,那么我可以调用Canvas#toDataURL.但如果它是一个Image,我首先需要使用Canvas#drawImage将其绘制到Canvas,然后使用toDataURL序列化该画布.

那么如何确定对象是Canvas还是Image?(因为Canvas#drawImage能够接受Image或Canvas对象作为参数,所以必须有办法.)

我已经看到一些程序员测试某些属性或函数是否存在以确定类,但我想知道如果这些对象提供的API发生变化,是否有更智能的方法不会中断.

javascript reflection canvas

16
推荐指数
3
解决办法
1万
查看次数

如何使用HTML Canvas执行填充?

有没有人在javascript中实现泛洪填充算法以用于HTML Canvas?

我的要求很简单:从单个点开始使用单一颜色泛光,其中边界颜色是指定点处颜色的某个特定值以上的任何颜色.

var r1, r2; // red values
var g1, g2; // green values
var b1, b2; // blue values
var actualColorDelta = Math.sqrt((r1 - r2)*(r1 - r2) + (g1 - g2)*(g1 - g2) + (b1 - b2)*(b1 - b2))

function floodFill(canvas, x, y, fillColor, borderColorDelta) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

更新:

我编写了自己的洪水填充实现,紧随其后.它很慢但很准确.大约37%的时间用于两个低级数组函数,这些函数是原型框架的一部分.我推测,它们是通过推和弹来调用的.其余大部分时间都花在主循环中.

var ImageProcessing;

ImageProcessing = {

  /* Convert HTML color (e.g. "#rrggbb" or "#rrggbbaa") to object with properties r, g, b, a. 
   * If no alpha value is given, …
Run Code Online (Sandbox Code Playgroud)

javascript canvas flood-fill

9
推荐指数
2
解决办法
8279
查看次数

除以整数时最小化舍入误差

我试图通过取一个整数乘积除以另一个整数乘积的比率来形成双精度浮点数(64位).我希望以减少舍入误差的方式这样做.

我熟悉Kahan加法和减法求和.什么技术适合分裂?

分子是许多长值(数万)的乘积,同样是分母.我也希望防止溢出和下溢.(一个应用程序通过在足够数量的术语后停止来估计无限产品.)

我尝试过的一件事是将易于计算的数字考虑在内(使用已知质数的试验除法高达一百万)并取消常见因素,这有助于,但还不够.我的错误大约是1.0E-13.

我在C#中工作,但欢迎任何使用IEEE标准浮点数的代码.

研究:

我遇到了一篇很好的论文,讨论了+ - x /,Horner规则(多项式)和平方根的EFT(无误差变换).标题是Philippe Langlois的"浮点4算术中的4个准确4算法".见http://www.mathematik.hu-berlin.de/~gaggle/S09/AUTODIFF/projects/papers/langlois_4ccurate_4lgorithms_in_floating_point_4rithmetic.pdf

上面我指的是卡普和马克斯坦(分裂):https://cr.yp.to/bib/199​​7/karp.pdf

floating-point rounding-error division numerical-methods

9
推荐指数
1
解决办法
799
查看次数

谁取消了我的任务?

我的C#任务正在取消,但不是我.我没有得到堆栈跟踪,我无法弄清楚问题发生的位置.

我的任务调用如下所示:

var t = Task<Boolean>.Factory.StartNew(() =>
    {
        Boolean bOk = DoSomthingImportant();
        return bOk;
    }, TaskCreationOptions.AttachedToParent)
    .ContinueWith<Boolean>((theTask) =>
    {
        var reason = theTask.IsCanceled ? "it was canceled" : "it faulted";
        Debug.WriteLine("Error: Task ended because " + reason + ".");
        ... log the exception to one of my objects...
        return false;
    }, TaskContinuationOptions.NotOnRanToCompletion);
Run Code Online (Sandbox Code Playgroud)

如果任务出现故障或被取消,我希望继续运行任务,但如果运行正常则不行.永远不会执行继续.

稍后我的程序会捕获一个包含TaskCanceledException的AggregateException.

我与我的任务的另一个主要交互是调用WaitAny(taskArray,timeout)直到我没有更多的任务要启动,然后在上一个任务完成之前调用WaitAll没有超时.

WaitAny有超时会导致取消吗?为什么我的继续没有被调用?

这只是我对Task库的第二次刷,所以我一无所知.

更新:

我发现了这个问题:如何将任务的已取消状态传播到延续任务.我上面的代码中的一个错误(但不是取消的原因)是我假设Continuation任务状态与原始任务的状态相同.事实上,你必须做一些工作来从另一个中获取一个,正如另一篇文章所描述的那样.

更新2:

布莱恩:感谢文件参考.我已经搜索了一个任务被取消的替代原因的高低搜索,但是错过了这些词:

"如果您正在等待转换到Canceled状态的Task,则会生成并抛出一个Task(包含在AggregateException中).请注意,此异常表示成功取消而不是出现故障.因此,Task的Exception属性返回null. "

.net c# task-parallel-library

8
推荐指数
1
解决办法
2009
查看次数

估计两个群集之间的最小距离

我正在为数百万个50-1000维点设计一个凝聚的,自下而上的聚类算法.在我的算法的两个部分中,我需要比较两个点的集群并决定两个集群之间的分离.的精确距离是接管点P1-P2的所有对,其中P1是从集群C1取出并P2从集群C2拍摄的最小欧几里得距离.如果C1具有X点且C2具有Y点,则这需要X*Y距离测量.

我目前估计这个距离需要X + Y测量:

  1. 找到簇C1的质心Ctr1.
  2. 在群集C2中找到最接近Ctr1的点P2.(Y比较.)
  3. 在C1中找到最接近P2的点P1.(X比较.)
  4. 从P1到P2的距离是簇C1和C2之间距离的近似度量.它是真实价值的上限.

如果簇是大致球形的,这非常有效.我的测试数据由椭球高斯簇组成,因此效果很好.但是,如果簇具有奇怪的,折叠的,弯曲的形状,则可能产生差的结果.我的问题是:

是否存在使用甚至少于X + Y距离测量的算法,并且在一般情况下产生良好的精度?

要么

是否有一种算法(像我的一样)使用X + Y距离测量,但提供的精度比我的更高?

(我在C#中对此进行编程,但是伪代码或任何其他语言的算法描述都很好.请避免使用R或Matlab中的专用库函数.具有概率保证的算法,如"距离的95%几率"在最小值的5%范围内"是可以接受的."

注意:我刚刚发现了这个相关的问题,它讨论了类似的问题,但不一定是针对高维度的问题.给定两个(大)点集,我如何有效地找到彼此最近的对?

注意:我刚刚发现这被称为双色最近对问题.

对于上下文,以下是整体聚类算法的概述:

  1. 第一次通过使用空间填充曲线(希尔伯特曲线)将最密集的区域合并成小的簇.它错过了异常值,并且经常无法合并彼此非常接近的相邻聚类.但是,它确实发现了一个特征性的最大连杆距离.所有以小于此特征距离分隔的点必须聚集在一起.此步骤没有预定义数量的集群作为其目标.

  2. 如果它们的最小距离小于最大连杆距离,则第二次通过通过将簇组合在一起来执行单连杆聚集.这不是层次聚类; 它是基于分区的.将组合彼此的最小距离小于该最大连杆距离的所有簇.此步骤没有预定义数量的集群作为其目标.

  3. 第三遍执行额外的单链接聚集,对所有簇间距离进行排序,并且仅组合簇,直到簇的数量等于预定义的目标簇数.它处理一些异常值,更喜欢只合并具有大簇的异常值.如果存在许多异常值(通常是异常值),则可能无法减少到目标的簇数.

  4. 第四遍将所有剩余的异常值与最近的大型集群组合在一起,但不会导致大型集群与其他大型集群合并.(这可以防止两个相邻的簇意外地合并,因为它们的异常值在它们之间形成一条细链.)

algorithm cluster-analysis distance approximation

8
推荐指数
1
解决办法
2416
查看次数

语法是什么?这个Ruby例子意味着什么?

我正在学习Ruby并在一些文档中找到了这个代码示例:

require 'find'

  total_size = 0

  Find.find(ENV["HOME"]) do |path|
    if FileTest.directory?(path)
      if File.basename(path)[0] == ?.
        Find.prune       # Don't look any further into this directory.
      else
        next
      end
    else
      total_size += FileTest.size(path)
    end
  end
Run Code Online (Sandbox Code Playgroud)

目的是总结树中所有文件的文件大小,不包括以点开头的目录.该行if File.basename(path)[0] == ?.显然正在执行目录名称测试.我会这样写的:

if File.basename(path)[0] == "."
Run Code Online (Sandbox Code Playgroud)

怎么?.办?(我想可能是一个错字.)我没有看到其他地方描述的这种语法.

ruby

6
推荐指数
1
解决办法
483
查看次数

将双精度数舍入到以位数给出的较低精度的有效方法

在C#中,我希望将双精度舍入到较低的精度,以便我可以将它们存储在关联数组中的不同大小的存储桶中.与通常的舍入不同,我想要舍入到一些重要的位.因此,大数字的绝对值会比小数字更改,但它们往往会按比例改变.因此,如果我想要舍入到10个二进制数字,我会找到十个最高有效位,并将所有低位都清零,可能会添加一个小数字进行舍入.

我更喜欢将"中途"数字四舍五入.

如果它是整数类型,这里可能是一个算法:

  1. Find: zero-based index of the most significant binary digit set H.
  2. Compute: B = H - P, 
       where P is the number of significant digits of precision to round
       and B is the binary digit to start rounding, where B = 0 is the ones place, 
       B = 1 is the twos place, etc. 
  3. Add: x = x + 2^B 
       This will force a carry if necessary (we round halfway values up).
  4. Zero …
Run Code Online (Sandbox Code Playgroud)

c# floating-point rounding

6
推荐指数
1
解决办法
1935
查看次数

需要SARGABLE方法来过滤记录,并指定NULL的默认值

我正在从客户端创建自定义数据的适配器.虽然我可以建议新的索引,但我无法更改其架构或修改其表中的值.方法是使用CTE连接和重新格式化自定义数据以使用我们的列名,枚举值等.重新格式化数据后,可以附加我们的标准CTE,并从中执行可以执行我们的标准分析的查询.

由于LEFT JOIN没有匹配,或者由于其数据中的值实际为NULL,因此重新格式化产生的某些值为NULL.

我的任务是在许多字段中替换NULL的默认值,并允许将WHERE子句插入到查询中.目前,ISNULL调用或CASE语句用于处理默认值.目前,在WHERE条件被命中时,已经执行了此替换,因此有权访问我们的查询构建器的最终用户可以过滤可能是默认值的值.如果过滤器值是默认值,则应选择具有使用默认值替换的NULL值的记录.

问题是如果我有myField = ISNULL(myField,'MyDefault')作为我的重新格式化公式,后来在洋葱的外层(后来的CTE)中有WHERE myField ='MyDefault',那么这个where子句不是sargable:查询优化器不会在myField上选择我的索引.

我发生的部分解决方案是不在我的内部CTE中进行任何NULL替换,然后有一个CTE来获取插入的WHERE子句,然后有一个外部CTE执行所有的NULL替换.这样的查询可以使用索引.(我已经验证了这一点.)然而,where子句不再期望对默认值的值的测试也会拾取具有NULL值的记录,因为尚未发生替换.

有没有办法执行空替换,允许SARGABLE在哪里过滤,并过滤NULL值,就好像它们保持默认值?

关于问题规模的说明:一个典型的例子涉及将一个600万的记录表加入一个700万条记录表,其中多对多关系创建了1200万条记录.当过滤器是SARGABLE时,查询大约需要10秒钟.当它不是SARGABLE时,一台机器需要10分钟以上,机器运行时需要3分钟以上.

关于CHOSEN解决方案的评论:

巧妙地使用交集来允许将字段比较为NULL或非NULL而不使用ISNULL或其他非可搜索函数可以通过对我们的遗留查询的最少更改来检测到我们的代码.

评论2:遗失案件

有这六种情况:

  1. 选定的值不为null,不等于默认值,与过滤器值不匹配.应该排除.
  2. 选定的值不为null,不等于默认值,DOES与过滤器值匹配.应包括.
  3. 选定的值不为空且DOES等于默认值且与过滤器值不匹配.应该排除.
  4. 选定的值不为空,DOES等于默认值,DOES与过滤器值匹配.应包括.
  5. 选定的值为null,筛选器值不是默认值.应该排除.
  6. 选定的值为null,筛选器值为默认值.应包括.

案例4使用提供的解决方案不起作用.所选字段不为空,因此交集的前半部分具有anon-null值的记录.但是在交集的后半部分,NULLIF语句创建了一个空值的记录.交叉点产生零记录.该记录被拒绝.我仍在寻找处理这种情况的解决方案.很近...

更新方案:

我有一个修复.说我适应[县名],我的默认值是'未知'...

where EXISTS (
    select [County Name] 
    intersect 
    (select NULLIF('User selected county name', 'Unknown') union select 'User selected county name')
)
Run Code Online (Sandbox Code Playgroud)

sql sql-server performance

6
推荐指数
1
解决办法
420
查看次数

是否有一个与Unix"which"命令类似的Perl模块?

我在Perlmonks上发现了这个很棒的列表:

http://www.perlmonks.org/?node_id=627015

但它缺少"which",即在PATH的所有目录中搜索可执行文件的函数.(我正在将一个Perl脚本移植到Windows.)

是否有一个模拟这个的Perl模块?

unix perl which

5
推荐指数
1
解决办法
3133
查看次数