如何正确实施和验证感知器&;用梯度下降法学习Haskell中的基本布尔函数?

如何正确实施和验证感知器&;用梯度下降法学习Haskell中的基本布尔函数?,haskell,machine-learning,neural-network,boolean-logic,perceptron,Haskell,Machine Learning,Neural Network,Boolean Logic,Perceptron,我试图在Haskell中构造一个感知器单元来学习布尔And和Or函数,就像Mitchell的书一样 我很确定我的梯度下降是正确的,但我正在努力验证它是否真的学习了alrogithm。我有三个问题,贴在下面的代码之间 (i) 我的梯度下降的实现正确吗 (ii)如果是,是否学习“最佳”权重 (iii)如何验证正确学习了重量。oor和aand是将布尔对插入书中给出的权重时的值,但我认为sgn阈值会应用于这些值?如果这是正确的评估假设,那么Mitchells解决方案会猜测相同的and或函数。我的学习和/

我试图在Haskell中构造一个感知器单元来学习布尔And和Or函数,就像Mitchell的书一样

我很确定我的梯度下降是正确的,但我正在努力验证它是否真的学习了alrogithm。我有三个问题,贴在下面的代码之间

(i) 我的梯度下降的实现正确吗

(ii)如果是,是否学习“最佳”权重

(iii)如何验证正确学习了重量。oor和aand是将布尔对插入书中给出的权重时的值,但我认为sgn阈值会应用于这些值?如果这是正确的评估假设,那么Mitchells解决方案会猜测相同的and或函数。我的学习和/或功能(在ans1、ans2中评估)是否不正确

import System.Random

-- for generating random initial weights
randomList :: Int -> [Double]
randomList seed = randoms (mkStdGen seed) :: [Double]

dotProd x y = foldr (+) 0 $ zipWith (*) x y

gdHelper [] _ del_w _ _ = del_w
gdHelper (x:xs) (t:ts) y@(weight:weights) w nu = gdHelper xs ts del_w w nu
  where del_w = zipWith (+) y (map (*asdf) x)
        asdf = nu * (t - o) 
        o = dotProd w x

gd _  _  _  w _  0 = w
gd xs ts ws w nu n = gd xs ts [0,0,0] w2 nu (n-1)
  where w2 = zipWith (+) w delW
        delW = gdHelper xs ts ws w nu

-- initial weights
w = map (/20) $ take 3 $ randomList 30

trainingData = [([1,1],1),([1,-1],-1),([-1,1],-1),([-1,-1],-1)]
andData = map (1:) (map fst trainingData) 
andOuts = map snd trainingData
orOuts = [1,1,1,-1]

gdand = gd andData andOuts [0,0,0] w 0.02 10000
gdor = gd andData orOuts [0,0,0] w 0.01 10000

ans1 = map (dotProd gdand) andData 
ans2 = map (dotProd gdor) andData 

-- trying to verify this from the book
aand = map (dotProd [-0.8,0.5,0.5]) andData 
oor = map (dotProd [-0.3,0.5,0.5]) andData 
米切尔:

编辑:
接下来,假设我想为布尔值输入上的数据复制新的布尔and和Or。替换以下代码,几何图形保持不变。(w1=w2=1/2,截距为其原始值的1/2)。但是,因为数据已经被缩放(1/2)和转换(1/2,1/2)),我的算法现在学习了错误的函数`andData=map(1:)[[x,y]|x我怀疑书中有一个打字错误:OR的阈值应该是0.3,而不是-0.3。在我做了更改后,我用以下方式验证感知机是否正确:

> map signum aand == andOuts
True
> map signum oor == orOuts
True
> map signum ans1 == andOuts
True
> map signum ans2 == orOuts
True

前两种方法验证书本权重的固定版本是否合适;后两种方法验证通过梯度下降学习的权重是否合适。

假设我要复制布尔值输入数据的And和Or。几何图形保持不变。(w1=w2=1/2,截距为原始值的1/2).但是,数据已经缩放(1/2)和转换(1/2,1/2)),现在我们学习了错误的函数。(
andData=map(1:)[[x,y]| x
> map signum aand == andOuts
True
> map signum oor == orOuts
True
> map signum ans1 == andOuts
True
> map signum ans2 == orOuts
True