scala实现超限学习机(ELM)手写数字分类

来源:互联网 发布:c语言源代码大全 编辑:程序博客网 时间:2024/05/20 18:17

介绍:超限学习机(Extreme Learning Machine)又叫极限学习机是黄广斌等于2006年提出,属于单隐层前馈神经网络SLFN。其输入权值和隐层阈值随机初始化,通过最小二乘法计算得出输出权值,具有很好的分类和回归性能,与其它机器学习算法相比最大的优势是计算速度快,因为ELM不需要进行迭代。

现将实现ELM的scala代码贴出,亲测运行成功,由于内存限制,在本地最高只能运行到900个隐层结点。若有疑问,欢迎交流。

import org.apache.log4j.{Level, Logger}import org.apache.spark.{SparkConf, SparkContext}import breeze.linalg.{DenseMatrix=>BDM,_}//为避免与mllib自带的DenseMatrix混淆,将其赋一个别名import breeze.numerics._import org.apache.spark.rdd.RDDobject ELM {  def manOf[T: Manifest](t: T): Manifest[T] = manifest[T]//返回类型  def main(args: Array[String]) {    // 屏蔽不必要的日志显示终端上    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)    Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)    // 设置运行环境    val conf = new SparkConf().setAppName("ELM").setMaster("local")    //val conf = new SparkConf().setAppName("ELM").setMaster("spark://ec2-54-89-63-159.compute-1.amazonaws.com:7077")    val sc = new SparkContext(conf)    var data = sc.textFile("C:\\Users\\Administrator\\Desktop\\DeepLearnToolbox-master\\data\\stdtrainx.txt")    //var data = sc.textFile("hdfs://192.168.203.132:9000/stdtrainx.txt")    //var data = sc.textFile("file:///root/spark/file/stdtrainx.md")    println("训练数据x读取完毕")    //隐层结点数    val hiddenNumber = 100    var temp = readData(data)    var sampleNumber = temp.count().toInt//训练集样本数    val inputNumber = temp.first().length    var inputWeight = BDM.rand(inputNumber,hiddenNumber)    var inputBias = BDM.rand(1,hiddenNumber)    val s1 =(t:Double)=>t*2-1    val s2 = (line:Array[Double]) =>{      val t : BDM[Double] = BDM(line) * inputWeight+inputBias      val s = t.map(i=>1/(1+exp(-i)))      s.toArray    }    inputWeight = inputWeight.map(i=>i*2-1)//随机权值[-1,1]    inputBias = inputBias.map(i=>i*2-1)//随机阈值[-1,1]    var temp_x = temp.map(s2).collect()    var H = new BDM(hiddenNumber,sampleNumber,temp_x.flatten).t    data = sc.textFile("C:\\Users\\Administrator\\Desktop\\DeepLearnToolbox-master\\data\\stdtrainy.txt")    //data = sc.textFile("hdfs://192.168.203.132:9000/stdtrainy.txt")    //data = sc.textFile("file:///root/spark/file/stdtrainy.txt")    println("训练数据y读取完毕")    var f2 = readData(data).collect()    val train_y = array2mat(f2)    println("输出权值计算开始")    val outputWeight = inv(H.t*H)*H.t*train_y    println("输出权值计算完毕")    var actual_output = H * outputWeight    var errornum = calError(actual_output,train_y)    printf("训练误差:%.2f%%\n",errornum*1.0/sampleNumber*100)    data = sc.textFile("C:\\Users\\Administrator\\Desktop\\DeepLearnToolbox-master\\data\\stdtestx.txt")    //data = sc.textFile("hdfs://192.168.203.132:9000/stdtestx.txt")    //data = sc.textFile("file:///root/spark/file/stdtestx.txt")    temp = readData(data)    sampleNumber = temp.count().toInt//测试集样本数    temp_x = temp.map(s2).collect()    var T = new BDM(hiddenNumber,sampleNumber,temp_x.flatten).t    data = sc.textFile("C:\\Users\\Administrator\\Desktop\\DeepLearnToolbox-master\\data\\stdtesty.txt")    //data = sc.textFile("hdfs://192.168.203.132:9000/stdtesty.txt")    //data = sc.textFile("file:///root/spark/file/stdtesty.txt")    f2 = readData(data).collect()    val test_y = array2mat(f2)    actual_output = T * outputWeight    errornum = calError(actual_output,test_y)    printf("测试误差:%.2f%%\n",errornum*1.0/sampleNumber*100)    sc.stop()  }  def array2mat(array: Array[Array[Double]]) : BDM[Double] = {    val rows = array.length    val cols = array(0).length    var mat = new BDM[Double](cols,rows,array.flatten).t    return mat  }  def readData( data : RDD[String] ) : RDD[Array[Double]] = {    val s3 = (line:String) => line.split(',').map(_.toDouble)    return data.map{s3}  }  def calError( mat1 : BDM[Double],mat2 : BDM[Double]) : Int = {    var errornum = 0    for( i <- 0 until mat1.rows){      val x = argmax(mat1(i,::))      val y = argmax(mat2(i,::))      if(x!=y){        errornum += 1      }    }    return errornum  }}

刚开始写scala的时候,疯狂的用for循环,可能是被其他编程语言带动的缘故吧,还没有体会到scala的思想精髓,后来发现,大多数的for循环都能借助RDD完成,这就是函数式编程的特点之一。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子学习不开窍怎么办 孩子学习太笨怎么办 老师是个小人怎么办 孩子写字太差怎么办 孩子写字下手重怎么办 孩子一年级数学不好怎么办 孩子数学理解能力差怎么办 智商情商都低怎么办 一年级孩子数学很差怎么办 一年级孩子数学差怎么办 一年级数学学不好怎么办 孩子成绩差该怎么办 小学生数学太差怎么办 小学数学基础差怎么办 孩子一年级学习不好怎么办 快两岁的宝宝老尿裤怎么办 戒母乳宝宝哭闹怎么办 三周岁不肯说话怎么办 两岁宝宝打人怎么办 刚开始跳绳腿疼怎么办 两周岁宝宝拉肚子怎么办 宝宝睡觉认人怎么办 宝宝脸不光滑怎么办 两周岁宝宝打人怎么办 分手后想念前任怎么办 孩子不学习该怎么办 小孩吃了牙膏怎么办 小孩子吃了牙膏怎么办 一岁宝宝龋齿怎么办 宝宝吃牙膏了怎么办 刷牙吞了牙膏怎么办 宝宝刷牙吞牙膏怎么办 宝宝语言发育迟缓怎么办 两岁宝宝叛逆怎么办 宝宝不愿意学说话怎么办 一岁多宝宝嘴臭怎么办 三岁多了不说话怎么办 宝宝说话夹舌头怎么办 两岁不会说话怎么办 三周岁不会说话怎么办 两岁半宝宝说话结巴怎么办