在Haskell中实现类似以下内容的最惯用方法是什么:
foldl (+) 0 [1,2,3,4,5]
--> 15
Run Code Online (Sandbox Code Playgroud)
或者它在Ruby中的等价物:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
Run Code Online (Sandbox Code Playgroud)
显然,Python提供了reduce函数,这是fold的实现,完全如上所述,然而,有人告诉我,'pythonic'编程方式是避免使用lambda术语和高阶函数,在可能的情况下更喜欢列表推导.因此,有没有一种首选的方法来折叠Python中的列表或类似列表的结构,而不是reduce函数,或者是reduce实现这一目的的惯用方法?
我正在考虑编写一个小库,从预定的候选列表中猜出(RGB值)颜色的名称.
我的第一次尝试纯粹基于三维RGB颜色空间内的毕达哥拉斯距离 - 这并不是大规模成功,因为大多数命名颜色点位于空间的边缘(例如蓝色在0,0,255),所以,对于空间中间的大多数颜色,它最接近的命名颜色是相当随意的.
所以,我正在考虑更好的方法,并提出了一些候选人
HSV色彩空间内的圆柱形距离 - 可能与上述类似的问题,然而,HSV似乎在人类意义上比RGB更有意义,这可能是有用的.
上述任何一种,但每个命名的色点用一个任意值加权,该值表示其对周围空间中的点的吸引力.这样的模型有名字吗?我意识到这有点模糊,但对我来说这似乎是一个相当直观的想法.
一个贝叶斯网络,它检查HSV颜色的属性并返回最可能的颜色名称(我想象的节点类似于,例如P(黑色|饱和度<10),P(红色|色调= 0),但是,这似乎不太理想 - 例如,给定颜色为红色的概率与其色调与0的接近程度成正比,而不是离散值.是否有一种方法可以调整贝叶斯网络来处理连续的概率变量被测试?
最后,我想知道在HSV或RGB色彩空间内是否有某种基于支持向量机的分类,但对这些并不是非常熟悉,我不确定这是否会比基于毕达哥拉斯距离的方法提供任何特别的优势我最初尝试过,特别是因为我只处理三维空间.
因此,我想知道,您是否有任何类似问题的经验,或者知道任何可能帮助我决定方法的资源?如果有人能指出我正确的方向(无论是上述之一,还是完全不同的东西),我将非常感激.
干杯!
蒂姆
statistics artificial-intelligence classification bayesian bayesian-networks
我在我正在研究的rails应用程序中遇到了这个相当奇怪的行为.
我在继承heirarchy中有多种类型的Post,以及Post has_many FeedEntries.
class Post < ActiveRecord::Base
has_many :feed_entries
end
class Post::BlogPost < Post; end
class Post::Discussion < Post; end
class Post::Article < Post; end
class FeedEntry < ActiveRecord::Base
belongs_to :post
end
Run Code Online (Sandbox Code Playgroud)
现在,当我像以前一样设置所有内容时,在保存的对象上调用FeedEntry#post总是返回正确(子类)类型的对象,正如我所期望的那样.但是,如果我使Post摘要(它确实应该是 - 在这个模型中永远不应该实例化超类):
class Post < ActiveRecord::Base
has_many :feed_entries
self.abstract_class = true
end
Run Code Online (Sandbox Code Playgroud)
_(注意:我编辑了这段代码片段以考虑下面的tomafro建议,因为设置self.abstract_class似乎比覆盖self.abstract_class更惯用?但是,相同的行为仍然存在.)
...然后在先前保存的对象上调用FeedEntry#post关联返回Post类型的对象.这看起来相当倒退(假设抽象类声明明确表示该类不应该被实例化),我想不出这种行为的原因.
那么,有什么理由我没有得到,或者它是一个错误,还是其他什么?
假设我有一个名为LongArrayWritable的类型,它是一个Longs数组的盒装表示.我有隐式定义,在这些类型之间转换:
implicit def boxLongArray(array: Array[Long]) : LongArrayWritable { /*elided*/}
implicit def unboxLongArray(array: LongArrayWritable) : Array[Long] { /*elided*/}
Run Code Online (Sandbox Code Playgroud)
现在,我也有一些暗示,它们以通用形式在java.lang.Iterable和scala.collection.List [X]之间进行转换:
implicit def iterator2list[X](it : java.lang.Iterable[X]) : List[X] { /* elided */ }
implicit def list2iterator[X](list : List[X]) : java.lang.Iterable[X] { /* elided */ }
Run Code Online (Sandbox Code Playgroud)
使用这些定义,scala编译器可以推断java.lang.Iterable [LongArrayWritable]和List [Array [Long]](相当于iterator2list(iterator).map(unboxLongArray(_)))之间的隐式转换,或者这超出了implicits的功能,因此需要它自己的(显式?)隐式定义?
谢谢,
蒂姆
activerecord ×1
bayesian ×1
belongs-to ×1
fold ×1
generics ×1
implicits ×1
list ×1
python ×1
reduce ×1
scala ×1
statistics ×1
sti ×1
types ×1