|
|
|
ขอความช่วยเหลือเกี่ยวกับ Function standard deviation หน่อยค่ะ |
|
|
|
|
|
|
|
ถ้าเราจะดึงจากฐานข้อมูลตามเงื่อนไข โดยยกตัวอย่างมา 3 เรคอร์ด จากค่าตัวเลขด้านล่าง
เราลองเขียนคำสั่ง foreach ($a as $i) แต่ติดปัญหากับ function standard_deviation ตัวนี้ค่ะ
เราอยากให้คำสั่งมันทำงานจากที่เราได้ดึงข้อมูลจากฐานข้อมูลมาค่ะ
$std_array[] = array(0.64,1.66,2.43,1.24,1.56);
$std_array[] = array(1.56,1.21,1.09,1.70,2.22);
$std_array[] = array(2.39,1.78,2.50,1.89,1.40);
EX. ตัวอย่าง
Code (PHP)
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
$std_array = array(0.64,1.66,2.43,1.24,1.56,1.21,1.09,1.70,2.22,2.39,1.78,2.50,1.89,1.40);
$STD = standard_deviation($std_array);
echo number_format($STD , 2);
อ้างอิง : http://php.net/manual/en/function.stats-standard-deviation.php
Tag : PHP, MySQL, HTML/CSS, JavaScript, jQuery, CakePHP
|
ประวัติการแก้ไข 2013-07-30 10:19:02
|
|
|
|
|
Date :
2013-07-30 10:16:39 |
By :
phoenix10 |
View :
2949 |
Reply :
24 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แอบงงคำถามนะครับ
คือคุณไม่สามารถ เรียกฟังก์ชั่น standard_deviation หลังจากการ query ข้อมูลหรือยังไงครับ
จะให้ดีรบกวน แปะโค้ดเต็มๆที่เขียนลงมาเลยครับจะได้ช่วยดูว่า Logic Error ตรงไหน
|
|
|
|
|
Date :
2013-07-30 10:56:56 |
By :
zinlucifer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เราลองทำตามโค๊ดตัวนี้ดู แต่ทำไม่ได้จิงๆค่ะ
มันเป็นการหาค่า STD เหมือนกัน ช่วยหน่อยนะค่ะ
Code (PHP)
<?php
//-- ส่วนที่ดึงจากฐานข้อมูล
$sample[0] = (float) $_GET['x0'];
$sample[1] = (float) $_GET['x1'];
$sample[2] = (float) $_GET['x2'];
$sample[3] = (float) $_GET['x3'];
$sample[4] = (float) $_GET['x4'];
$array_count = 0;
$array_total = 0;
$mean = 0;
$array_count_minus_one = $array_count - 1;
$random_array = array();
$newarray = array();
$array_total_newarray = 0;
$mean_minus_one = $mean - 1;
$array_count = count($sample);
$array_total = array_sum($sample);
//**mean**//
$mean = (($array_total/$array_count) / $array_count);
//
foreach ($sample as $samples)
{
$random_array[] = $samples - $mean;
}
foreach ($random_array as $random_arrays)
{
$newarray[] = pow($random_arrays, 2);
}
$array_total_newarray += array_sum($newarray);
$array_total_newarray = $array_total_newarray / $mean_minus_one;
$answer = sqrt($array_total_newarray);
echo "<p>{$answer}</p>";
echo "<p>{$array_total}</p>";
echo "<p>{$array_count}</p>";
?>
อ้างอิง : http://forums.phpfreaks.com/topic/224201-php-standard-deviation/
|
ประวัติการแก้ไข 2013-07-30 11:12:16
|
|
|
|
Date :
2013-07-30 11:11:10 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณมากค่ะ คุณ กระบี่อยู่ที่ใจ และคุณ zinlucifer
เราต้องการนำค่าด้านล่างไปคิด ส่วนที่ดึงจากฐานข้อมูล
//สมมุติ : ส่วนที่ดึงจากฐานข้อมูล เป็นเรคอร์ด
$std_array[] = array(0.64,1.66,2.43,1.24,1.56);
$std_array[] = array(1.56,1.21,1.09,1.70,2.22);
$std_array[] = array(2.39,1.78,2.50,1.89,1.40);
แล้วนำมาใส่ในส่วนของฟั่งชั่นด้านล่างตามตัวอย่าง จากตัวแปร $std_array ค่ะ
Code (PHP)
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
$std_array = array(......); <---- ตรงนี้ค่ะ (0.64,1.66,2.43,1.24,1.56,1.21,1.09,1.70,2.22,2.39,1.78,2.50,1.89,1.40)
//ผลลัพธ์ คือ 0.54 STD
$STD = standard_deviation($std_array);
echo number_format($STD , 2);
|
ประวัติการแก้ไข 2013-07-30 11:50:34
|
|
|
|
Date :
2013-07-30 11:48:41 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ฟังก์ชั่น standard_deviation
Code (PHP)
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
จะรับค่า $aValues ที่เป็น Array 1มิติ นะครับ
แต่ถ้าเก็บตัวแปรเป็น
$std_array[] = array(0.64,1.66,2.43,1.24,1.56);
$std_array[] = array(1.56,1.21,1.09,1.70,2.22);
$std_array[] = array(2.39,1.78,2.50,1.89,1.40);
มันจะกลายเป็น Array 2มิติ
เมื่อเรียกฟังก์ชั่น standard_deviation($std_array); จะเกิด error นะครับ
|
|
|
|
|
Date :
2013-07-30 11:56:46 |
By :
zinlucifer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
คือของเราเอาหลายฟิลด์มาคิดรวมกันจึงใช้คำสั่งแบบ STDDEV(ฟิวด์) form ไม่ได้ค่ะ
|
|
|
|
|
Date :
2013-07-30 12:03:18 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แบบนี้รึป่าวค่ะ คุณ กระบี่อยู่ที่ใจ
Error
Fatal error: Unsupported operand types in D:\AppServ\www\sp_strength_checking_record\Untitled-11.php on line 31
Code (PHP)
<?php require_once('includes/connect.php'); ?>
<?php
//-- ส่วนที่ดึงจากฐานข้อมูล
$strSQL = "SELECT * from tSPTH where ID='GS' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
while($std = mssql_fetch_array($objQuery))
{
$sample[] = array($std["a"],$std["b"],$std["c"]);
}
$array_count = 0;
$array_total = 0;
$mean = 0;
$random_array = array();
$newarray = array();
$array_total_newarray = 0;
$array_count = count($sample);
$array_total = array_sum($sample);
//**mean**//
$mean = (($array_total/$array_count) / $array_count);
//
$array_count_minus_one = $array_count - 1;
$mean_minus_one = $mean - 1;
foreach ($sample as $samples)
{
$random_array[] = $samples - $mean;
}
foreach ($random_array as $random_arrays)
{
$newarray[] = pow($random_arrays, 2);
}
$array_total_newarray += array_sum($newarray);
$array_total_newarray = $array_total_newarray / $mean_minus_one;
$answer = sqrt($array_total_newarray);
echo "<p>{$answer}</p>";
echo "<p>{$array_total}</p>";
echo "<p>{$array_count}</p>";
?>
จิงๆ เราอยากได้ฟังชั่นนี้ไปใช้ แต่มาติดปัญหา Array 2 มิติ จากที่ทำการดึงจากฐานข้อมูล ค่ะ
Code (PHP)
<?php require_once('includes/connect.php'); ?>
<?
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
?>
<?php
//-- ส่วนที่ดึงจากฐานข้อมูล
$strSQL = "SELECT * from tSPTH where ID='GS' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
while($std = mssql_fetch_array($objQuery))
{
$sample[] = array($std["a"],$std["b"],$std["c"]);
}
$std_array = array($sample);
$STD = standard_deviation($std_array);
echo number_format($STD , 2);
|
ประวัติการแก้ไข 2013-07-30 14:59:35 2013-07-30 15:00:45
|
|
|
|
Date :
2013-07-30 14:47:03 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ลองเก็บเป็น มิติเดียวซิครับ
Code (PHP)
$sample = array($std["a"],$std["b"],$std["c"]);
|
|
|
|
|
Date :
2013-07-30 15:05:55 |
By :
zinlucifer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้างั้นเวลาเรียกฟังก์ชั่นให้ใส่ index ของมิติแรกลงไปด้วยครับ
จากตัวอย่าง Code
Code (PHP)
<?php require_once('includes/connect.php'); ?>
<?
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
?>
<?php
//-- ส่วนที่ดึงจากฐานข้อมูล
$strSQL = "SELECT * from tSPTH where ID='GS' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
while($std = mssql_fetch_array($objQuery))
{
$sample[] = array($std["a"],$std["b"],$std["c"]);
}
$std_array = array($sample);
$STD = standard_deviation($std_array);
echo number_format($STD , 2);
ให้ลองแก้เป็น
Code (PHP)
$std_array = array($sample['0']);
|
|
|
|
|
Date :
2013-07-30 16:22:56 |
By :
zinlucifer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่ได้ค่ะ Error
Fatal error: Unsupported operand types in D:\AppServ\www\sp_strength_checking_record\Untitled-11.php on line 9
ไม่เป็นไรค่ะ สงสัยต้องออกแบบใหม่แล้ว
ขอบคุณมากที่ช่วยเหลือ นะค่ะ THX
|
ประวัติการแก้ไข 2013-07-30 16:42:28
|
|
|
|
Date :
2013-07-30 16:42:03 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
มาตอบไม่ทัน ถอดใจไปแล้วเหรอครับ
ถ้าเรื่องอาร์เรย์ จัดรูปแบบการเก็บดังนี้ครับ
Code (PHP)
while($std = mssql_fetch_array($objQuery))
{
$sample[] = $std["a"];
$sample[] = $std["b"];
$sample[] = $std["c"];
}
เพียงเท่านี้อาร์เรย์ก็อยู่ในรูปแบบที่ต้องการแล้วครับ
|
|
|
|
|
Date :
2013-07-30 16:48:00 |
By :
{Cyberman} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขออภัยครับผมอ่านโค้ดผิดไปนิด
Code (PHP)
<?php require_once('includes/connect.php'); ?>
<?
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
?>
<?php
//-- ส่วนที่ดึงจากฐานข้อมูล
$strSQL = "SELECT * from tSPTH where ID='GS' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
while($std = mssql_fetch_array($objQuery))
{
$sample[] = array($std["a"],$std["b"],$std["c"]);
}
$std_array = array($sample);
$STD = standard_deviation($std_array);
echo number_format($STD , 2);
ให้แก้เป็น
Code (PHP)
$std_array = array($sample);
$STD = standard_deviation($std_array['0']['0']);
|
|
|
|
|
Date :
2013-07-30 16:53:20 |
By :
zinlucifer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แก้ผิดนะครับ copy โค้ดนี้ไปเลยละกัน
Code (PHP)
<?php require_once('includes/connect.php'); ?>
<?
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
?>
<?php
//-- ส่วนที่ดึงจากฐานข้อมูล
$strSQL = "SELECT * from tSPTH where ID='GS' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
while($std = mssql_fetch_array($objQuery))
{
$sample[] = array($std["a"],$std["b"],$std["c"]);
}
$std_array = array($sample);
$STD = standard_deviation($std_array['0']['0']);
echo number_format($STD , 2);
|
|
|
|
|
Date :
2013-07-30 17:10:49 |
By :
zinlucifer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ได้แล้วค่ะ
ขอบคุณมากๆค่ะ คุณ zinlucifer และ คุณ กระบี่อยู่ที่ใจ
Like Like Like <3
|
|
|
|
|
Date :
2013-07-30 17:13:34 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอฝากนิดนึงครับ อยากให้ลองทบทวน logic นิดนึงว่า จำเป็นจริงๆหรือว่า
จะต้องเก็บเป็น array หลายมิติ เพราะเท่าที่ดู Array รูปแบบมันเป็น
Code (PHP)
Array
(
[0] => Array
(
[0] => Array
(
[0] => 0.64
[1] => 1.66
[2] => 2.43
[3] => 1.24
[4] => 1.56
[5] => 1.21
[6] => 1.09
[7] => 1.7
[8] => 2.22
[9] => 2.39
[10] => 1.78
[11] => 2.5
[12] => 1.89
[13] => 1.4
)
)
)
ซึ่งผมมองว่ามันแปลกๆนิดๆนะครับ Code ที่ใช้งานจริงๆน่าจะมีเพียงเท่านี้ก็น่าจะเพียงพอแล้วนะครับ
Code (PHP)
<?php require_once('includes/connect.php'); ?>
<?
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
?>
<?php
//-- ส่วนที่ดึงจากฐานข้อมูล
$strSQL = "SELECT * from tSPTH where ID='GS' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
while($std = mssql_fetch_array($objQuery))
{
$std_array = array($std["a"],$std["b"],$std["c"]);
}
$STD = standard_deviation($std_array);
echo number_format($STD , 2);
|
|
|
|
|
Date :
2013-07-30 17:22:30 |
By :
zinlucifer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอถามต่ออีกซักนิดค่ะ
สมมุติว่า เราไม่อยากเอาค่า 0 มีคิดด้วย จะต้องใช้ฟังชชั่นอะไรคะ
เจอปัญหา คือ ถ้านำ 0 มาคิดด้วย ผลลัพธ์จะไม่ตรงค่ะ
$a = 0.64
$b = 1.66
$c = 2.56
$d = 0
$std_array = array($std["a"],$std["b"],$std["c"],$std["d"]);
|
|
|
|
|
Date :
2013-07-31 10:35:08 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
หมายความว่า ถ้าเจอ 0 จะให้เข้าฟังก์ชั่นแค่ 3 ค่าหรือเปล่าครับ
เช่น
$a = 0.64
$b = 1.66
$c = 2.56
$d = 0
จะให้ คำนวณแค่
$a = 0.64
$b = 1.66
$c = 2.56
ถ้าใช่ ก็ใช้เงื่อนไข if ดักไว้ใน loop while ครับ ว่าเมื่อค่าที่queryออกมา = 0
ก็ไม่ต้องเก็บเข้า array
|
|
|
|
|
Date :
2013-07-31 10:41:21 |
By :
zinlucifer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอบความคิดเห็นที่ : 21 เขียนโดย : zinlucifer เมื่อวันที่ 2013-07-31 10:41:21
รายละเอียดของการตอบ ::
ใช่ค่ะ
$a = 0.64
$b = 1.66
$c = 2.56
$d = 0
จะให้ คำนวณแค่
$a = 0.64
$b = 1.66
$c = 2.56
แบบนี้ใช่รึป่าวค่ะ แต่สงสัย (ก็ไม่ต้องเก็บเข้า array) มันต้องตัดส่วนไหนออกบ้างค่ะ
Error : Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes) in
Code (PHP)
<?php require_once('includes/connect.php'); ?>
<?
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
?>
<?php
//-- ส่วนที่ดึงจากฐานข้อมูล
$strSQL = "SELECT * from tSPTH where ID='GS' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
while($std = mssql_fetch_array($objQuery))
{
$a=0;
$num=1;
while($a < $std)
{
$std_array = array($std["a"],$std["b"],$std["c"]);
$num=$num+1;
$a++;
}
}
$STD = standard_deviation($std_array);
echo number_format($STD , 2);
|
|
|
|
|
Date :
2013-07-31 11:08:25 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ณ ตอนนี้ปัจจุบันใช้ Array กี่มิติอยู่ครับ
ถ้าใช้มิติเดียว (โค้ดความเห็นที่ 19) แต่ผมเปลี่ยนวิธีการนิดหน่อยนะครับ
โดยผมจะให้ query เหมือนเดิม แต่เมื่อได้ Array ออกมาแล้วจะ Filter มันแทน
Code (PHP)
<?php require_once('includes/connect.php'); ?>
<?
function standard_deviation($aValues, $bSample = false)
{
$fMean = array_sum($aValues) / count($aValues);
$fVariance = 0.0;
foreach ($aValues as $i)
{
$fVariance += pow($i - $fMean, 2);
}
$fVariance /= ( $bSample ? count($aValues) - 1 : count($aValues) );
return (float) sqrt($fVariance);
}
?>
<?php
//-- ส่วนที่ดึงจากฐานข้อมูล
$strSQL = "SELECT * from tSPTH where ID='GS' ";
$objQuery = mssql_query($strSQL) or die ("Error Query [".$strSQL."]");
while($std = mssql_fetch_array($objQuery))
{
$std_array = array($std["a"],$std["b"],$std["c"]);
}
function check($var){
if($var != 0){
return $var;
}
}
$std_array = array_filter($std_array, "check"); //นำค่าใน array ไปตรวจสอบใน function check
$STD = standard_deviation($std_array);
echo number_format($STD , 2);
|
|
|
|
|
Date :
2013-07-31 12:17:50 |
By :
zinlucifer |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ไม่ได้ค่ะ Error
ไม่เป็นไรค่ะ ขอบคุณมากค่ะ คุณ zinlucifer เราพอจะเข้าใจบ้างแล้วค่ะ
|
ประวัติการแก้ไข 2013-07-31 13:20:20 2013-07-31 13:32:23
|
|
|
|
Date :
2013-07-31 13:18:43 |
By :
phoenix10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 02
|