{"version":3,"file":"obliczeniowo-elementary-perceptron.mjs","sources":["../../../../projects/components/perceptron/classes/perceptron.ts","../../../../projects/components/perceptron/components/perceptron/perceptron.component.ts","../../../../projects/components/perceptron/components/perceptron/perceptron.component.html","../../../../projects/components/perceptron/perceptron.module.ts","../../../../projects/components/perceptron/obliczeniowo-elementary-perceptron.ts"],"sourcesContent":["/**\n * Single perceptron model\n */\nexport class Perceptron {\n  protected weights: number[] = [];\n\n  protected error: number = 0;\n  protected errors: number[] = [];\n\n  constructor(protected paramsLength: number, protected eta: number) {\n    this.setParamsLength(paramsLength);\n    this.setEta(eta);\n  }\n\n  protected getFactor(parameters: number[]): number {\n    let factor = 0;\n\n    for (let i = 0; i < this.paramsLength; i++) {\n      factor += this.weights[i] * parameters[i];\n    }\n\n    return factor;\n  }\n\n  getError(): number {\n    return this.error;\n  }\n\n  getErrors(): number[] {\n    return this.errors;\n  }\n\n  setParamsLength(paramsLength: number) {\n    this.paramsLength = Math.ceil(paramsLength + 1);\n    if (this.paramsLength < 1) {\n      throw new Error('Number of parameters must be greater then 0');\n    }\n\n    this.weights = new Array<number>(this.paramsLength).fill(1);\n  }\n\n  setEta(eta: number) {\n    if (eta <= 0) {\n      throw new Error(`Eta should be > 0 but ${eta} was given`)\n    }\n    this.eta = eta;\n  }\n\n  /**\n   * Output perceptron response\n   * @param parameters input parameters\n   * @returns -1 / 1 value\n   */\n  y(parameters: number[]) {\n    if (parameters.length === this.paramsLength - 1) {\n      parameters = [...parameters, 1];\n    }\n    const factor = this.getFactor(parameters);\n    if (factor > 0) {\n      return 1;\n    }\n    return -1;\n  }\n\n  /**\n   * Add training data single record\n   * @param parameters array of this.parameters length\n   * @param y expected value -1 or 1\n   */\n  train(parameters: number[], y: number) {\n    if (parameters.length === this.paramsLength - 1) {\n      parameters = [...parameters, 1];\n    }\n    const error = y - this.y(parameters);\n    this.error += Math.abs(error);\n    const delta = error * this.eta;\n    this.weights.forEach((_, index: number) => {\n      this.weights[index] += delta * parameters[index];\n    });\n  }\n\n  /**\n   * Trening perceptron over the epoch times clear previously created table\n   * @param x input parameters training table (size must be equal parameter field of this class)\n   * @param y output expected value\n   * @param epoch how many time repeat training session\n   */\n  fit(x: number[][], y: number[], epoch: number) {\n    this.weights.fill(1);\n    this.error = 0;\n    this.errors = [];\n    for (let i = 0; i < epoch; i++) {\n      x.forEach((params: number[], index) => this.train(params, y[index]));\n      this.errors.push(this.error);\n      this.error = 0;\n    }\n  }\n\n  /** */\n  getWeights(): number[] {\n    return this.weights;\n  }\n\n  /** */\n  setWeights(weights: number[]): void {\n    if (this.paramsLength !== weights.length) {\n      throw new Error(`Try to set weights that have wrong length. Expected: ${this.paramsLength} but ${weights.length}`);\n    }\n    this.weights = [...weights];\n  }\n\n  /**\n   * Calc linear function factors for m dimension that is equal to number of input parameters\n   * and weights inside perceptron\n   *\n   * @param n - determine index for f(xn) function of m dimension, n is integer from range 0\n   * to m - 1\n   * @returns table of factors for f(xn) function, to calculate xn of m dimension you need to\n   * calc:\n   *\n   * xn = suma od k = 0 do k < n { f[k] * x[k] } + f[n]\n   */\n  fXnFactors(n: number): number[] {\n    const factors: number[] = [];\n\n    for (let i = 0; i < this.paramsLength; i++) {\n      if (i !== n) {\n        factors.push(-this.weights[i] / this.weights[n]);\n      }\n    }\n\n    return factors;\n  }\n}\n","import { Component, Input, SimpleChanges, EventEmitter, Output, ViewChild, ElementRef } from '@angular/core';\n\nimport { ElementaryMath } from '@obliczeniowo/elementary/math';\nimport { LinePattern } from '@obliczeniowo/elementary/drawing';\nimport { PointType } from '@obliczeniowo/elementary/linear-diagram';\nimport { Point2D } from '@obliczeniowo/elementary/classes';\n\nimport { Perceptron } from './../../classes/perceptron';\n\n@Component({\n    selector: 'obl-perceptron',\n    templateUrl: './perceptron.component.html',\n    styleUrls: ['./perceptron.component.scss'],\n    standalone: false\n})\nexport class PerceptronComponent {\n  LinePattern = LinePattern;\n  PointType = PointType;\n\n  /**\n   * Perceptron inputs table all of the same size must be\n   *\n   * this.x[k].length === this.inputs\n   */\n  @Input() x: number[][] = [];\n\n  /**\n   * Perceptron y outputs\n   */\n  @Input() y: number[] = [];\n\n  /**\n   * Numbers of rounds\n   */\n  @Input() epoch: number = 100;\n\n  /**\n   * x to predict y after learning session\n   *\n   * this.xWithoutY[k].length === this.inputs\n   */\n  @Input() xWithoutY: number[][] = [];\n\n  /**\n   * Expected input parameters, determine size of x second index table\n   *\n   * this.x[k].length === this.inputs\n   */\n  @Input() inputs: number = 2;\n\n  /**\n   * Value determine speed of learning. Range: > 0 to 1\n   */\n  @Input() eta: number = 0.1;\n\n  /** */\n  @Input() display: {\n    description?: boolean,\n    diagram?: boolean\n  } = {\n      description: true,\n      diagram: true\n    }\n\n  /** */\n  @Input() set weights(weights: number[]) {\n    this.perceptron.setWeights(weights);\n    if (this.xWithoutY) {\n      this.predict();\n    }\n  }\n\n  /** */\n  get weights(): number[] {\n    return this.perceptron.getWeights();\n  }\n\n  /**\n   * Emit predicted value\n   */\n  @Output() predicted: EventEmitter<number[]> = new EventEmitter<number[]>();\n\n  @ViewChild('svg') readonly svg!: ElementRef<SVGSVGElement>;\n\n  yPred: number[] = [];\n\n  points: Point2D[][] = [];\n\n  xMinMax!: { min: number; max: number };\n  yMinMax!: { min: number; max: number };\n\n  private readonly perceptron: Perceptron = new Perceptron(this.inputs, this.eta);\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.inputs) {\n      this.perceptron.setParamsLength(this.inputs);\n    }\n    if (changes.eta) {\n      this.perceptron.setEta(this.eta);\n    }\n    if (changes.eta || changes.inputs || changes.epoch || changes.x || changes.y) {\n      this.recalc();\n    }\n    if (changes.xWithoutY) {\n      this.predict();\n    }\n  }\n\n  getError(): number {\n    return this.perceptron.getError();\n  }\n\n  getErrors(): number[] {\n    return this.perceptron.getErrors();\n  }\n\n  getWeights(): number[] {\n    return this.perceptron.getWeights();\n  }\n\n  getWeightsHeaders(): string[] {\n    return this.getWeights().map((_, index) => `W ${index}`);\n  }\n\n  getXHeaders(): string[] {\n    return new Array(this.perceptron.getWeights().length - 1).fill(0).map((_, index) => `X ${index + 1}`);\n  }\n\n  protected predict() {\n    const yPred: number[] = [];\n\n    this.xWithoutY.forEach(x => yPred.push(this.perceptron.y(x)));\n\n    this.yPred = yPred;\n\n    this.predicted.emit(this.yPred);\n  }\n\n  protected recalc() {\n    if (this.x.length === this.y.length) {\n      this.perceptron.fit(this.x, this.y, this.epoch);\n\n      if (this.xWithoutY) {\n        this.predict();\n      }\n\n      if (this.x?.length === this.y?.length) {\n        this.points = [];\n\n        if (this.inputs > 1) {\n          const first: Point2D[] = [];\n          const second: Point2D[] = [];\n\n          const points: Point2D[][] = [];\n\n          this.x.forEach((x: number[], index: number) => {\n            if (this.y[index] < 0) {\n              first.push(new Point2D(x[0], x[1]));\n            } else {\n              second.push(new Point2D(x[0], x[1]));\n            }\n          })\n\n          points.push(first);\n          points.push(second);\n\n          if (this.xWithoutY.length && this.yPred) {\n            const predictedFirst: Point2D[] = [];\n            const predictedSecond: Point2D[] = [];\n\n            this.xWithoutY.forEach((x: number[], index: number) => {\n              if (this.yPred[index] === -1) {\n                predictedFirst.push(new Point2D(x[0], x[1]));\n              } else {\n                predictedSecond.push(new Point2D(x[0], x[1]));\n              }\n            });\n\n            points.push(predictedFirst);\n            points.push(predictedSecond);\n          }\n\n          const all = points.reduce((p, c) => (p = p.concat(c), p), []);\n          this.xMinMax = ElementaryMath.getMinMax(all.map(p => p.x));\n          this.yMinMax = ElementaryMath.getMinMax(all.map(p => p.y));\n\n          const params = this.perceptron.fXnFactors(1);\n\n          const calc = (x: number) => params[0] * x + params[1];\n\n          points.push([\n            new Point2D(this.xMinMax.min, calc(this.xMinMax.min)),\n            new Point2D(this.xMinMax.max, calc(this.xMinMax.max))\n          ])\n\n          this.points = points;\n\n          const dX = ((this.xMinMax.max - this.xMinMax.min) * 0.01) || 1;\n          const dY = ((this.yMinMax.max - this.yMinMax.min) * 0.01) || 1;\n\n          this.xMinMax = { min: this.xMinMax.min - dX, max: this.xMinMax.max + dX };\n          this.yMinMax = { min: this.yMinMax.min - dY, max: this.yMinMax.max + dY };\n        }\n      }\n    }\n  }\n}\n","@if (display.description) {\n  <div>\n    <obl-array-to-table\n      caption=\"Weights\"\n      [maxLength]=\"4\"\n      [display]=\"{ index: false, download: 'csv' }\"\n      [array]=\"[getWeights()]\"\n      [headers]=\"getWeightsHeaders()\"\n    ></obl-array-to-table>\n  </div>\n  <div><b>η (eta):</b> {{ eta }}</div>\n  <div><b>Epoch:</b> {{ epoch }}</div>\n\n  <div>\n    <obl-array-to-table\n      caption=\"X without y:\"\n      [array]=\"xWithoutY\"\n      [headers]=\"getXHeaders()\"\n    ></obl-array-to-table>\n\n    <obl-array-to-table\n      caption=\"Y predicted\"\n      [maxLength]=\"15\"\n      [display]=\"{ index: false, download: 'csv' }\"\n      [array]=\"[yPred]\"\n    ></obl-array-to-table>\n  </div>\n  <obl-array-to-table\n    caption=\"Errors\"\n    [maxLength]=\"15\"\n    [display]=\"{ index: false, download: 'csv' }\"\n    [array]=\"[getErrors()]\"\n  ></obl-array-to-table>\n}\n\n@if (display.diagram) {\n  <obl-linear-diagram-2d\n    [points]=\"points\"\n    [options]=\"{\n    xMinMax,\n    yMinMax,\n    set: [\n      {\n        color: '#ff0000',\n        stroke: 0,\n        linePattern: LinePattern.DISABLED,\n        drawPoint: PointType.STAR\n      },\n      {\n        color: '#0000ff',\n        stroke: 2,\n        linePattern: LinePattern.DISABLED,\n        drawPoint: PointType.X\n      },\n      {\n        color: '#ff8800',\n        stroke: 0,\n        linePattern: LinePattern.DISABLED,\n        drawPoint: PointType.STAR\n      },\n      {\n        color: '#0088ff',\n        stroke: 2,\n        linePattern: LinePattern.DISABLED,\n        drawPoint: PointType.X\n      },\n      {\n        color: '#00ff00',\n        stroke: 2,\n        linePattern: LinePattern.NONE,\n        drawPoint: PointType.NONE\n      },\n    ]\n  }\"\n    [legend]=\"['Y = -1', 'Y = 1', 'Pred Y = -1', 'Pred Y = 1', 'border function']\"\n  ></obl-linear-diagram-2d>\n}\n","import { ArrayToTableModule } from '@obliczeniowo/elementary/array-to-table';\nimport { LinearDiagramModule } from '@obliczeniowo/elementary/linear-diagram';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PerceptronComponent } from './components/perceptron/perceptron.component';\n\n@NgModule({\n  declarations: [\n    PerceptronComponent\n  ],\n  imports: [\n    CommonModule,\n    LinearDiagramModule,\n    ArrayToTableModule\n  ],\n  exports: [\n    PerceptronComponent\n  ]\n})\nexport class PerceptronModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}