[Home] Restricted access for guests. The link to Java source code is disabled
Java source code of 'jhplot.bsom.Bsom'
package jhplot.bsom;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.Math;
import java.lang.Double;
import java.util.Vector;
import javax.swing.*;
import jhplot.P1D;
import java.lang.Math;
/**
* Bsom is an application of Bayesian Self-Organizing Maps.
*
* @author Akio Utsugi and Sergei Chekanov
*/
public class Bsom extends BsomDemo {
/**
*
*/
private static final long serialVersionUID = 1L;
private BsomDrawArea bsomDrawArea;
private JTextField inputText;
private JTextField dstepText;
private String input_file;
private JButton outputButton;
private P1D p1d = null;
private Vector buf;
static int INIT = 0;
static double[][] value;
public int getNiterations() {
return bsomDrawArea.ntot;
}
public double getAlpha() {
return bsomDrawArea.alpha;
}
public double getBeta() {
return bsomDrawArea.beta;
}
/**
*
*
* initialize learning
* */
public void initPar(double alpha, double beta, int units) {
INIT = 0;
n_data = 100;
n_unit = units;
alpha_min_power = 0.0;
alpha_max_power = 5.0;
beta_min_power = 0.0;
beta_max_power = 5.0;
xd = 250;
yd = 175;
scale = 80;
dstep = 10;
initial_weight_level = 0.1;
input_file = "p1d";
initial_alpha = alpha;
initial_beta = beta;
if (buf != null) {
n_data = buf.size() / 2;
} else {
showStatus("Input is data are required.");
stop();
}
// Draw area
bsomDrawArea = new BsomDrawArea(this, xd, yd, scale);
bsomDrawArea.n_data = n_data;
bsomDrawArea.n_unit = n_unit;
bsomDrawArea.dstep = dstep;
bsomDrawArea.initial_weight_level = initial_weight_level;
bsomDrawArea.alpha = initial_alpha;
bsomDrawArea.beta = initial_beta;
bsomDrawArea.buf = buf;
// System.out.println(outputWeightP1D().toString());
// System.out.println( drawArea.W.row );
// System.out.println( drawArea.W.col );
/*
* for (int i = 0; i < p1d.size(); i++) {
* drawArea.W.value[i][0]=p1d.getX(i);
* drawArea.W.value[i][1]=p1d.getY(i); }
*/
// Obtain means.
P1D init = p1d.copy();
int n = p1d.size();
if (units == n) {
INIT = 1;
double mx = init.meanX();
double my = init.meanY();
value = new double[n][2];
for (int i = 0; i < n; i++) {
value[i][0] = init.getX(i);
value[i][1] = init.getY(i);
}
// Move the means to zeros and then get the range.
double dmax = 0;
for (int i = 0; i < n; i++) {
value[i][0] -= mx;
value[i][1] -= my;
if (Math.abs(value[i][0]) > dmax) {
dmax = Math.abs(value[i][0]);
}
if (Math.abs(value[i][1]) > dmax) {
dmax = Math.abs(value[i][1]);
}
}
// Resize the data to go into a 2*2 box.
double dscale = 2. / dmax;
// System.out.println(dscale);
for (int i = 0; i < n; i++) {
value[i][0] *= dscale;
value[i][1] *= dscale;
}
};
// end the case
bsomDrawArea.init();
UserData UX = (UserData) bsomDrawArea.X;
double dscale = UX.dscale;
// System.out.println(dscale);
drawArea = bsomDrawArea;
drawArea.W.init();
/*
* for (int i=0; i();
this.p1d = p1d;
for (int i = 0; i < p1d.size(); i++) {
buf.addElement(new Double(p1d.getX(i)));
buf.addElement(new Double(p1d.getY(i)));
// System.out.println(p1d.getX(i));
// System.out.println(p1d.getY(i));
}
}
public void loadData(String input_file) {
this.buf = new Vector();
this.p1d = new P1D(input_file);
for (int i = 0; i < p1d.size(); i++) {
buf.addElement(new Double(p1d.getX(i)));
buf.addElement(new Double(p1d.getY(i)));
}
}
public void reloadData(String input_file) {
if (p1d != null)
loadData(p1d);
bsomDrawArea.alpha = initial_alpha;
bsomDrawArea.beta = initial_beta;
bsomDrawArea.buf = buf;
bsomDrawArea.auto_learn = false;
bsomDrawArea.learn = false;
bsomDrawArea.initData();
bsomDrawArea.W.init();
bsomDrawArea.draw_new_data = true;
autoButton.setSelected(false);
learnButton.setSelected(false);
alphaSlider.setValueOfSlider(initial_alpha);
betaSlider.setValueOfSlider(initial_beta);
repaint();
}
public void outputWeight() {
int i;
double x, y;
Weight W = bsomDrawArea.W;
UserData UX = (UserData) bsomDrawArea.X;
double dscale = UX.dscale;
double mx = UX.mx;
double my = UX.my;
for (i = 0; i < W.row; i++) {
x = W.value[i][0] / dscale + mx;
y = W.value[i][1] / dscale + my;
System.out.println(x + " " + y);
}
System.out.println(" ");
}
/**
* Return results
*
* @return P1D with results
*/
public P1D outputWeightP1D() {
int i;
double x, y;
Weight W = bsomDrawArea.W;
UserData UX = (UserData) bsomDrawArea.X;
double dscale = UX.dscale;
double mx = UX.mx;
double my = UX.my;
P1D p1d = new P1D("MSOM results");
for (i = 0; i < W.row; i++) {
x = W.value[i][0] / dscale + mx;
y = W.value[i][1] / dscale + my;
p1d.add(x, y);
}
return p1d;
}
/**
* * Generate error message * * @param a * Message
* */
private void showStatus(String a) {
JOptionPane dialogError = new JOptionPane();
JOptionPane.showMessageDialog(dialogError, a, "Error",
JOptionPane.ERROR_MESSAGE);
}
}