| // Copyright ©2016 The Gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package stat_test |
| |
| import ( |
| "fmt" |
| |
| "gonum.org/v1/gonum/mat" |
| "gonum.org/v1/gonum/stat" |
| ) |
| |
| func ExamplePC() { |
| // iris is a truncated sample of the Fisher's Iris dataset. |
| n := 10 |
| d := 4 |
| iris := mat.NewDense(n, d, []float64{ |
| 5.1, 3.5, 1.4, 0.2, |
| 4.9, 3.0, 1.4, 0.2, |
| 4.7, 3.2, 1.3, 0.2, |
| 4.6, 3.1, 1.5, 0.2, |
| 5.0, 3.6, 1.4, 0.2, |
| 5.4, 3.9, 1.7, 0.4, |
| 4.6, 3.4, 1.4, 0.3, |
| 5.0, 3.4, 1.5, 0.2, |
| 4.4, 2.9, 1.4, 0.2, |
| 4.9, 3.1, 1.5, 0.1, |
| }) |
| |
| // Calculate the principal component direction vectors |
| // and variances. |
| var pc stat.PC |
| ok := pc.PrincipalComponents(iris, nil) |
| if !ok { |
| return |
| } |
| fmt.Printf("variances = %.4f\n\n", pc.VarsTo(nil)) |
| |
| // Project the data onto the first 2 principal components. |
| k := 2 |
| var proj mat.Dense |
| var vec mat.Dense |
| pc.VectorsTo(&vec) |
| proj.Mul(iris, vec.Slice(0, d, 0, k)) |
| |
| fmt.Printf("proj = %.4f", mat.Formatted(&proj, mat.Prefix(" "))) |
| |
| // Output: |
| // variances = [0.1666 0.0207 0.0079 0.0019] |
| // |
| // proj = ⎡-6.1686 1.4659⎤ |
| // ⎢-5.6767 1.6459⎥ |
| // ⎢-5.6699 1.3642⎥ |
| // ⎢-5.5643 1.3816⎥ |
| // ⎢-6.1734 1.3309⎥ |
| // ⎢-6.7278 1.4021⎥ |
| // ⎢-5.7743 1.1498⎥ |
| // ⎢-6.0466 1.4714⎥ |
| // ⎢-5.2709 1.3570⎥ |
| // ⎣-5.7533 1.6207⎦ |
| } |