这次详细第看了看WEKA里神经网络的实现,涉及的代码挺多的,我把跟图形化相关的删除了,另外有些地方我自己也不是很清楚,不过大体上还是很清楚的了,这是一项比较老的技术了,没什么好介绍的了,来这里看的各位估计都是懂的。直接贴代码了。 public void buildClassifier(Instances i) throws Exception { // 验证数据类型是否为算法所支持的类型 getCapabilities().testWithFail(i); // 读入数据集中的数据 i = new Instances(i); // 删除不完整的数据 i.deleteWithMissingClass(); // 如果只有类属性,转化为特殊处理 if (i.numAttributes() == 1) { System.err.println( "Cannot build model (only class attribute present in data!), " + "using ZeroR model instead!"); m_ZeroR = new weka.classifiers.rules.ZeroR(); m_ZeroR.buildClassifier(i); return; } else { m_ZeroR = null; } // 初始化遍历数据集的次数 m_epoch = 0; /** Shows the error of the epoch that the network just finished. */ m_error = 0; // 初始化训练集 m_instances = null; // 初始化正在经过神经网络的实例 m_currentInstance = null; // 初始化控制面板 m_controlPanel = null; // 初始化显示神经元的面板 m_nodePanel = null; // 初始化输出单元 m_outputs = new NeuralEnd[0]; // 初始化输入单元 m_inputs = new NeuralEnd[0]; // 初始化属性个数 m_numAttributes = 0; // 初始化类的分类数 m_numClasses = 0; // 初始化节点的连接逻辑 m_neuralNodes = new NeuralConnection[0]; // 是否需要停止神经网络 m_stopIt = true; // 神经网络是否已经停止 m_stopped = true; // 设置训练集 m_instances = new Instances(i); // 用一个随机化种子产生的随机数 m_random = new Random(m_randomSeed); // 重新排列数据集 m_instances.randomize(m_random); // 如果需要把数据集中的名词属性转化成二元属性 if (m_useNomToBin) { // 创建一个名词转二元属性的过滤器 m_nominalToBinaryFilter = new NominalToBinary(); // 使用过滤器过滤所有实例 m_nominalToBinaryFilter.setInputFormat(m_instances); m_instances = Filter.useFilter(m_instances,m_nominalToBinaryFilter); } // 属性的个数是数据集的属性个数减1,因为不包括类属性 m_numAttributes = m_instances.numAttributes() - 1; // 类的分类数是数据集类的分类数 m_numClasses = m_instances.numClasses(); // 归一化类属性到区间[-1,1] setClassType(m_instances); //初始化测试集 Instances valSet