How to resolve the algorithm Deming's funnel step by step in the Haskell programming language
How to resolve the algorithm Deming's funnel step by step in the Haskell programming language
Table of Contents
Problem Statement
W Edwards Deming was an American statistician and management guru who used physical demonstrations to illuminate his teachings. In one demonstration Deming repeatedly dropped marbles through a funnel at a target, marking where they landed, and observing the resulting pattern. He applied a sequence of "rules" to try to improve performance. In each case the experiment begins with the funnel positioned directly over the target.
Apply the four rules to the set of 50 pseudorandom displacements provided (e.g in the Racket solution) for the dxs and dys. Output: calculate the mean and standard-deviations of the resulting x and y values for each rule.
Note that rules 2, 3, and 4 give successively worse results. Trying to deterministically compensate for a random process is counter-productive, but -- according to Deming -- quite a popular pastime: see the Further Information, below for examples.
Stretch goal 1: Generate fresh pseudorandom data. The radial displacement of the drop from the funnel position is given by a Gaussian distribution (standard deviation is 1.0) and the angle of displacement is uniformly distributed.
Stretch goal 2: Show scatter plots of all four results.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Deming's funnel step by step in the Haskell programming language
This Haskell code defines a function funnel
that takes a binary operator and a list of values and applies the operator to each pair of consecutive values in the list, returning the list of the results. It also defines functions to calculate the mean and standard deviation of a list of values.
The experiment
function is the main function of the program. It takes a label, two lists of values, and a binary operator, then calculates and prints the mean and standard deviation of the results of applying the operator to each pair of values in the lists.
The code is used to test four different rules:
- Rule 1: No operation
- Rule 2: Subtract the second value from the first
- Rule 3: Subtract the sum of the two values from the second value
- Rule 4: Add the two values
Here is a breakdown of the code:
-
The
funnel
function takes a binary operator and a list of values as input, and returns the list of the results of applying the operator to each pair of consecutive values in the list. For example, if the operator is+
and the list is[1, 2, 3, 4, 5]
, the result will be[3, 5, 7, 9]
. The code uses themapAccumL
function from theData.List
module to do this. ThemapAccumL
function takes a binary operator, an initial value, and a list, and returns the list of the results of applying the operator to each element in the list, starting with the initial value. In this case, the initial value is0
and the operator is the binary operator passed to thefunnel
function. -
The
mean
function takes a list of values as input, and returns the mean of the values. The code uses thesum
function from theData.List
module to calculate the sum of the values, and thegenericLength
function from theData.List
module to calculate the length of the list. The mean is then calculated by dividing the sum of the values by the length of the list. -
The
stddev
function takes a list of values as input, and returns the standard deviation of the values. The code uses thesum
function from theData.List
module to calculate the sum of the squared differences between each value and the mean. The standard deviation is then calculated by taking the square root of the sum of the squared differences divided by the length of the list. -
The
experiment
function takes a label, two lists of values, and a binary operator as input, and prints the mean and standard deviation of the results of applying the operator to each pair of values in the lists. The code first calls thefunnel
function to calculate the list of results, then calls themean
andstddev
functions to calculate the mean and standard deviation of the results. The results are then printed to the console. -
The
main
function calls theexperiment
function four times, using different labels, lists of values, and binary operators each time. The results are printed to the console.
Source code in the haskell programming language
import Data.List (mapAccumL, genericLength)
import Text.Printf
funnel :: (Num a) => (a -> a -> a) -> [a] -> [a]
funnel rule = snd . mapAccumL (\x dx -> (rule x dx, x + dx)) 0
mean :: (Fractional a) => [a] -> a
mean xs = sum xs / genericLength xs
stddev :: (Floating a) => [a] -> a
stddev xs = sqrt $ sum [(x-m)**2 | x <- xs] / genericLength xs where
m = mean xs
experiment :: String -> [Double] -> [Double] -> (Double -> Double -> Double) -> IO ()
experiment label dxs dys rule = do
let rxs = funnel rule dxs
rys = funnel rule dys
putStrLn label
printf "Mean x, y : %7.4f, %7.4f\n" (mean rxs) (mean rys)
printf "Std dev x, y : %7.4f, %7.4f\n" (stddev rxs) (stddev rys)
putStrLn ""
dxs = [ -0.533, 0.270, 0.859, -0.043, -0.205, -0.127, -0.071, 0.275,
1.251, -0.231, -0.401, 0.269, 0.491, 0.951, 1.150, 0.001,
-0.382, 0.161, 0.915, 2.080, -2.337, 0.034, -0.126, 0.014,
0.709, 0.129, -1.093, -0.483, -1.193, 0.020, -0.051, 0.047,
-0.095, 0.695, 0.340, -0.182, 0.287, 0.213, -0.423, -0.021,
-0.134, 1.798, 0.021, -1.099, -0.361, 1.636, -1.134, 1.315,
0.201, 0.034, 0.097, -0.170, 0.054, -0.553, -0.024, -0.181,
-0.700, -0.361, -0.789, 0.279, -0.174, -0.009, -0.323, -0.658,
0.348, -0.528, 0.881, 0.021, -0.853, 0.157, 0.648, 1.774,
-1.043, 0.051, 0.021, 0.247, -0.310, 0.171, 0.000, 0.106,
0.024, -0.386, 0.962, 0.765, -0.125, -0.289, 0.521, 0.017,
0.281, -0.749, -0.149, -2.436, -0.909, 0.394, -0.113, -0.598,
0.443, -0.521, -0.799, 0.087]
dys = [ 0.136, 0.717, 0.459, -0.225, 1.392, 0.385, 0.121, -0.395,
0.490, -0.682, -0.065, 0.242, -0.288, 0.658, 0.459, 0.000,
0.426, 0.205, -0.765, -2.188, -0.742, -0.010, 0.089, 0.208,
0.585, 0.633, -0.444, -0.351, -1.087, 0.199, 0.701, 0.096,
-0.025, -0.868, 1.051, 0.157, 0.216, 0.162, 0.249, -0.007,
0.009, 0.508, -0.790, 0.723, 0.881, -0.508, 0.393, -0.226,
0.710, 0.038, -0.217, 0.831, 0.480, 0.407, 0.447, -0.295,
1.126, 0.380, 0.549, -0.445, -0.046, 0.428, -0.074, 0.217,
-0.822, 0.491, 1.347, -0.141, 1.230, -0.044, 0.079, 0.219,
0.698, 0.275, 0.056, 0.031, 0.421, 0.064, 0.721, 0.104,
-0.729, 0.650, -1.103, 0.154, -1.720, 0.051, -0.385, 0.477,
1.537, -0.901, 0.939, -0.411, 0.341, -0.411, 0.106, 0.224,
-0.947, -1.424, -0.542, -1.032]
main :: IO ()
main = do
experiment "Rule 1:" dxs dys (\_ _ -> 0)
experiment "Rule 2:" dxs dys (\_ dz -> -dz)
experiment "Rule 3:" dxs dys (\z dz -> -(z+dz))
experiment "Rule 4:" dxs dys (\z dz -> z+dz)
You may also check:How to resolve the algorithm Stirling numbers of the second kind step by step in the Perl programming language
You may also check:How to resolve the algorithm Numbers which are not the sum of distinct squares step by step in the Julia programming language
You may also check:How to resolve the algorithm Sorting algorithms/Insertion sort step by step in the Qi programming language
You may also check:How to resolve the algorithm Dot product step by step in the JavaScript programming language
You may also check:How to resolve the algorithm Multiplication tables step by step in the N/t/roff programming language