mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-04 12:52:28 +08:00
feat: add Variance for math package
This commit is contained in:
@@ -1162,4 +1162,37 @@ func main() {
|
|||||||
// 0.5
|
// 0.5
|
||||||
// 0
|
// 0
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Variance">Variance</span>
|
||||||
|
|
||||||
|
<p>计算方差</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Variance[T constraints.Float | constraints.Integer](numbers []T) float64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>示例:<span style="float:right;display:inline-block;">[示例](todo)</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := mathutil.Variance([]int{1, 2, 3, 4, 5})
|
||||||
|
result2 := mathutil.Variance([]float64{1.1, 2.2, 3.3, 4.4, 5.5})
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 2
|
||||||
|
// 2.42
|
||||||
|
}
|
||||||
```
|
```
|
||||||
@@ -52,6 +52,7 @@ import (
|
|||||||
- [Sum](#Sum)
|
- [Sum](#Sum)
|
||||||
- [Abs](#Abs)
|
- [Abs](#Abs)
|
||||||
- [Div](#Div)
|
- [Div](#Div)
|
||||||
|
- [Variance](#Variance)
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
|
|
||||||
@@ -1161,4 +1162,37 @@ func main() {
|
|||||||
// 0.5
|
// 0.5
|
||||||
// 0
|
// 0
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### <span id="Variance">Variance</span>
|
||||||
|
|
||||||
|
<p>Returns the variance of numbers.</p>
|
||||||
|
|
||||||
|
<b>Signature:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Variance[T constraints.Float | constraints.Integer](numbers []T) float64
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>Example:<span style="float:right;display:inline-block;">[Run](todo)</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/mathutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result1 := mathutil.Variance([]int{1, 2, 3, 4, 5})
|
||||||
|
result2 := mathutil.Variance([]float64{1.1, 2.2, 3.3, 4.4, 5.5})
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 2
|
||||||
|
// 2.42
|
||||||
|
}
|
||||||
```
|
```
|
||||||
@@ -395,3 +395,21 @@ func Abs[T constraints.Integer | constraints.Float](x T) T {
|
|||||||
func Div[T constraints.Float | constraints.Integer](x T, y T) float64 {
|
func Div[T constraints.Float | constraints.Integer](x T, y T) float64 {
|
||||||
return float64(x) / float64(y)
|
return float64(x) / float64(y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Variance returns the variance of numbers.
|
||||||
|
// Play: todo
|
||||||
|
func Variance[T constraints.Float | constraints.Integer](numbers []T) float64 {
|
||||||
|
n := len(numbers)
|
||||||
|
if n == 0 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
avg := Average(numbers...)
|
||||||
|
var sum T
|
||||||
|
|
||||||
|
for _, v := range numbers {
|
||||||
|
sum += (v - avg) * (v - avg)
|
||||||
|
}
|
||||||
|
|
||||||
|
return float64(sum) / float64(n)
|
||||||
|
}
|
||||||
|
|||||||
@@ -478,3 +478,15 @@ func ExampleDiv() {
|
|||||||
// 0.5
|
// 0.5
|
||||||
// 0
|
// 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleVariance() {
|
||||||
|
result1 := Variance([]int{1, 2, 3, 4, 5})
|
||||||
|
result2 := Variance([]float64{1.1, 2.2, 3.3, 4.4, 5.5})
|
||||||
|
|
||||||
|
fmt.Println(result1)
|
||||||
|
fmt.Println(result2)
|
||||||
|
|
||||||
|
// Output:
|
||||||
|
// 2
|
||||||
|
// 2.42
|
||||||
|
}
|
||||||
|
|||||||
@@ -413,3 +413,36 @@ func TestDiv(t *testing.T) {
|
|||||||
assert.Equal(math.Inf(-1), Div(-8, 0))
|
assert.Equal(math.Inf(-1), Div(-8, 0))
|
||||||
assert.Equal(true, math.IsNaN(Div(0, 0)))
|
assert.Equal(true, math.IsNaN(Div(0, 0)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestVariance(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
assert := internal.NewAssert(t, "TestVariance")
|
||||||
|
|
||||||
|
testIntNumbers := []struct {
|
||||||
|
numbers []int
|
||||||
|
expected float64
|
||||||
|
}{
|
||||||
|
{[]int{0}, 0},
|
||||||
|
{[]int{1, 1, 1}, 0},
|
||||||
|
{[]int{1, 2, 3, 4}, 1.5},
|
||||||
|
{[]int{1, 2, 3, 4, 5}, 2.0},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range testIntNumbers {
|
||||||
|
assert.Equal(tt.expected, TruncRound(Variance(tt.numbers), 2))
|
||||||
|
}
|
||||||
|
|
||||||
|
testFloatNumbers := []struct {
|
||||||
|
numbers []float64
|
||||||
|
expected float64
|
||||||
|
}{
|
||||||
|
{[]float64{0}, 0},
|
||||||
|
{[]float64{1, 1, 1}, 0},
|
||||||
|
{[]float64{1.1, 2.2, 3.3, 4.4}, 1.51},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range testFloatNumbers {
|
||||||
|
assert.Equal(tt.expected, TruncRound(Variance(tt.numbers), 2))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user