前几天看了一篇博客 介绍简单svm的java实现,抱歉原文地址没找到。。其中代码没有注释,我加上了注释 以防日后遗忘

其中主要是了解

//HingeLoss损失函数  cost = HingeLoss^2 + lambda*||w||^2   cost = err'*err + lambda*w'*w; grad = 2*X(idx,:)'*err + 2*lambda*w;

其中训练集和测试集的数据格式如下

1 1:-0.889023 2:0.555556 3:-0.111111 4:-0.111111 5:-0.111111 6:-0.777778 7:1 8:-0.333333 9:-0.555556 10:-1

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.StringTokenizer;public class SimpleSvm
{private int exampleNum;//X数组行数private int exampleDim;//X数组列数private double[] w;//权值private double lambda;//损失函数的参数private double lr = 0.001;//0.00001 学习率private double threshold = 0.001; //迭代停止 权值变换小于thresholdprivate double cost;//HingeLoss损失函数  cost = HingeLoss^2 + lambda*||w||^2   cost = err'*err + lambda*w'*w; grad = 2*X(idx,:)'*err + 2*lambda*w;private double[] grad;//存放需要更新的权值wprivate double[] yp;//存放每一行x和权值w的点积 yp【0】表示第一行x和w的点积public SimpleSvm(double paramLambda){lambda = paramLambda;}private void CostAndGrad(double[][] X,double[] y){cost =0;for(int m=0;m<exampleNum;m++)//从第一行开始进行循环{yp[m]=0;for(int d=0;d<exampleDim;d++){yp[m]+=X[m][d]*w[d];//第一行x和权值w的点积}if(y[m]*yp[m]-1<0){cost += (1-y[m]*yp[m]);//将y label(-1 or 1)和点积相乘 和1的差 相加}}for(int d=0;d<exampleDim;d++){cost += 0.5*lambda*w[d]*w[d];}for(int d=0;d<exampleDim;d++){grad[d] = Math.abs(lambda*w[d]);for(int m=0;m<exampleNum;m++){if(y[m]*yp[m]-1<0){grad[d]-= y[m]*X[m][d];}}}}private void update(){for(int d=0;d<exampleDim;d++){w[d] -= lr*grad[d];}}public void Train(double[][] X,double[] y,int maxIters){exampleNum = X.length;if(exampleNum <=0){System.out.println("num of example <=0!");return;}exampleDim = X[0].length;w = new double[exampleDim];grad = new double[exampleDim];yp = new double[exampleNum];for(int iter=0;iter<maxIters;iter++){CostAndGrad(X,y);System.out.println("cost:"+cost);if(cost< threshold){break;}update();}}private int predict(double[] x){double pre=0;for(int j=0;j<x.length;j++){pre+=x[j]*w[j];}if(pre >=0)//这个阈值一般位于-1到1return 1;else return -1;}public void Test(double[][] testX,double[] testY){int error=0;for(int i=0;i<testX.length;i++){if(predict(testX[i]) != testY[i]){error++;}}System.out.println("total:"+testX.length);System.out.println("error:"+error);System.out.println("error rate:"+((double)error/testX.length));System.out.println("acc rate:"+((double)(testX.length-error)/testX.length));}public static void loadData(double[][]X,double[] y,String trainFile) throws IOException{File file = new File(trainFile);RandomAccessFile raf = new RandomAccessFile(file,"r");StringTokenizer tokenizer,tokenizer2;int index=0;while(true){String line = raf.readLine();if(line == null) break;tokenizer = new StringTokenizer(line," ");y[index] = Double.parseDouble(tokenizer.nextToken());//System.out.println(y[index]);while(tokenizer.hasMoreTokens()){tokenizer2 = new StringTokenizer(tokenizer.nextToken(),":");int k = Integer.parseInt(tokenizer2.nextToken());double v = Double.parseDouble(tokenizer2.nextToken());X[index][k] = v;//System.out.println(k);//System.out.println(v);}X[index][0] =1;index++;}}public static void main(String[] args) throws IOException{// TODO Auto-generated method stubdouble[] y = new double[400];double[][] X = new double[400][11];String trainFile = "D:\\train_bc";loadData(X,y,trainFile);SimpleSvm svm = new SimpleSvm(0.0001);svm.Train(X,y,7000);double[] test_y = new double[283];double[][] test_X = new double[283][11];String testFile = "D:\\test_bc";loadData(test_X,test_y,testFile);svm.Test(test_X, test_y);}}

java实现svm svm的java实现相关推荐

  1. svm算法java实现_谁有用JAVA实现机器学习svm算法的代码,感激不尽

    展开全部 OpenCV开发SVM算法是基于LibSVM软件包开发的,LibSVM是台湾大学林智仁(Lin Chih-Jen)等开发设计的一个简单.易于使用和快62616964757a686964616 ...

  2. java代码自动抠图_Opencv java实现人脸抠图和行为识别

    基于java的OpenCV环境搭建(Windows平台上ecplise) https://blog..net/qq_32447301/article/details/78494913 https:// ...

  3. Java面试题库,Java下载安装教程环境变量

    02 JVM 线程 JVM内存区域 JVM运行时内存 垃圾回收与算法 JAVA四种引用类型 GC分代收集算法 VS 分区收集算法 GC垃圾收集器 JAVA IO/NIO JVM类加载器 03 JAVA ...

  4. 广东java工资一般多少_广东java工资待遇,广东java工资一般多少,广东java工资底薪最低多少...

    广东java工资待遇,广东java工资一般多少,广东java工资底薪最低多少 首页 > java > 广东java工资待遇 作者:镀金池   发布时间:2018-12-22 11:20 在 ...

  5. inside java security_Inside The JVM Part2: java如何实现安全性

    网络移动性和平台无关性略过...看看java如何实现安全性 Java通过提供一个"安全沙箱"来保证从网络或者其他不信任的地方下载并运行的程序不会破坏本地数据,为了确保沙箱是可靠的, ...

  6. java ee 6 sdk中文版,Java EE 6 SDK+Eclipse JEE+Android ADT-Fun言

    很多时候,为了生存,需要不断的了解,学习新东西,于是头脑塞满了便便- -|||- -----------------------.. 按照自己的理解: JDK = Java Develope Kit ...

  7. java 生成pdf itext_使用Java组件itext 生成pdf介绍

    iText是一个能够快速产生PDF文件的Java类库.iText的java类对于那些要产生包含文本,表格,图形的只读文档是很有用的.它的类库尤其与java Servlet有很好的给合.使用iText与 ...

  8. java初始化数据报_初始化java原因

    虚拟机的类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类 即虚拟机的类加载机制. 在Java中,类型的加载.链接 ...

  9. java中的action_浅析java中action的作用

    正如早先指出的那样,action()并不是我们对所有事进行分类后自动为handleEvent()调用的唯一方法.有三个其它的被调用的方法集,如果我们想捕捉某些类型的事件(键盘.鼠标和焦点事件),因此我 ...

  10. java写exe程序实例,java实现可安装的exe程序实例详解

    java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...

最新文章

  1. TDD 与 CI 在 Python 中的实践
  2. 九度OJ 1089:数字反转 (数字反转)
  3. Qt Linguist基于文本ID的翻译
  4. MVC模式 在Java Web应用程序中的实现
  5. leetcode 563. 二叉树的坡度(Java版)
  6. Firefox 10正式发布
  7. 如何在画面中摆放大量图片
  8. 光端机的作用是什么? 简述光端机的作用
  9. 那些文献阅读能力爆表的科研学子,都在偷偷做这件事……
  10. h5海报设计开源工具_5个用于教幼儿阅读的开源工具
  11. 利用BitLocker和VHD实现共享文件加密
  12. PyTorch 入坑十一: 损失函数、正则化----深刻剖析softmax+CrossEntropyLoss
  13. gridview无法显示完整
  14. matlab寻找直线_matlab寻找直线_Matlab 霍夫变换 ( Hough Transform) 直线检测
  15. 反爬虫策略的应对方法汇总
  16. 5款好看的WordPress博客主题下载
  17. Fibonacci数列(斐波那契数列)
  18. 第十一次作业 - Alpha 事后诸葛亮(团队)
  19. 【Golang】Go语言Windows GUI库XCGUI,DirectUI设计思想,高度自定义界面,支持Direct2D硬件加速
  20. 【数据结构-树】哈夫曼树及其应用

热门文章

  1. 小布老师讲座笔记(一)
  2. 关于微信公众号页面获取code进行微信授权登录
  3. Twitter推特爬虫工具开发
  4. July 13th 五月天
  5. canal mq数据同步
  6. STM32 Cube MX学习笔记——TOF 高速单线激光雷达 L10(usart)
  7. 基于Python的统计建模
  8. Bluehost注册流程与问题
  9. OTA制作及升级过程
  10. Kubernetes调度