Skip to content

Commit 1abd549

Browse files
committed
chore: menambahkan regressi linear
Signed-off-by: slowy07 <[email protected]>
1 parent 199aef1 commit 1abd549

File tree

2 files changed

+201
-0
lines changed

2 files changed

+201
-0
lines changed
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
package artificialIntelligence
2+
3+
import (
4+
"fmt"
5+
"math"
6+
)
7+
8+
// DataStatistik adalah stuct yang digunakan untuk menyimpan
9+
// hasil perhitungan statistik dari dua dataset (independent dan dependent)
10+
// anggota meliputi antara lain
11+
// SumX -> jumlah dari seluruh nilai variabel independent
12+
// SumY -> jumlah dari seluruh nilai variabel dependent
13+
// XSquared -> jumlah dari kuadrat variabel independen
14+
// YSquared -> umlah dari kuadrat variabel dependent
15+
// Multiply -> jumlah dari hgasil perkalian antara pasangan nilai dari variabel
16+
type DataStatistik struct {
17+
SumX float64
18+
SumY float64
19+
XSquared float64
20+
YSquared float64
21+
Multiply float64
22+
}
23+
24+
// menghitung jumlah total dari semua element di dalam slice independenta
25+
// dan dependent
26+
//
27+
// Parameter:
28+
//
29+
// independent: slice yang berisi data variabel independent
30+
// dependent: slice yang berisi data variabel dependent
31+
// stats: pointer ke struct DataStatistik tempat hasil akan disimpan
32+
func Sum(independent, dependent []float64, stats *DataStatistik) {
33+
var sumX, sumY float64 // inisialisasi penampung jumlah X dan Y
34+
35+
// looping melalui setiap indeks dari slice independent
36+
// diasumsikan panjang slice independent dan dependent sama
37+
for i := range independent {
38+
sumX += independent[i] // tambahkan nilai X ke sumX
39+
sumY += dependent[i] // tambahkan nilai Y ke sumY
40+
}
41+
42+
// simpan hasil perhitungan ke struct DataStatistik
43+
stats.SumX = sumX
44+
stats.SumY = sumY
45+
46+
// cetak hasil untuk debug
47+
fmt.Printf("SumX: %.4f\n", stats.SumX)
48+
fmt.Printf("SumY: %.4f\n", stats.SumY)
49+
}
50+
51+
// menghitung jumlah dari kuadrat elemen-elemen dalam slice independent dan dependent
52+
//
53+
// Parameter:
54+
//
55+
// independent -> slice yang berisi variabel independent
56+
// dependent -> slice yang berisi data variabel dependent
57+
// stats -> pointer ke struct DataStatistik dimana tempat hasil disimpan
58+
func Squared(independent, dependent []float64, stats *DataStatistik) {
59+
var xSquared, ySquared float64 // tampung jumlah kuadrat X dan Y
60+
61+
// looping melalui setiap indeks dari slice independent
62+
for i := range independent {
63+
// hitung kuadrat dari nilai X menggunakan math.Pow
64+
xSquared += math.Pow(independent[i], 2)
65+
// hitung kuadrat dari nilai Y dengan cara langsung
66+
ySquared += dependent[i] * dependent[i]
67+
}
68+
69+
// simpan hasil perhitungan struct
70+
stats.XSquared = xSquared
71+
stats.YSquared = ySquared
72+
73+
fmt.Printf("hasil X squared: %.4f\n", stats.XSquared)
74+
fmt.Printf("hasil Y squared: %.4f\n", stats.YSquared)
75+
}
76+
77+
// menghitung jumlah hasil dari perkalian antara setiap parameter pasangan
78+
// lemen dari slice independent dan dependent
79+
//
80+
// Parameter:
81+
//
82+
// independent -> slice yang berisi data variable independent
83+
// dependent -> slice yang berisi data variabel dependent
84+
// stats -> pointe ke struct DataStatistik hasil yang akan disimpan
85+
func Multiply(independent, dependent []float64, stats *DataStatistik) {
86+
var total float64 // tampung hasil jumlah dari hasil perkalian
87+
88+
// looping melalui setiap indeks dari slice independent
89+
for i := range independent {
90+
// kalikan nilai X[i] dan Y[i], lalu tambahkan nilai total
91+
total += independent[i] * dependent[i]
92+
}
93+
94+
// simpan hasil ke struct
95+
stats.Multiply = total
96+
97+
fmt.Printf("hasil kali: %.4f\n", stats.Multiply)
98+
}
99+
100+
// fungsi menghitung model regressi linear sederhana berdasarkan data yang
101+
// telah dihitung sebelumnya, model regressi berbentuk: y = a + bx
102+
// di mana:
103+
// b adalah slope (kemiringan garis)
104+
// a adalah intercept (titik potong garis dengan sumbu Y)
105+
//
106+
// Parameter:
107+
// - independent -> slice yang berisi data variabel independent
108+
// - dependent -> slice yang bersisi data variabel dependent
109+
// - stats -> instance DataStatistik
110+
func RegressiLinear(independent, dependent []float64, stats DataStatistik) {
111+
// jumlah pasangan data, n
112+
n := float64(len(independent))
113+
114+
// hitung jumlah kuadrat dari deviasi XY (sumSquareXY)
115+
// rumus = sum(xy) - (sum(x) * sum(y)) / n
116+
sumSquareXY := stats.Multiply - (stats.SumX*stats.SumY)/n
117+
118+
// hitung jumlah kuadrat dari deviasi XX (sumSquareXX)
119+
// rumus = sum(x^2) - (sum(x)) ^ 2 / n
120+
sumSquareXX := stats.XSquared - (math.Pow(stats.SumX, 2))/n
121+
122+
fmt.Printf("hasil sumSquareXY: %.4f\n", sumSquareXY)
123+
fmt.Printf("hasil sumSquareXX: %.4f\n", sumSquareXX)
124+
125+
// hitung slope (b) menggunakan rumus = sumSquareXY / sumSquareXX
126+
slope := sumSquareXY / sumSquareXX
127+
// hitung intercept (a) menggunakan rumus: (sum(y) - b * sum(x)) / n
128+
intercept := (stats.SumY - (slope * stats.SumX)) / n
129+
130+
fmt.Printf("model regresi linear: y = %.4f + %.4fx\n", intercept, slope)
131+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package artificialIntelligence
2+
3+
import (
4+
"math"
5+
"testing"
6+
7+
"github.com/bellshade/Golang/artificialIntelligence"
8+
)
9+
10+
func almostEqual(a, b, tolerance float64) bool {
11+
return math.Abs(a-b) <= tolerance
12+
}
13+
14+
func TestSum(t *testing.T) {
15+
independet := []float64{1, 2, 3}
16+
dependent := []float64{4, 5, 6}
17+
stats := artificialIntelligence.DataStatistik{}
18+
19+
artificialIntelligence.Sum(independet, dependent, &stats)
20+
21+
if stats.SumX != 6 {
22+
t.Errorf("expected SumX = 6, dapat nilai %v", stats.SumX)
23+
}
24+
25+
if stats.SumY != 15 {
26+
t.Errorf("expected SumY = 15, got %v", stats.SumY)
27+
}
28+
}
29+
30+
func TestMultipy(t *testing.T) {
31+
independet := []float64{1, 2, 3}
32+
dependent := []float64{4, 5, 6}
33+
stats := artificialIntelligence.DataStatistik{}
34+
35+
artificialIntelligence.Multiply(independet, dependent, &stats)
36+
expectedMultiply := 32.0
37+
38+
if !almostEqual(stats.Multiply, expectedMultiply, 1e-6) {
39+
t.Errorf("ekspetasi multiply = %.2f, dapat nilai %.2f", expectedMultiply, stats.Multiply)
40+
}
41+
}
42+
43+
func TestRegressiLinear(t *testing.T) {
44+
independet := []float64{1, 2}
45+
// dependent := []float64{2, 4}
46+
stats := artificialIntelligence.DataStatistik {
47+
SumX: 3,
48+
SumY: 6,
49+
XSquared: 5,
50+
YSquared: 20,
51+
Multiply: 11,
52+
}
53+
54+
var slope, intercept float64
55+
n := float64(len(independet))
56+
57+
sumSquareXY := stats.Multiply - (stats.SumX * stats.SumY) / n
58+
sumSquareXX := stats.XSquared - (math.Pow(stats.SumX, 2)) / n
59+
60+
slope = sumSquareXY / sumSquareXX
61+
intercept = (stats.SumY - (slope * stats.SumX)) / n
62+
63+
if !almostEqual(slope, 4.0, 1e-6) {
64+
t.Errorf("ekspetasi slope = 2.0, dapat nilai %.6f", slope)
65+
}
66+
67+
if !almostEqual(intercept, -3.0, 1e-6) {
68+
t.Errorf("ekspetasi intercept = 0.0, dapat nilai %.6f", intercept)
69+
}
70+
}

0 commit comments

Comments
 (0)