1// Copyright ©2016 The Gonum Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package stat_test
6
7import (
8	"fmt"
9
10	"gonum.org/v1/gonum/mat"
11	"gonum.org/v1/gonum/stat"
12)
13
14func ExamplePC() {
15	// iris is a truncated sample of the Fisher's Iris dataset.
16	n := 10
17	d := 4
18	iris := mat.NewDense(n, d, []float64{
19		5.1, 3.5, 1.4, 0.2,
20		4.9, 3.0, 1.4, 0.2,
21		4.7, 3.2, 1.3, 0.2,
22		4.6, 3.1, 1.5, 0.2,
23		5.0, 3.6, 1.4, 0.2,
24		5.4, 3.9, 1.7, 0.4,
25		4.6, 3.4, 1.4, 0.3,
26		5.0, 3.4, 1.5, 0.2,
27		4.4, 2.9, 1.4, 0.2,
28		4.9, 3.1, 1.5, 0.1,
29	})
30
31	// Calculate the principal component direction vectors
32	// and variances.
33	var pc stat.PC
34	ok := pc.PrincipalComponents(iris, nil)
35	if !ok {
36		return
37	}
38	fmt.Printf("variances = %.4f\n\n", pc.VarsTo(nil))
39
40	// Project the data onto the first 2 principal components.
41	k := 2
42	var proj mat.Dense
43	var vec mat.Dense
44	pc.VectorsTo(&vec)
45	proj.Mul(iris, vec.Slice(0, d, 0, k))
46
47	fmt.Printf("proj = %.4f", mat.Formatted(&proj, mat.Prefix("       ")))
48
49	// Output:
50	// variances = [0.1666 0.0207 0.0079 0.0019]
51	//
52	// proj = ⎡-6.1686   1.4659⎤
53	//        ⎢-5.6767   1.6459⎥
54	//        ⎢-5.6699   1.3642⎥
55	//        ⎢-5.5643   1.3816⎥
56	//        ⎢-6.1734   1.3309⎥
57	//        ⎢-6.7278   1.4021⎥
58	//        ⎢-5.7743   1.1498⎥
59	//        ⎢-6.0466   1.4714⎥
60	//        ⎢-5.2709   1.3570⎥
61	//        ⎣-5.7533   1.6207⎦
62}
63