Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 用另一个列表(也就是数组)缩放(n元组或列表)列表的惯用F#方法是什么?_Arrays_List_F#_Neural Network - Fatal编程技术网

Arrays 用另一个列表(也就是数组)缩放(n元组或列表)列表的惯用F#方法是什么?

Arrays 用另一个列表(也就是数组)缩放(n元组或列表)列表的惯用F#方法是什么?,arrays,list,f#,neural-network,Arrays,List,F#,Neural Network,给定: let weights = [0.5;0.4;0.3] let X = [[2;3;4];[7;3;2];[5;3;6]] 我想要的是:wX=[(0.5)*[2;3;4];(0.4)*[7;3;2];(0.3)*[5;3;6] 想知道一种优雅的方法来处理列表和数组。如果我理解正确,欢迎提供其他优化信息 let wX = weights |> List.map (fun w -> X |> List.map (fun (a, b, c) ->

给定:

let weights = [0.5;0.4;0.3]
let X = [[2;3;4];[7;3;2];[5;3;6]]
我想要的是:
wX=[(0.5)*[2;3;4];(0.4)*[7;3;2];(0.3)*[5;3;6]


想知道一种优雅的方法来处理列表和数组。如果我理解正确,欢迎提供其他优化信息

let wX = weights |> List.map (fun w ->
    X |> List.map (fun (a, b, c) ->
        w * float a,
        w * float b,
        w * float c))

您编写了一个列表列表,但代码显示了一个元组列表。如果能够自由地对此进行调整,解决方案将是

let weights = [0.5;0.4;0.3]
let X = [[2;3;4];[7;3;2];[5;3;6]]
X
|> List.map2 (fun w x -> 
    x 
    |> List.map (fun xi -> 
        (float xi) * w
    )
) weights
根据您对语法的熟悉程度,您可能更喜欢像

List.map2 (fun w x -> List.map (float >> (*) w) x) weights X

序列(
Seq.map2
Seq.map
)和数组(在
Array
模块中)存在相同的库函数.

这不仅仅是对特定问题的回答,但在评论中聊天并了解到该问题是F#中神经网络的一部分后,我发布了这篇文章,其中涵盖了该问题并实现了神经网络的前馈部分。它利用

这段代码是对源代码的部分Python代码的F#翻译

python
def backprop(self,x,y):
“Return a tuple``(nabla\u b,nabla\u w)``表示
成本函数C_x的梯度,`nabla_b``和
``nabla_w``是numpy数组的逐层列表,类似于
到“自我偏见”和“自我权重”
nabla_b=[b在自偏压中的np.Zero(b.shape)]
nabla_w=[np.零(w.形状)表示自权重中的w]
#前馈
激活=x
activations=[x]#列出以逐层存储所有激活
zs=[]#列出以逐层存储所有z向量
对于拉链中的b、w(自偏压、自重量):
z=np.点(w,活化)+b
附加(z)
激活=乙状结肠(z)
activations.append(激活)
F# 首先,X的值需要转换为float

let x1 = [[2.0;3.0;4.0];[7.0;3.0;2.0];[5.0;3;0;6;0]]
现在请注意x1是一个矩阵,权重是一个向量

所以我们可以乘

 let wx1 = weights * x1
因为我验证代码的方法比大多数方法都要复杂一些,所以我将对其进行解释,这样您就不会对其有效性产生怀疑

当使用神经网络,特别是小批量时,权重和偏差的起始数字是随机的,小批量的生成也是随机的

我知道最初的Python代码是有效的,我能够成功地运行它,并获得与书中所示相同的结果,这意味着最初的成功与书中的成功相差不到百分之几,并且成功的图表是相同的。正如书中所讨论的那样,我对神经网络进行了多次运行和配置。然后我运行了F#代码,得到了相同的图形

我还将Python代码中的起始随机数集复制到F#代码中,这样,虽然生成的数据是随机的,但Python和F#代码都使用相同的起始数,其中有数千个。然后,我单步执行Python和F#代码,以验证每个单独的函数是否返回了一个可比较的浮点值,例如,我在每一行上放置了一个断点,并确保检查了每一行。这实际上花了几天时间,因为我必须编写导出和导入代码,并将数据从Python传递到F#

见:



我还尝试了一种变体,用链表替换了F#list,但没有发现速度有所提高,例如
LinkedList
。这是一个有趣的练习。

这是使用Math.Net实现这一点的另一种方法:

你的意思是0.5*[2 3 4]?“[2,3,4;7,3,2;5,3,6]”不是列表。这是一个三元组列表,
int*int*int
这是用于神经网络的吗?如果是这样的话,你可能想看看使用的矩阵函数,我偷偷看了看你的个人资料,看到你正在使用机器学习。请注意,很多神经网络都是用Python完成的,Python也有,这使得在Python中使用不同大小的矩阵很容易,但在F#中就更难了。因此,当您使用sigmoid函数分割X时,您可能会感兴趣,您可以使用let chunkedWeights=weights |>Seq.chunkBySize 3thanks,但是,如果X是nxn而不是3x3呢?那么它应该是一个列表而不是元组,@Anton的答案已经解决了这个问题。list.map2 FTW!:)感谢您纠正我的问题,也很高兴看到双重方法,您已经回答了我的问题两次:)顺便说一句,我想知道是否有一个库可以轻松执行标准矩阵运算,如缩放、线性和等,就像R或Matlab一样,这种方法似乎非常复杂,将重点从what to how上移开。MSDN有一个概览列表,这篇文章是从2010年开始的,但是一些库仍然存在。我听说了一些好东西,但我自己没有用过。你用_uu.Foo作为惯例吗?@D.S.不,
\u uuu.Foo
是一个成员的例子。请看:我很少在函数代码中使用成员,但我在这里这样做是因为当我翻译时,我希望代码尽可能接近原始代码。我也避免像瘟疫一样的可变项,但这里有数千个可变项作为矩阵的一部分。就像诗歌一样,在你理解规则之前,你是不允许违反规则的。@D.s.就像我一年前做的那样,这本书是一本活生生的书,看起来这本书有些地方已经改变了。我将不得不重新阅读它,看看更新了什么。@D.S.我添加了更多的代码以将实例放到上下文中。我知道这很难说,但如果你在
weight*激活后单击我答案中的
*
,你会看到它是指向你刚刚发布的内容的链接。啊,差点错过了那个链接。顺便说一句,你的扩展是一个令人惊讶的解释。非常感谢。谢谢。我计划在GitHub上把整本书翻译成F#,但我仍然要做卷积神经网络,而将其翻译成F#比第一部分要复杂一些。演习后,
let x1 = [[2.0;3.0;4.0];[7.0;3.0;2.0];[5.0;3;0;6;0]]
 let wx1 = weights * x1