The graph you provided is upside down
That's irrelevant. It does not affect the veracity of the plot.
But as it seems to bother you; I've posted the same graph flipped vertically (with a couple of additions) below.
Correct Graph
Your link leads to a page that reads: This image or video is currently unavailable.
Please provide your spreadsheet that you used to generate it,
I didn't use a spreadsheet. This is a Perl site. I used Perl :)
I am very confused how you could even make that happen. You'd have to have multiplied all y values with a -1 to cause such a thing.
Or; plot the data on a medium that has the origin top left with Y running top to bottom. As is the convention with most computer graphics.
The 3 curves presented here are not to scale and lack axes. As such they misrepresent the meaningfulness of the first derivative in peak detection.
Since all the Y values on the three curves are related numerically, their absolute values are irrelevant. Hence scales are superfluous.
The X values are the same, drawn to the same scale and offset for all three plots.
Your conclusion that upside down derivatives are not useful in peak detection is in fact correct. I assure you that a correctly oriented first derivative is useful for this type of problem.
Sorry, but that makes no sense at all. Since the important points are where the curves transition across the Y=0 line. Whether that transition occurs going from above to below or below to above doesn't change anything one iota.
If you redraw it to scale with axes you will notice that any time the first derivative crosses the x axis (aka it is zero) there will be a peak.
If that were the case, I would not have posted. Take another, closer look at the graph.
The additional black horizontal line is the x-axis (Y=0) of both the 1st (green) and 2nd (blue) derivative plots. The additional black vertical lines mark the peaks and troughs in the data plot (red).
Note how the 1st derivative plot (green) doesn't transition 0 at all for the first two turning points, and is substantially inaccurate for turning points four and six; slightly inaccurate for the fifth; leaving just 2: the third and seventh that it hits accurately.
You may now be wondering how the black vertical lines were drawn.
If you subtract consecutive data points and compare the results to 0: my @deltas = map{ ( 0 <=> $y[$_-1] - $y[$_] ) } 1 .. $#y;
You get a dataset like this: -1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1 1 -1 -1 -1 -1 1 1
+1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1
You then plot a vertical line at the X value everwhere the sign changes: $deltas[$_-1] != $deltas[$_] and $im->line( $x[$_], 0, $x[$_], 800, 0
+) for 1 .. $#x-1;
And there you have your maxima and minima simply, directly, and accurately.
With a very small perl program (less than 200 lines) I have a peak detector that works pretty well for this type of psuedo-sinusoidal data.
So verbose!? :)
Here is my Perl code, a whole 40 lines, that plots the above linked graph:
#! perl -slw
use strict;
use Data::Dump qw[ pp ];
use GD;
use constant {
WHITE => unpack( 'N', pack 'CCCC', 0, 255, 255, 255 ),
RED => unpack( 'N', pack 'CCCC', 0, 255, 0, 0 ),
GREEN => unpack( 'N', pack 'CCCC', 0, 0, 255, 0 ),
BLUE => unpack( 'N', pack 'CCCC', 0, 0, 0, 255 ),
};
my( @x, @y, @yd1, @yd2 );
( $x[@x], $y[@y], $yd1[@yd1], $yd2[@yd2] ) = map{ $_ //= 0 } split whi
+le <DATA>;
chomp @yd2;
$_ = ( $_ -4 ) * 1000 for @x;
$_ /= 6 for @y;
$_ = $_ / 320 + 400 for @yd1;
$_ = $_ / 8000 + 400 for @yd2;
my $im = GD::Image->new( 1000, 800, 1 );
$im->filledRectangle( 0, 0, 1000, 800, WHITE );
$im->line( 0, 400, 1000, 400, 0 );
$im->line( $x[$_-1], $y[$_-1], $x[$_], $y[$_], RED ) for 1 .. $#x;
$im->line( $x[$_-1], $yd1[$_-1], $x[$_], $yd1[$_], GREEN ) for 2 .. $#
+x-1;
$im->line( $x[$_-1], $yd2[$_-1], $x[$_], $yd2[$_], BLUE ) for 3 .. $#x
+-2;
my @deltas = map{ ( 0 <=> $y[$_-1] - $y[$_] ) } 1 .. $#y;
$deltas[$_-1] != $deltas[$_] and $im->line( $x[$_], 0, $x[$_], 800, 0
+) for 1 .. $#x-1;
$im->flipVertical;
open PNG, '>:raw', "$0.png" or die $!;
print PNG $im->png;
close PNG;
system 1, "$0.png";
And the dataset taken directly from salva's post above:
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
| [reply] [d/l] [select] |
Strawman?
Our discussion here is in reply to the parent who made a claim that the second derivative was useful in finding extrema. I have posted so that future readers will not believe this, as I believe it to be untrue. In reply to my claim you have posted a number interesting things - but none seemingly address the claims of the parent, or myself.
The OP claims that the second derivative is useful for determining extrema. His claim suggests that looking at toggling signs on the resulting series indicates extrema. I claim this as *false*.
I also claim that it is possible to find extrema using the first derivative. Any time the derivative crosses the X axis there will be a maxima or minima present within the source series. I do *not* claim that this will find all extrema - I do claim that it will also require additional processing to capture all extrema of interest. Are you claiming this is false?
Your above program is quite a bit shorter than mine. I have a different type of data, but I am pretty sure that looking at deltas like this is a more precise and efficient way of solving the problem than using first derivatives - I disagree that it's more accurate, but that's nitpicking. Overall it is better than doing solely a first derivative and picking from that.
Finally, I strongly disagree that using inverted graphs (even if that's what's used in computer graphics) is a good way to prove your point about much of anything. That said, had you labelled your graph and explained what it was I we both could have saved some time
| [reply] |
Strawman?
Hardly.
The age old problem with first (and second) deritives -- along with many other numerical methods -- is that they have a tendency to discover values that don't exist in the dataset. Ie. calculated values that fall between the discrete values that are actually in the dataset.
Whilst this is fine for theoretical discussion -- rounded to some number of sig.fig. -- it leaves real-world applications with the need to fall back upon heuristics -- ie. guesses -- in order to "correct" calculated values and align them with the actual data.
Imagine the dataset represents clock-speed (or power drain) from a deep-bin sort of newly minted cpus. -- ie. when cpus are manufactured, there is some considerable variability in their electrical performance; and manufacturers can sort the parts by their actual performance, and charge premium prices for the better ones.
In the many all-too-real scenarios like this that crop up in manufacturing every day, having calculated maxima and minima that fall at theoretical points on the curve; between the actual values that are there, isn't very useful for the selection processes that are the reason for performing the calculation in the first place.
So no, not a strawman. A legitimate and relevant discussion in context.
I accept that my original graph was, as presented, difficult to interpret. But I anticipated that anyone interested would
- produce their own graph to verify the accuracy of my quick plots and conclusions.
Which you did.
- Inspect their own plots carefully and notice the obvious discrepancies that I noticed in mine.
Which you did not.
That's the trouble with "pretty graphs". People get so impressed by the pictures, they forget to inspect them closely and take note of why they produced them in the first place.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
| [reply] |