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完成,这就是函数式编程的特点之一。
阅读全文
1 0
- scala实现超限学习机(ELM)手写数字分类
- 超限学习机(ELM)
- ELM(Extreme Learning Machine):超限学习机
- 机器学习算法(分类算法)—极限学习机(ELM)
- 极限学习机(ELM)算法的matlab与C++实现
- 极限学习机(ELM) 算法及MATLAB程序实现
- 极限学习机(ELM)算法的介绍与实现
- 极限学习机(ELM)算法的matlab与C++实现
- 极限学习机(ELM)的使用
- 极限学习机(ELM)的使用
- ELM极限学习机算法
- 极限学习机 Elm
- 极限学习机(ELM)
- ELM极限学习机源码
- 极限学习机(ELM)
- 极限学习机(ELM)的交叉验证方法
- Deep Learning 的挑战: Extreme Learning Machine(超限学习机)?
- 超限学习机--ELN 读书笔记一
- 大数据排重算法-布隆算法(BloomFilter)
- 微信小程序--后端管理平台业务4--Mybatis模糊查询相关
- 排序算法之归并排序
- 数据结构-数组
- 机器学习故事汇-决策树算法
- scala实现超限学习机(ELM)手写数字分类
- Android之点击返回键退出程序
- java正则表达式匹配
- 念念不忘的高薪,就用linux学习来回响
- mybatis中的#和$的区别? 面试经常问到!!
- 1003度度熊与邪恶大魔王(完全背包)
- 【笔记】注意力分配的一些模型
- Qt实现图片旋转
- 十进制转换二进制