⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrixpanel.java

📁 一个数据挖掘软件ALPHAMINERR的整个过程的JAVA版源代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	  p3.add(p1, gbc);
	  gbc.insets = new Insets(8,4,8,4);
	  p3.add(doneBt, gbc);
					   
	  jd.getContentPane().setLayout( new BorderLayout() );
	  jd.getContentPane().add(p3, BorderLayout.NORTH);
	  jd.pack();
	  jd.setLocation( m_resampleBt.getLocationOnScreen().x,
			  m_resampleBt.getLocationOnScreen().y-jd.getHeight() );
	  jd.setVisible(true);
	}
      });

    optionsPanel = new JPanel( new GridBagLayout() ); //all the rest of the panels are in here.
    final JPanel p2 = new JPanel( new BorderLayout() );  //this has class colour panel
    final JPanel p3 = new JPanel( new GridBagLayout() ); //this has update and select buttons
    final JPanel p4 = new JPanel( new GridBagLayout() ); //this has the slider bars and combobox
    GridBagConstraints gbc = new GridBagConstraints();
     
    m_plotLBSizeD = m_plotSizeLb.getPreferredSize();
    m_pointLBSizeD = m_pointSizeLb.getPreferredSize();
    m_pointSizeLb.setText(Resource.srcStr("m_pointSizeLb")+": [1]");
    m_pointSizeLb.setPreferredSize( m_pointLBSizeD );
    m_resampleBt.setPreferredSize( m_selAttrib.getPreferredSize() );

    gbc.fill = gbc.HORIZONTAL;
    gbc.anchor = gbc.NORTHWEST;
    gbc.insets = new Insets(2,2,2,2);
    p4.add(m_plotSizeLb, gbc);
    gbc.weightx=1; gbc.gridwidth = gbc.REMAINDER;
    p4.add(m_plotSize, gbc);
    gbc.weightx=0; gbc.gridwidth = gbc.RELATIVE;
    p4.add(m_pointSizeLb, gbc);
    gbc.weightx=1; gbc.gridwidth = gbc.REMAINDER;
    p4.add(m_pointSize, gbc);
    gbc.weightx=0; gbc.gridwidth = gbc.RELATIVE;
    p4.add( new JLabel(Resource.srcStr("Jitter")+": "), gbc);
    gbc.weightx=1; gbc.gridwidth = gbc.REMAINDER;
    p4.add(m_jitter, gbc);
    p4.add(m_classAttrib, gbc);
      
    gbc.gridwidth = gbc.REMAINDER;
    gbc.weightx=1;
    gbc.fill = gbc.NONE;
    p3.add(m_updateBt, gbc);
    p3.add(m_selAttrib, gbc);
    gbc.gridwidth = gbc.RELATIVE;
    gbc.weightx = 0;
    gbc.fill = gbc.VERTICAL;
    gbc.anchor = gbc.WEST;
    p3.add(m_resampleBt, gbc);
    gbc.gridwidth = gbc.REMAINDER;
    p3.add(m_resamplePercent, gbc);
    
    p2.setBorder(BorderFactory.createTitledBorder(Resource.srcStr("Classcolour")));
    p2.add(m_cp, BorderLayout.SOUTH);

    gbc.insets = new Insets(8,5,2,5);
    gbc.anchor = gbc.SOUTHWEST; gbc.fill = gbc.HORIZONTAL; gbc.weightx=1;
    gbc.gridwidth = gbc.RELATIVE;
    optionsPanel.add(p4, gbc);
    gbc.gridwidth = gbc.REMAINDER;
    optionsPanel.add(p3, gbc);
    optionsPanel.add(p2, gbc);

    this.addComponentListener( new ComponentAdapter() {
	public void componentResized(ComponentEvent cv) {
	  m_js.setMinimumSize( new Dimension(MatrixPanel.this.getWidth(),
					     MatrixPanel.this.getHeight()
					     -optionsPanel.getPreferredSize().height-10));
	  jp.setDividerLocation( MatrixPanel.this.getHeight()-optionsPanel.getPreferredSize().height-10 );
	}
      });

    optionsPanel.setMinimumSize( new Dimension(0,0) );
    jp = new JSplitPane(JSplitPane.VERTICAL_SPLIT, m_js, optionsPanel);
    jp.setOneTouchExpandable(true);
    jp.setResizeWeight(1);
    this.setLayout( new BorderLayout() );
    this.add(jp, BorderLayout.CENTER);

    /** Setting up the initial color list **/
    for(int i=0; i<m_defaultColors.length-1; i++)
      m_colorList.addElement(m_defaultColors[i]);
      
    /** Initializing internal fields and components **/
    m_selectedAttribs = m_attribList.getSelectedIndices();
    m_plotsPanel = new Plot();
    m_plotsPanel.setLayout(null);
    m_js.getHorizontalScrollBar().setUnitIncrement( 10 );
    m_js.getVerticalScrollBar().setUnitIncrement( 10 ); 
    m_js.setViewportView( m_plotsPanel );
    m_js.setColumnHeaderView( m_plotsPanel.getColHeader() );
    m_js.setRowHeaderView( m_plotsPanel.getRowHeader() );
    final JLabel lb = new JLabel(Resource.srcStr("lb"));
    lb.setFont(f); lb.setForeground(fontColor);
    lb.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
    m_js.setCorner(JScrollPane.UPPER_LEFT_CORNER, lb);
    m_cp.setInstances(m_data);
    m_cp.setBorder(BorderFactory.createEmptyBorder(15,10,10,10));
    m_cp.addRepaintNotify(m_plotsPanel);
    //m_updateBt.doClick(); //not until setting up the instances
  }



  /** Initializes internal data fields, i.e. data values, type, missing and color cache arrays 
   */
  public void initInternalFields() {
    Instances inst = m_data;
    m_classIndex = m_classAttrib.getSelectedIndex();
    m_selectedAttribs = m_attribList.getSelectedIndices();
    double minC=0, maxC=0;

    /** Resampling  **/
    if(Double.parseDouble(m_resamplePercent.getText())<100) {
      try {
	if(m_data.attribute(m_classIndex).isNominal() ) {
	  inst = new Instances(m_data); // To save class index
	  inst.setClassIndex(m_classIndex);
	  weka.filters.supervised.instance.Resample r = 
	    new weka.filters.supervised.instance.Resample();
		  
	  r.setRandomSeed( Integer.parseInt(m_rseed.getText()) );
	  r.setSampleSizePercent( Double.parseDouble(m_resamplePercent.getText()) );
		  
	  if(origDist.isSelected())
	    r.setBiasToUniformClass(0);
	  else
	    r.setBiasToUniformClass(1);
	  r.setInputFormat(inst);
	  inst = weka.filters.Filter.useFilter(inst, r);
	}
	else {
	  weka.filters.unsupervised.instance.Resample r = 
	    new weka.filters.unsupervised.instance.Resample();
		  
	  r.setRandomSeed( Integer.parseInt(m_rseed.getText()) );
	  r.setSampleSizePercent( Double.parseDouble(m_resamplePercent.getText()) );
	  r.setInputFormat(m_data);
	  inst = weka.filters.Filter.useFilter(m_data, r);
	}
      }
      catch(Exception ex) { System.out.println("Error occurred while sampling"); ex.printStackTrace();  }
    }
    
    m_points = new int[inst.numInstances()][m_selectedAttribs.length]; //changed
    m_pointColors = new int[inst.numInstances()];
    m_missing = new boolean[inst.numInstances()][m_selectedAttribs.length+1]; //changed
    m_type = new int[2]; //[m_selectedAttribs.length]; //changed
    jitterVals = new int[inst.numInstances()][2];
      
    /** Setting up the color list for non-numeric attribute as well as jittervals**/
    if(!(inst.attribute(m_classIndex).isNumeric())) {
	  
      for(int i=m_colorList.size(); i<inst.attribute(m_classIndex).numValues()+1; i++) {
	Color pc = m_defaultColors[i % 10];
	int ija =  i / 10;
	ija *= 2; 
	for (int j=0;j<ija;j++) {
	    pc = pc.darker();
	}
	m_colorList.addElement(pc);
      }
	  
      for(int i=0; i<inst.numInstances(); i++) {
	//set to black for missing class value which is last colour is default list
	if(inst.instance(i).isMissing(m_classIndex))
	  m_pointColors[i] =  m_defaultColors.length-1;
	else
	  m_pointColors[i] = (int) inst.instance(i).value(m_classIndex);

	jitterVals[i][0] = rnd.nextInt(m_jitter.getValue()+1)
	  - m_jitter.getValue()/2;
	jitterVals[i][1] = rnd.nextInt(m_jitter.getValue()+1)
	  - m_jitter.getValue()/2;
	      
      }
    }
    /** Setting up color variations for numeric attribute as well as jittervals **/
    else {
      for(int i=0; i<inst.numInstances(); i++) {
	if(!(inst.instance(i).isMissing(m_classIndex))) {
	  minC = maxC = inst.instance(i).value(m_classIndex);
	  break;
	}
      }
	  
      for(int i=1; i<inst.numInstances(); i++) {
	if(!(inst.instance(i).isMissing(m_classIndex))) {
	  if(minC > inst.instance(i).value(m_classIndex))
	    minC = inst.instance(i).value(m_classIndex);
	  if(maxC < inst.instance(i).value(m_classIndex))
	    maxC = inst.instance(i).value(m_classIndex);
	}
      }
	  
      for(int i=0; i<inst.numInstances(); i++) {
	double r = (inst.instance(i).value(m_classIndex) - minC) / (maxC - minC);
	r = (r * 240) + 15;
	m_pointColors[i] = (int)r;

	jitterVals[i][0] = rnd.nextInt(m_jitter.getValue()+1)
	  - m_jitter.getValue()/2;
	jitterVals[i][1] = rnd.nextInt(m_jitter.getValue()+1)
	  - m_jitter.getValue()/2;
      }
    }

    /** Creating local cache of the data values **/
    double min[]=new double[m_selectedAttribs.length], max=0;  //changed
    double ratio[] = new double[m_selectedAttribs.length];     //changed
    double cellSize = m_plotSize.getValue(), temp1=0, temp2=0;

    for(int j=0; j<m_selectedAttribs.length; j++) {
      int i;
      for(i=0; i<inst.numInstances(); i++) {
	min[j] = max = 0;
	if(!(inst.instance(i).isMissing(m_selectedAttribs[j]))) {
	  min[j] = max = inst.instance(i).value(m_selectedAttribs[j]);
	  break;
	}
      }
      for( i=i; i<inst.numInstances(); i++ ) {
	if(!(inst.instance(i).isMissing(m_selectedAttribs[j]))) {
	  if(inst.instance(i).value(m_selectedAttribs[j]) < min[j])
	    min[j] = inst.instance(i).value(m_selectedAttribs[j]);
	  if(inst.instance(i).value(m_selectedAttribs[j]) > max)
	    max = inst.instance(i).value(m_selectedAttribs[j]);
	}
      }
      ratio[j] =  cellSize / (max - min[j]);
    }

    boolean classIndexProcessed=false;
    for(int j=0; j<m_selectedAttribs.length; j++) {
      if(inst.attribute(m_selectedAttribs[j]).isNominal() || inst.attribute(m_selectedAttribs[j]).isString()) {
	  //m_type[0][j] = 1;  m_type[1][j] = inst.attribute(m_selectedAttribs[j]).numValues();

	temp1 = cellSize/(double)inst.attribute(m_selectedAttribs[j]).numValues(); //m_type[1][j];
	temp2 = temp1/2;
	for(int i=0; i<inst.numInstances(); i++) {
	  m_points[i][j] = (int) Math.round(temp2+temp1*inst.instance(i).value(m_selectedAttribs[j]));
	  if(inst.instance(i).isMissing(m_selectedAttribs[j])) {
	    m_missing[i][j] = true;    //represents missing value
	    if(m_selectedAttribs[j]==m_classIndex) {
		m_missing[i][m_missing[0].length-1] = true;
		classIndexProcessed = true;
	    }
	  }
	}
      }
      else {
	  //m_type[0][j] = m_type[1][j] = 0;
	for(int i=0; i<inst.numInstances(); i++) {
	  m_points[i][j] = (int) Math.round((inst.instance(i).value(m_selectedAttribs[j])
					     -min[j])*ratio[j]);	
	  if(inst.instance(i).isMissing(m_selectedAttribs[j])) {
	    m_missing[i][j] = true;    //represents missing value
	    if(m_selectedAttribs[j]==m_classIndex) {
		m_missing[i][m_missing[0].length-1] = true;
		classIndexProcessed = true;
	    }
	  }
	}
      }
    }

    if(inst.attribute(m_classIndex).isNominal() || inst.attribute(m_classIndex).isString()) {
	m_type[0] = 1; m_type[1] = inst.attribute(m_classIndex).numValues();
    }
    else
	m_type[0] = m_type[1] = 0;

    if(classIndexProcessed==false) {  //class Index has not been processed as class index is not among the selected attribs
	for(int i=0; i<inst.numInstances(); i++) {
	    if(inst.instance(i).isMissing(m_classIndex))
		m_missing[i][m_missing[0].length-1] = true;
	}
    }

    m_cp.setColours(m_colorList);
  }

  /** Sets up the UI's attributes lists 
   */  
  public void setupAttribLists() {
    String [] tempAttribNames = new String[m_data.numAttributes()];
    String type;

    m_classAttrib.removeAllItems();
    for(int i=0; i<tempAttribNames.length; i++) {
      switch (m_data.attribute(i).type()) {
      case Attribute.NOMINAL:
	type = " (Nom)";
	break;
      case Attribute.NUMERIC:
	type = " (Num)";
	break;
      case Attribute.STRING:
	type = " (Str)";
	break;
      default:
	type = " (???)";
      }
      tempAttribNames[i] = new String(Resource.srcStr("Colour")+": "+m_data.attribute(i).name()+" "+type);
      m_classAttrib.addItem(tempAttribNames[i]);
    }
    m_classAttrib.setSelectedIndex( tempAttribNames.length-1 );
    m_attribList.setListData(tempAttribNames);
    m_attribList.setSelectionInterval(0, tempAttribNames.length-1);
  }

  /** Calculates the percentage to resample 
   */
  public void setPercent() {
    if(m_data.numInstances() > 700) {
      String percnt = Double.toString(500D/m_data.numInstances()*100);
	  
      if( percnt.indexOf('.')+3 < percnt.length() ) {
	m_resamplePercent.setText(percnt.substring(0, percnt.indexOf('.')-1)+
				  percnt.substring(percnt.indexOf('.'), percnt.indexOf('.')+3) );
      }
      else
	m_resamplePercent.setText(percnt);
    }
    else
      m_resamplePercent.setText("100");
  }


  /** This method changes the Instances object of this class to a new one. It also does all the necessary
      initializations for displaying the panel. This must be called before trying to display the panel.
      @param newInst The new set of Instances
  */
  public void setInstances(Instances newInst) {

    m_data = newInst;
    setPercent();
    setupAttribLists();
    m_rseed.setText("1");
    origDist.setSelected(true);
    initInternalFields();
    m_cp.setInstances(m_data);
    m_cp.setCindex(m_classIndex);
    m_updateBt.doClick();
  }

  public void setDividerLocation(int location)
  {  	
  	jp.setDividerLocation(location);
  }

  /**
     Main method for testing this class
  */
  public static void main(String [] args)  {
    final JFrame jf = new JFrame("Weka Explorer: MatrixPanel");
    final JButton setBt = new JButton(Resource.srcStr("setBt"));
    Instances data = null;
    try {
      if(args.length==1)
	data = new Instances( new BufferedReader( new FileReader(args[0])) ); 
      else {
	System.out.println("Usage: MatrixPanel <arff file>"); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -