Annotation of embedaddon/ntp/scripts/monitoring/lr.pl, revision 1.1
1.1 ! misho 1: ;#
! 2: ;# lr.pl,v 3.1 1993/07/06 01:09:08 jbj Exp
! 3: ;#
! 4: ;#
! 5: ;# Linear Regression Package for perl
! 6: ;# to be 'required' from perl
! 7: ;#
! 8: ;# Copyright (c) 1992
! 9: ;# Frank Kardel, Rainer Pruy
! 10: ;# Friedrich-Alexander Universitaet Erlangen-Nuernberg
! 11: ;#
! 12: ;# Copyright (c) 1997 by
! 13: ;# Ulrich Windl <Ulrich.Windl@rz.uni-regensburg.de>
! 14: ;# (Converted to a PERL 5.004 package)
! 15: ;#
! 16: ;#############################################################
! 17:
! 18: package lr;
! 19:
! 20: ##
! 21: ## y = A + Bx
! 22: ##
! 23: ## B = (n * Sum(xy) - Sum(x) * Sum(y)) / (n * Sum(x^2) - Sum(x)^2)
! 24: ##
! 25: ## A = (Sum(y) - B * Sum(x)) / n
! 26: ##
! 27:
! 28: ##
! 29: ## interface
! 30: ##
! 31: ;# init(tag); initialize data set for tag
! 32: ;# sample(x, y, tag); enter sample
! 33: ;# Y(x, tag); compute y for given x
! 34: ;# X(y, tag); compute x for given y
! 35: ;# r(tag); regression coefficient
! 36: ;# cov(tag); covariance
! 37: ;# A(tag);
! 38: ;# B(tag);
! 39: ;# sigma(tag); standard deviation
! 40: ;# mean(tag);
! 41: #########################
! 42:
! 43: sub init
! 44: {
! 45: my $self = shift;
! 46:
! 47: $self->{n} = 0;
! 48: $self->{sx} = 0.0;
! 49: $self->{sx2} = 0.0;
! 50: $self->{sxy} = 0.0;
! 51: $self->{sy} = 0.0;
! 52: $self->{sy2} = 0.0;
! 53: }
! 54:
! 55: sub sample($$)
! 56: {
! 57: my $self = shift;
! 58: my($_x, $_y) = @_;
! 59:
! 60: ++($self->{n});
! 61: $self->{sx} += $_x;
! 62: $self->{sy} += $_y;
! 63: $self->{sxy} += $_x * $_y;
! 64: $self->{sx2} += $_x**2;
! 65: $self->{sy2} += $_y**2;
! 66: }
! 67:
! 68: sub B()
! 69: {
! 70: my $self = shift;
! 71:
! 72: return 1 unless ($self->{n} * $self->{sx2} - $self->{sx}**2);
! 73: return ($self->{n} * $self->{sxy} - $self->{sx} * $self->{sy})
! 74: / ($self->{n} * $self->{sx2} - $self->{sx}**2);
! 75: }
! 76:
! 77: sub A()
! 78: {
! 79: my $self = shift;
! 80:
! 81: return ($self->{sy} - B() * $self->{sx}) / $self->{n};
! 82: }
! 83:
! 84: sub Y()
! 85: {
! 86: my $self = shift;
! 87:
! 88: return A() + B() * $_[$[];
! 89: }
! 90:
! 91: sub X()
! 92: {
! 93: my $self = shift;
! 94:
! 95: return ($_[$[] - A()) / B();
! 96: }
! 97:
! 98: sub r()
! 99: {
! 100: my $self = shift;
! 101:
! 102: my $s = ($self->{n} * $self->{sx2} - $self->{sx}**2)
! 103: * ($self->{n} * $self->{sy2} - $self->{sy}**2);
! 104:
! 105: return 1 unless $s;
! 106:
! 107: return ($self->{n} * $self->{sxy} - $self->{sx} * $self->{sy}) / sqrt($s);
! 108: }
! 109:
! 110: sub cov()
! 111: {
! 112: my $self = shift;
! 113:
! 114: return ($self->{sxy} - $self->{sx} * $self->{sy} / $self->{n})
! 115: / ($self->{n} - 1);
! 116: }
! 117:
! 118: sub sigma()
! 119: {
! 120: my $self = shift;
! 121:
! 122: return 0 if $self->{n} <= 1;
! 123: return sqrt(($self->{sy2} - ($self->{sy} * $self->{sy}) / $self->{n})
! 124: / ($self->{n}));
! 125: }
! 126:
! 127: sub mean()
! 128: {
! 129: my $self = shift;
! 130:
! 131: return 0 if $self->{n} <= 0;
! 132: return $self->{sy} / $self->{n};
! 133: }
! 134:
! 135: sub new
! 136: {
! 137: my $class = shift;
! 138: my $self = {
! 139: (n => undef,
! 140: sx => undef,
! 141: sx2 => undef,
! 142: sxy => undef,
! 143: sy => undef,
! 144: sy2 => undef)
! 145: };
! 146: bless $self, $class;
! 147: init($self);
! 148: return $self;
! 149: }
! 150:
! 151: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>