Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 14 additions & 69 deletions js/view/gplvm.js
Original file line number Diff line number Diff line change
@@ -1,82 +1,32 @@
import GPLVM from '../../lib/model/gplvm.js'
import Controller from '../controller.js'

var dispGPLVM = function (elm, platform) {
export default function (platform) {
platform.setting.ml.usage = 'Click and add data point. Next, click "Fit" button.'
const controller = new Controller(platform)
let model = null
const fitModel = () => {
if (!model) {
const dim = platform.dimension
const alpha = +elm.select('[name=alpha]').property('value')
const sigma = +elm.select('[name=sigma]').property('value')
const ez = +elm.select('[name=ez]').property('value')
const ea = +elm.select('[name=ea]').property('value')
const ep = +elm.select('[name=ep]').property('value')
model = new GPLVM(dim, alpha, ez, ea, ep, 'gaussian', [1.0, sigma])
model = new GPLVM(dim, alpha.value, ez.value, ea.value, ep.value, {
name: kernel.value,
a: 1.0,
b: gauss_sigma.avlue,
})
model.init(platform.trainInput)
}
model.fit()
const y = model.predict(platform.trainInput)
platform.trainResult = y
}

const kernelElm = elm.append('span')
kernelElm
.append('select')
.attr('name', 'kernel')
.selectAll('option')
.data(['gaussian'])
.enter()
.append('option')
.attr('value', d => d)
.text(d => d)
const gauss_sigma = kernelElm.append('span')
gauss_sigma
.append('span')
.text(' sigma = ')
.append('input')
.attr('type', 'number')
.attr('name', 'sigma')
.attr('value', 1)
.attr('min', 0)
.attr('max', 10)
.attr('step', 0.1)
elm.append('span')
.text(' alpha = ')
.append('input')
.attr('type', 'number')
.attr('name', 'alpha')
.attr('value', 0.05)
.attr('min', 0)
.attr('max', 10)
.attr('step', 0.01)
elm.append('span')
.text(' ez = ')
.append('input')
.attr('type', 'number')
.attr('name', 'ez')
.attr('value', 1)
.attr('min', 0)
.attr('max', 10)
.attr('step', 0.1)
elm.append('span')
.text(' ea = ')
.append('input')
.attr('type', 'number')
.attr('name', 'ea')
.attr('value', 0.005)
.attr('min', 0)
.attr('max', 10)
.attr('step', 0.001)
elm.append('span')
.text(' ep = ')
.append('input')
.attr('type', 'number')
.attr('name', 'ep')
.attr('value', 0.02)
.attr('min', 0)
.attr('max', 10)
.attr('step', 0.001)
const kernelElm = controller.span()
const kernel = kernelElm.select(['gaussian'])
const gauss_sigma = kernelElm.input.number({ label: ' sigma = ', min: 0, max: 10, step: 0.1, value: 1 })
const alpha = controller.input.number({ label: ' alpha = ', min: 0, max: 10, step: 0.01, value: 0.05 })
const ez = controller.input.number({ label: ' ez = ', min: 0, max: 10, step: 0.1, value: 1 })
const ea = controller.input.number({ label: ' ea = ', min: 0, max: 10, step: 0.001, value: 0.005 })
const ep = controller.input.number({ label: ' ep = ', min: 0, max: 10, step: 0.001, value: 0.02 })
controller
.stepLoopButtons()
.init(() => {
Expand All @@ -86,8 +36,3 @@ var dispGPLVM = function (elm, platform) {
.step(fitModel)
.epoch()
}

export default function (platform) {
platform.setting.ml.usage = 'Click and add data point. Next, click "Fit" button.'
dispGPLVM(platform.setting.ml.configElement, platform)
}
6 changes: 1 addition & 5 deletions js/view/ocsvm.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,7 @@ export default function (platform) {
step: 0.01,
})
const slbConf = controller.stepLoopButtons().init(() => {
const args = []
if (kernel.value === 'gaussian') {
args.push(gamma.value)
}
model = new OCSVM(nu.value, kernel.value, args)
model = new OCSVM(nu.value, { name: kernel.value, d: gamma.value })
model.init(platform.trainInput, platform.trainOutput)
learn_epoch = 0
platform.init()
Expand Down
8 changes: 1 addition & 7 deletions js/view/pca.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,7 @@ export default function (platform) {
} else if (type.value === 'dual') {
model = new DualPCA()
} else {
const args = []
if (kernel.value === 'polynomial') {
args.push(poly_d.value)
} else if (kernel.value === 'gaussian') {
args.push(sigma.value)
}
model = new KernelPCA(kernel.value, args)
model = new KernelPCA({ name: kernel.value, sigma: sigma.value, n: poly_d.value })
}
model.fit(platform.trainInput)
const y = model.predict(platform.trainInput, dim)
Expand Down
6 changes: 1 addition & 5 deletions js/view/s3vm.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,7 @@ export default function (platform) {
step: 0.01,
})
const slbConf = controller.stepLoopButtons().init(() => {
const kernel_args = []
if (kernel.value === 'gaussian') {
kernel_args.push(gamma.value)
}
model = new S3VM(kernel.value, kernel_args)
model = new S3VM({ name: kernel.value, d: gamma.value })
model.init(
platform.trainInput,
platform.trainOutput.map(v => (v[0] == null ? null : v[0] === 1 ? -1 : 1))
Expand Down
6 changes: 1 addition & 5 deletions js/view/svc.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,7 @@ export default function (platform) {
controller
.stepLoopButtons()
.init(() => {
const kernel_args = []
if (kernel.value === 'gaussian') {
kernel_args.push(gamma.value)
}
model = new SVC(kernel.value, kernel_args)
model = new SVC({ name: kernel.value, d: gamma.value })
model.init(platform.trainInput)
platform.init()
})
Expand Down
6 changes: 1 addition & 5 deletions js/view/svm.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,8 @@ export default function (platform) {
step: 0.01,
})
const slbConf = controller.stepLoopButtons().init(() => {
const kernel_args = []
if (kernel.value === 'gaussian') {
kernel_args.push(gamma.value)
}
model = new EnsembleBinaryModel(function () {
return new SVM(kernel.value, kernel_args)
return new SVM({ name: kernel.value, d: gamma.value })
}, method.value)
model.init(
platform.trainInput,
Expand Down
6 changes: 1 addition & 5 deletions js/view/svr.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,7 @@ export default function (platform) {
step: 0.1,
})
const slbConf = controller.stepLoopButtons().init(() => {
const args = []
if (kernel.value === 'gaussian') {
args.push(gamma.value)
}
model = new SVR(kernel.value, args)
model = new SVR({ name: kernel.value, d: gamma.value })
model.init(platform.trainInput, platform.trainOutput)
learn_epoch = 0
platform.init()
Expand Down
11 changes: 7 additions & 4 deletions lib/model/bogd.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default class BOGD {
* @param {number} [lambda=0.1] Regularization parameter
* @param {number} [gamma=0.1] Maximum coefficient
* @param {'uniform' | 'nonuniform'} [sampling=nonuniform] Sampling approach
* @param {'gaussian' | 'polynomial' | function (number[], number[]): number} [kernel=gaussian] Kernel name
* @param {'gaussian' | 'polynomial' | { name: 'gaussian', s?: number } | { name: 'polynomial', d?: number } | function (number[], number[]): number} [kernel=gaussian] Kernel name
* @param {'zero_one' | 'hinge'} [loss=hinge] Loss type name
*/
constructor(
Expand All @@ -31,14 +31,17 @@ export default class BOGD {
if (typeof kernel === 'function') {
this._kernel = kernel
} else {
switch (kernel) {
if (typeof kernel === 'string') {
kernel = { name: kernel }
}
switch (kernel.name) {
case 'gaussian':
this._s = 1
this._s = kernel.s ?? 1
this._kernel = (a, b) =>
Math.exp(-(a.reduce((s, v, i) => s + (v - b[i]) ** 2, 0) ** 2) / this._s ** 2)
break
case 'polynomial':
this._d = 2
this._d = kernel.d ?? 2
this._kernel = (a, b) => (1 + a.reduce((s, v, i) => s + v * b[i])) ** this._d
break
}
Expand Down
11 changes: 7 additions & 4 deletions lib/model/bpa.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default class BPA {
* @param {number} [c=1] Regularization parameter
* @param {number} [b=10] Budget size
* @param {'simple' | 'projecting' | 'nn'} [version=simple] Version
* @param {'gaussian' | 'polynomial' | function (number[], number[]): number} [kernel=gaussian] Kernel name
* @param {'gaussian' | 'polynomial' | { name: 'gaussian', s?: number } | { name: 'polynomial', d?: number } | function (number[], number[]): number} [kernel=gaussian] Kernel name
*/
constructor(c = 1, b = 10, version = 'simple', kernel = 'gaussian') {
this._c = c
Expand All @@ -19,14 +19,17 @@ export default class BPA {
if (typeof kernel === 'function') {
this._kernel = kernel
} else {
switch (kernel) {
if (typeof kernel === 'string') {
kernel = { name: kernel }
}
switch (kernel.name) {
case 'gaussian':
this._s = 1
this._s = kernel.s ?? 1
this._kernel = (a, b) =>
Math.exp(-(a.reduce((s, v, i) => s + (v - b[i]) ** 2, 0) ** 2) / this._s ** 2)
break
case 'polynomial':
this._d = 2
this._d = kernel.d ?? 2
this._kernel = (a, b) => (1 + a.reduce((s, v, i) => s + v * b[i])) ** this._d
break
}
Expand Down
22 changes: 14 additions & 8 deletions lib/model/bsgd.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export default class BSGD {
* @param {number} [eta=1] Learning rate
* @param {number} [lambda=1] Regularization parameter
* @param {'removal' | 'projection' | 'merging'} [maintenance=removal] Maintenance type
* @param {'gaussian' | 'polynomial' | function (number[], number[]): number} [kernel=gaussian] Kernel name
* @param {'gaussian' | 'polynomial' | { name: 'gaussian', s?: number } | { name: 'polynomial', d?: number } | function (number[], number[]): number} [kernel=gaussian] Kernel name
*/
constructor(b = 10, eta = 1, lambda = 1, maintenance = 'removal', kernel = 'gaussian') {
this._b = b
Expand All @@ -21,14 +21,17 @@ export default class BSGD {
if (typeof kernel === 'function') {
this._kernel = kernel
} else {
switch (kernel) {
if (typeof kernel === 'string') {
kernel = { name: kernel }
}
switch (kernel.name) {
case 'gaussian':
this._s = 1
this._s = kernel.s ?? 1
this._kernel = (a, b) =>
Math.exp(-(a.reduce((s, v, i) => s + (v - b[i]) ** 2, 0) ** 2) / this._s ** 2)
break
case 'polynomial':
this._d = 2
this._d = kernel.d ?? 2
this._kernel = (a, b) => (1 + a.reduce((s, v, i) => s + v * b[i])) ** this._d
break
}
Expand Down Expand Up @@ -195,7 +198,7 @@ export class MulticlassBSGD {
* @param {number} [eta=1] Learning rate
* @param {number} [lambda=1] Regularization parameter
* @param {'removal' | 'projection' | 'merging'} [maintenance=removal] Maintenance type
* @param {'gaussian' | 'polynomial' | function (number[], number[]): number} [kernel=gaussian] Kernel name
* @param {'gaussian' | 'polynomial' | { name: 'gaussian', s?: number } | { name: 'polynomial', d?: number } | function (number[], number[]): number} [kernel=gaussian] Kernel name
*/
constructor(b = 10, eta = 1, lambda = 1, maintenance = 'removal', kernel = 'gaussian') {
this._b = b
Expand All @@ -205,14 +208,17 @@ export class MulticlassBSGD {
if (typeof kernel === 'function') {
this._kernel = kernel
} else {
switch (kernel) {
if (typeof kernel === 'string') {
kernel = { name: kernel }
}
switch (kernel.name) {
case 'gaussian':
this._s = 1
this._s = kernel.s ?? 1
this._kernel = (a, b) =>
Math.exp(-(a.reduce((s, v, i) => s + (v - b[i]) ** 2, 0) ** 2) / this._s ** 2)
break
case 'polynomial':
this._d = 2
this._d = kernel.d ?? 2
this._kernel = (a, b) => (1 + a.reduce((s, v, i) => s + v * b[i])) ** this._d
break
}
Expand Down
11 changes: 7 additions & 4 deletions lib/model/coll.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,25 @@ export default class COLL {
/**
* @param {number} c Number of clusters
* @param {number} [eta=1] Initial learning rate
* @param {'gaussian' | 'polynomial' | function (number[], number[]): number} [kernel=gaussian] Kernel name
* @param {'gaussian' | 'polynomial' | { name: 'gaussian', s?: number } | { name: 'polynomial', d?: number } | function (number[], number[]): number} [kernel=gaussian] Kernel name
*/
constructor(c, eta = 1, kernel = 'gaussian') {
this._c = c
this._eta = eta
if (typeof kernel === 'function') {
this._kernel = kernel
} else {
switch (kernel) {
if (typeof kernel === 'string') {
kernel = { name: kernel }
}
switch (kernel.name) {
case 'gaussian':
this._s = 1
this._s = kernel.s ?? 1
this._kernel = (a, b) =>
Math.exp(-(a.reduce((s, v, i) => s + (v - b[i]) ** 2, 0) ** 2) / this._s ** 2)
break
case 'polynomial':
this._d = 2
this._d = kernel.d ?? 2
this._kernel = (a, b) => (1 + a.reduce((s, v, i) => s + v * b[i])) ** this._d
break
}
Expand Down
4 changes: 2 additions & 2 deletions lib/model/denclue.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export default class DENCLUE {
/**
* @param {number} h Smoothing parameter for the kernel
* @param {1 | 2} [version=1] Version number
* @param {'gaussian' | function (number[]): number} [kernel=gaussian] Kernel name
* @param {'gaussian' | { name: 'gaussian' } | function (number[]): number} [kernel=gaussian] Kernel name
*/
constructor(h, version = 1, kernel = 'gaussian') {
this._version = version
Expand All @@ -19,7 +19,7 @@ export default class DENCLUE {

if (typeof kernel === 'function') {
this._kernel = kernel
} else if (kernel === 'gaussian') {
} else if (kernel === 'gaussian' || kernel.name === 'gaussian') {
this._kernel = u => {
const d = u.length
return Math.exp(-u.reduce((s, v) => s + v ** 2, 0) / 2) / (2 * Math.PI) ** (d / 2)
Expand Down
4 changes: 2 additions & 2 deletions lib/model/diffusion_map.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ export default class DiffusionMap {
// https://inside.mines.edu/~whereman/papers/delaPorte-Herbst-Hereman-vanderWalt-PRASA-2008.pdf
/**
* @param {number} t Power parameter
* @param {'gaussian' | function (number[], number[]): number} [kernel=gaussian] Kernel name
* @param {'gaussian' | { name: 'gaussian' } | function (number[], number[]): number} [kernel=gaussian] Kernel name
*/
constructor(t, kernel = 'gaussian') {
this._t = t
if (typeof kernel === 'function') {
this._k = kernel
} else if (kernel === 'gaussian') {
} else if (kernel === 'gaussian' || kernel.name === 'gaussian') {
this._k = (x, y) => Math.exp(-x.reduce((s, v, i) => s + (v - y[i]) ** 2, 0) / 2)
}
}
Expand Down
11 changes: 7 additions & 4 deletions lib/model/forgetron.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,24 @@ export default class Forgetron {
// https://github.com/LIBOL/KOL
/**
* @param {number} b Budget parameter
* @param {'gaussian' | 'polynomial' | function (number[], number[]): number} [kernel=gaussian] Kernel name
* @param {'gaussian' | 'polynomial' | { name: 'gaussian', s?: number } | { name: 'polynomial', d?: number } | function (number[], number[]): number} [kernel=gaussian] Kernel name
*/
constructor(b, kernel = 'gaussian') {
this._b = b
if (typeof kernel === 'function') {
this._kernel = kernel
} else {
switch (kernel) {
if (typeof kernel === 'string') {
kernel = { name: kernel }
}
switch (kernel.name) {
case 'gaussian':
this._s = 1
this._s = kernel.s ?? 1
this._kernel = (a, b) =>
Math.exp(-(a.reduce((s, v, i) => s + (v - b[i]) ** 2, 0) ** 2) / this._s ** 2)
break
case 'polynomial':
this._d = 2
this._d = kernel.d ?? 2
this._kernel = (a, b) => (1 + a.reduce((s, v, i) => s + v * b[i])) ** this._d
break
}
Expand Down
Loading