diff --git a/Makefile b/Makefile index 48fac9a..1ddb6c0 100644 --- a/Makefile +++ b/Makefile @@ -5,4 +5,5 @@ dev: prod: GOOS=js GOARCH=wasm tinygo build -o stat/mod.wasm -no-debug ./stat/main.go - GOOS=js GOARCH=wasm tinygo build -o plot/mod.wasm -no-debug ./plot/main.go \ No newline at end of file + GOOS=js GOARCH=wasm tinygo build -o regr/mod.wasm -no-debug ./regr/main.go + GOOS=js GOARCH=wasm go build -o plot/mod.wasm ./plot/main.go \ No newline at end of file diff --git a/notebooks/regressions.ipynb b/notebooks/regressions.ipynb index c3bfd59..0f36608 100644 --- a/notebooks/regressions.ipynb +++ b/notebooks/regressions.ipynb @@ -147,6 +147,68 @@ "\n", "comparePredicted(df.x, df.y, predY);\n" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ElasticNet" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "![name](data:image/png;base64,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bmhoePHiRV9f35EjR3IdL3Ds/PnzP/30k7u7+82bNzds2NC0adOjR49++OGH6enp1tbWDx8+/Prrrzt06HDz5s1Bgwb5+/tzHS9w7ODBgxEREa1bt753797mzZvNzc03btw4Y8aMrKysmJiYlStXduzYMT4+vlOnTt988w3XwVZDuxK8UmlpqbGxccVb5aATL9sK8IoDRi6XSySSiraZAK89w2hhUynglsoBU1RUVDE5slgsrtzUV9toY4IHAACAetKiZ/AAAACgLkjwAAAAeggJHgAAQA8hwQMAAOghLRrJDgC039KlS69evVpaWurk5DRu3DgPD4+DBw/+/vvvxcXF77333tixY7kOEADKoQYPALUwc+bM999/f//+/a1bt/bw8CCigQMHPn78+KuvvkJ2B9Aq6CYHALU2aNCgM2fOXL9+3dnZec6cOSKRaPr06VwHBQBVIMEDQK2lpKS0bdu2Xbt2s2bNCgsL279/P4/H4zooAKgCCR4A6mL79u2ffvqpo6PjlStXME0fgBZCggeAuigrK3N0dMzJyYmNjXV1deU6HABQhQQPAHUxd+5cIvr555+dnZ3/+usvPp/PdUQAUAVa0QNArR0/fvz27duLFi1at27dxYsXf/zxR64jAgBVqMEDQO2kpKR4e3tHR0dbW1sT0ahRo3777bcrV65gAnUArYIEDwC1UFZW9v7774eEhHh6eirX5OTkeHh42NvbX7x40dAQY2cBaAvcogeAmrpy5cr48ePLysqio6MrVkZFRXXu3JnH440fP/7ixYucBggAz6EGDwAAoIdQgwcAANBDSPAAAAB6CAkeAABADyHBAwAA6KH/DwAA///XA+2N8LVuhgAAAABJRU5ErkJggg==)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const elasticNetPoly = regr.ElasticNet(1000, 0.0001);\n", + "elasticNetPoly.fit(polyX.rows(), polyY.rows());\n", + "const predEnetY = elasticNetPoly.predict(polyX.rows());\n", + "\n", + "comparePredicted(df.x, df.y, predEnetY);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Lasso" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "![name](data:image/png;base64,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)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "const lassoPoly = regr.Lasso(1000, 0.0001);\n", + "lassoPoly.fit(polyX.rows(), polyY.rows());\n", + "const predLassoY = lassoPoly.predict(polyX.rows());\n", + "\n", + "comparePredicted(df.x, df.y, predLassoY);" + ] } ], "metadata": { diff --git a/regr/main.go b/regr/main.go index bee5480..c5fe412 100644 --- a/regr/main.go +++ b/regr/main.go @@ -12,6 +12,8 @@ import ( func InitRegrExports(this js.Value, args []js.Value) interface{} { exports := args[0] exports.Set("Linear", js.FuncOf(src.NewLinearRegressionJS)) + exports.Set("ElasticNet", js.FuncOf(src.NewElasticNetJS)) + exports.Set("Lasso", js.FuncOf(src.NewLassoJS)) return nil } diff --git a/regr/mod.wasm b/regr/mod.wasm index 1ece383..2b297a2 100755 Binary files a/regr/mod.wasm and b/regr/mod.wasm differ diff --git a/regr/src/CDescent.go b/regr/src/CDescent.go new file mode 100644 index 0000000..a65d6cf --- /dev/null +++ b/regr/src/CDescent.go @@ -0,0 +1,194 @@ +package src + +import ( + "math" + + "golang.org/x/exp/rand" + "gonum.org/v1/gonum/mat" +) + +type CDResult struct { + Gap float64 + Eps float64 + NIter int +} + +// Author: Pascal Masschelier, https://github.com/pa-m +// v https://github.com/pa-m/sklearn/blob/master/linear_model/cdfast.go +// +// Coordinate descent algorithm for Elastic-Net +// v https://github.com/scikit-learn/scikit-learn/blob/a24c8b464d094d2c468a16ea9f8bf8d42d949f84/sklearn/linear_model/cd_fast.pyx +func CoordinateDescent(w *mat.Dense, l1reg, l2reg float64, X *mat.Dense, Y *mat.Dense, maxIter int, tol float64, rng *rand.Rand, random, positive bool) *CDResult { + /* + coordinate descent algorithm + for Elastic-Net regression + We minimize + (1/2) * norm(y - X w, 2)^2 + alpha norm(w, 1) + (beta/2) norm(w, 2)^2 + */ + gap := tol + 1. + dwtol := tol + + NSamples, NFeatures := X.Dims() + _ = NSamples + _, NTasks := Y.Dims() + + var dwii, wmax, dwmax, dualNormXtA, cons, XtAaxis1norm, wiiabsmax, l21norm float64 + var ii, fIter, nIter int + tmp := mat.NewVecDense(NTasks, nil) + wii := mat.NewVecDense(NTasks, nil) + + R, Y2, XtA, RY, xw := &mat.Dense{}, &mat.Dense{}, &mat.Dense{}, &mat.Dense{}, &mat.Dense{} + RNorm, wNorm, ANorm, nn, tmpfactor := 0., 0., 0., 0., 0. + XtA = mat.NewDense(NFeatures, NTasks, nil) + + // # norm_cols_X = (np.asarray(X) ** 2).sum(axis=0) + normColsX := make([]float64, NFeatures) + Xmat := X.RawMatrix() + for jX := 0; jX < Xmat.Rows*Xmat.Stride; jX = jX + Xmat.Stride { + for i, v := range Xmat.Data[jX : jX+Xmat.Cols] { + normColsX[i] += v * v + } + } + // # R = Y - np.dot(X, W.T) + R.Mul(X, w) + R.Sub(Y, R) + + // # tol = tol * linalg.norm(Y, ord='fro') ** 2 + + Y2.MulElem(Y, Y) + tol *= mat.Sum(Y2) + + for nIter = 0; nIter < maxIter; nIter++ { + wmax, dwmax = 0., 0. + + for fIter = 0; fIter < NFeatures; fIter++ { + if random { + if rng != nil { + ii = rng.Intn(NFeatures) + } else { + ii = rand.Intn(NFeatures) + } + } else { + ii = fIter + } + if normColsX[ii] == 0. { + continue + } + // # w_ii = W[:, ii] # Store previous value + wii.CopyVec(w.RowView(ii)) // store previous value + + // if np.sum(w_ii ** 2) != 0.0: # can do better + if mat.Norm(wii, 2) != 0. { + // # R += X[:,ii] *wii # rank 1 update + + xw.Mul(X.ColView(ii), wii.T()) + R.Add(R, xw) + } + + // # tmp = np.dot(X[:, ii][None, :], R).ravel() + tmp.MulVec(R.T(), X.ColView(ii)) + + // # nn = sqrt(np.sum(tmp ** 2)) + nn = mat.Norm(tmp, 2) + // # W[:, ii] = tmp * fmax(1. - l1_reg / nn, 0) / (norm_cols_X[ii] + l2_reg) + if l1reg < nn { + tmpfactor = math.Max(1.-l1reg/nn, 0) / (normColsX[ii] + l2reg) + + } else { + tmpfactor = 0. + } + w.RowView(ii).(*mat.VecDense).ScaleVec(tmpfactor, tmp) + + // # if np.sum(W[:, ii] ** 2) != 0.0: # can do better + + if mat.Norm(w.RowView(ii), 2) != 0. { + // # R -= np.dot(X[:, ii][:, None], W[:, ii][None, :]) + // # Update residual : rank 1 update + xw.Mul(X.ColView(ii), w.RowView(ii).T()) + R.Sub(R, xw) + } + // # update the maximum absolute coefficient update + dwii = 0. + for o := 0; o < NTasks; o++ { + v := math.Abs(w.At(ii, o) - wii.AtVec(o)) + if v > dwii { + dwii = v + } + } + + if dwii > dwmax { + dwmax = dwii + } + wiiabsmax = 0. + wmat := w.RawMatrix() + for jw := 0; jw < wmat.Rows*wmat.Stride; jw = jw + wmat.Stride { + for _, v := range wmat.Data[jw : jw+wmat.Cols] { + v = math.Abs(v) + if v > wiiabsmax { + wiiabsmax = v + } + } + } + if wiiabsmax > wmax { + wmax = wiiabsmax + } + + } + + if wmax == 0. || dwmax/wmax < dwtol || nIter == maxIter-1 { + // # the biggest coordinate update of this iteration was smaller + // # than the tolerance: check the duality gap as ultimate + // # stopping criterion + + // # XtA = np.dot(X.T, R) - l2_reg * W.T + XtA.Mul(X.T(), R) + XtAmat := XtA.RawMatrix() + Wmat := w.RawMatrix() + for jXtA, jW := 0, 0; jXtA < XtAmat.Rows*XtAmat.Stride; jXtA, jW = jXtA+XtAmat.Stride, jW+Wmat.Stride { + for i := range XtAmat.Data[jXtA : jXtA+XtAmat.Cols] { + XtAmat.Data[jXtA+i] -= l2reg * Wmat.Data[jW+i] + } + } + + // # dual_norm_XtA = np.max(np.sqrt(np.sum(XtA ** 2, axis=1))) + dualNormXtA = 0. + for ii := 0; ii < NFeatures; ii++ { + XtAaxis1norm = mat.Norm(XtA.RowView(ii), 2) + if XtAaxis1norm > dualNormXtA { + dualNormXtA = XtAaxis1norm + } + } + // # R_norm = linalg.norm(R, ord='fro') + // # w_norm = linalg.norm(W, ord='fro') + RNorm = mat.Norm(R, 2) + wNorm = mat.Norm(w, 2) + if dualNormXtA > l1reg { + cons = l1reg / dualNormXtA + ANorm = RNorm * cons + gap = .5 * (RNorm*RNorm + ANorm*ANorm) + } else { + cons = 1. + gap = RNorm * RNorm + } + // # ry_sum = np.sum(R * y) + RY.MulElem(R, Y) + // # l21_norm = np.sqrt(np.sum(W ** 2, axis=0)).sum() + l21norm = 0. + for ii = 0; ii < NFeatures; ii++ { + l21norm += mat.Norm(w.RowView(ii), 2) + } + gap += l1reg*l21norm - cons*mat.Sum(RY) + .5*l2reg*(1.+cons*cons)*(wNorm*wNorm) + + // fmt.Printf("X\n%4f\nR:\n%4f\nW:\n%.4f\nXtA:\n%4f\n", mat.Formatted(X), mat.Formatted(R), mat.Formatted(w), mat.Formatted(XtA)) + // fmt.Println("dwmax", dwmax, "wmax", wmax, "dwtol", dwtol) + // fmt.Println(nIter, gap, "l1reg", l1reg, "l2reg", l2reg, "l21norm", l21norm, "sumRY", cons*mat.Sum(RY), "dualNormXtA", dualNormXtA, "RNorm", RNorm, "gap", gap) + + if gap < tol { + // return if we have reached the desired tolerance + break + } + } + + } + return &CDResult{Gap: gap, Eps: tol, NIter: nIter + 1} +} diff --git a/regr/src/ElasticNet.go b/regr/src/ElasticNet.go new file mode 100644 index 0000000..b0c3a6e --- /dev/null +++ b/regr/src/ElasticNet.go @@ -0,0 +1,96 @@ +//go:build js && wasm +// +build js,wasm + +package src + +import ( + "syscall/js" + + "gonum.org/v1/gonum/mat" +) + +type ElasticNet struct { + LinearRegression + Tol, Alpha, L1Ratio float64 + MaxIter int + WarmStart, Positive bool + CDResult CDResult +} + +func NewElasticNet(maxIter int, alpha float64) *ElasticNet { + regr := &ElasticNet{} + regr.Tol = 1e-4 + regr.Alpha = alpha + regr.L1Ratio = .5 + regr.MaxIter = maxIter + return regr +} + +func NewLasso(maxIter int, alpha float64) *ElasticNet { + regr := NewElasticNet(maxIter, alpha) + regr.L1Ratio = 1. + return regr +} + +func (regr *ElasticNet) Fit(Xs, Ys [][]float64, random bool) error { + X, Y := Array2DToDense(Xs), Array2DToDense(Ys) + + NSamples, NFeatures := X.Dims() + _, NOutputs := Y.Dims() + + l1reg := regr.Alpha * regr.L1Ratio * float64(NSamples) + l2reg := regr.Alpha * (1. - regr.L1Ratio) * float64(NSamples) + if !regr.WarmStart { + regr.Coef = mat.NewDense(NFeatures, NOutputs, nil) + } + regr.CDResult = *CoordinateDescent(regr.Coef, l1reg, l2reg, X, Y, regr.MaxIter, regr.Tol, nil, random, regr.Positive) + return nil +} + +func NewLassoJS(this js.Value, args []js.Value) interface{} { + obj := js.Global().Get("Object").New() + maxIter, alpha := getargs(args) + regr := NewLasso(maxIter, alpha) + setjsmethods(obj, regr) + return obj +} + +func NewElasticNetJS(this js.Value, args []js.Value) interface{} { + obj := js.Global().Get("Object").New() + maxIter, alpha := getargs(args) + regr := NewElasticNet(maxIter, alpha) + setjsmethods(obj, regr) + return obj +} + +func getargs(args []js.Value) (int, float64) { + maxIter := 100 + if !args[0].IsUndefined() { + maxIter = args[0].Int() + } + + alpha := 1e-4 + if len(args) > 1 && !args[1].IsUndefined() { + alpha = args[1].Float() + } + + return maxIter, alpha +} + +func setjsmethods(obj js.Value, regr *ElasticNet) { + obj.Set("fit", js.FuncOf(func(this js.Value, args []js.Value) interface{} { + X := JSFloatArray2D(args[0]) + Y := JSFloatArray2D(args[1]) + random := false + if len(args) == 3 && !args[2].IsUndefined() { + random = args[2].Bool() + } + return regr.Fit(X, Y, random) + })) + + obj.Set("predict", js.FuncOf(func(this js.Value, args []js.Value) interface{} { + X := JSFloatArray2D(args[0]) + Y, _ := regr.Predict(X) + return ToJSArray(Y) + })) +}