mode (dominant) from numbers

This commit is contained in:
Arkadiusz Kondas 2016-05-08 19:23:54 +02:00
parent ed1e07e803
commit a761d0e8f2
2 changed files with 60 additions and 5 deletions

View File

@ -12,9 +12,13 @@ class Mean
* @param array $numbers * @param array $numbers
* *
* @return float * @return float
*
* @throws InvalidArgumentException
*/ */
public static function arithmetic(array $numbers) public static function arithmetic(array $numbers)
{ {
self::checkArrayLength($numbers);
return array_sum($numbers) / count($numbers); return array_sum($numbers) / count($numbers);
} }
@ -26,11 +30,10 @@ class Mean
* @throws InvalidArgumentException * @throws InvalidArgumentException
*/ */
public static function median(array $numbers) { public static function median(array $numbers) {
$count = count($numbers);
if (0 == $count) {
throw InvalidArgumentException::arrayCantBeEmpty();
}
self::checkArrayLength($numbers);
$count = count($numbers);
$middleIndex = floor($count / 2); $middleIndex = floor($count / 2);
sort($numbers, SORT_NUMERIC); sort($numbers, SORT_NUMERIC);
$median = $numbers[$middleIndex]; $median = $numbers[$middleIndex];
@ -42,4 +45,32 @@ class Mean
return $median; return $median;
} }
/**
* @param array $numbers
*
* @return mixed
*
* @throws InvalidArgumentException
*/
public static function mode(array $numbers)
{
self::checkArrayLength($numbers);
$values = array_count_values($numbers);
return array_search(max($values), $values);
}
/**
* @param array $array
*
* @throws InvalidArgumentException
*/
private static function checkArrayLength(array $array)
{
if (0 == count($array)) {
throw InvalidArgumentException::arrayCantBeEmpty();
}
}
} }

View File

@ -8,6 +8,15 @@ use Phpml\Math\Statistic\Mean;
class MeanTest extends \PHPUnit_Framework_TestCase class MeanTest extends \PHPUnit_Framework_TestCase
{ {
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testArithmeticThrowExceptionOnEmptyArray()
{
Mean::arithmetic([]);
}
public function testArithmeticMean() public function testArithmeticMean()
{ {
$delta = 0.01; $delta = 0.01;
@ -19,7 +28,7 @@ class MeanTest extends \PHPUnit_Framework_TestCase
/** /**
* @expectedException \Phpml\Exception\InvalidArgumentException * @expectedException \Phpml\Exception\InvalidArgumentException
*/ */
public function testThrowExceptionOnEmptyArrayMedian() public function testMedianThrowExceptionOnEmptyArray()
{ {
Mean::median([]); Mean::median([]);
} }
@ -38,4 +47,19 @@ class MeanTest extends \PHPUnit_Framework_TestCase
$this->assertEquals(3.5, Mean::median($numbers)); $this->assertEquals(3.5, Mean::median($numbers));
} }
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testModeThrowExceptionOnEmptyArray()
{
Mean::mode([]);
}
public function testModeOnArray()
{
$numbers = [5, 2, 6, 1, 3, 4, 6, 6, 5];
$this->assertEquals(6, Mean::mode($numbers));
}
} }