Java实现简单版SVM
package com.linger.svm; 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;
private int exampleDim;
private double[] w;
private double lambda;
private double lr = 0.001;//0.00001
private double threshold = 0.001;
private double cost;
private double[] grad;
private double[] yp;
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];
} if(y[m]*yp[m]-1<0)
{
cost += (1-y[m]*yp[m]);
} } 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到1
return 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 stub
double[] y = new double[400];
double[][] X = new double[400][11];
String trainFile = "E:\\project\\workspace\\Algorithms\\bin\\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 = "E:\\project\\workspace\\Algorithms\\bin\\test_bc";
loadData(test_X,test_y,testFile);
svm.Test(test_X, test_y); } }
Java实现简单版SVM的更多相关文章
- 红警大战JAVA简单版
代码结构: 相关源码: 武器类: 属性:武器,攻击力,子弹数量. 方法:给属性赋值(set属性()方法) 获取属性值(get属性()方法) package 红警大战简单版; public class ...
- PAT(B) 1089 狼人杀-简单版(Java)逻辑推理
题目链接:1089 狼人杀-简单版 (20 point(s)) 题目描述 以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局" ...
- 《仙剑奇侠传柔情版》Java的简单实现(二)
基于<仙剑奇侠传柔情版>Java的简单实现(二) 2018-12-02 by Kris 需要上次的GameFrame.class中窗口框架承载:https://www.cnblogs.co ...
- 基于《仙剑奇侠传柔情版》利用Java的简单实现(一)
基于<仙剑奇侠传柔情版>利用Java的简单实现(一) 2018-12-01 23:55:36 by Louis 一,新建一个类GameFrame.class,具体代码如下: pack ...
- JavaMail简单版实验测试
前言: 最近由于实现web商城的自动发送邮件功能的需求,故涉猎的邮箱协议的内部原理.现将简单版的Java Mail实例做个代码展示,并附上其中可能出现的bug贴出,方便感兴趣的读者进行测试! 1.载入 ...
- 工厂方法模式(Java与Kotlin版)
前文推送 设计模式 简单工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次 ...
- 抽象工厂模式(Java与Kotlin版)
前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操 ...
- 建造者模式(Java与Kotlin版)
前文推送 设计模式 简单工厂模式(Java与Kotlin版) 工厂方法模式(Java与Kotlin版) 抽象工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比J ...
- 《Effective Java中文版第二版》读书笔记
说明 这里是阅读<Effective Java中文版第二版>的读书笔记,这里会记录一些个人感觉稍微有些重要的内容,方便以后查阅,可能会因为个人实力原因导致理解有误,若有发现欢迎指出.一些个 ...
随机推荐
- Mac下获取AppStore安装包文件路径
通过远在大洋彼岸的苹果服务器下载东西,确实有够慢啊!AppStore更甚:甚至都经常提示连不上服务器,而有些软件呢,还必须从AppStore下载安装,所以没办法,谁让上了苹果的贼船呢!公司的网速更是不 ...
- JAVA与编译语言及解释语言的关系
转自JAVA结合了编译和解释执行的优点 编译型语言是一次性编译成机器码,脱离开发环境独立运行,所以运行效率较高,但是由于编译成的是特定平台上机器码,所以可移植性差. 编译型语言的典型代表有C.C++. ...
- ECMall关于数据查询缓存的问题
刚接触Ecmall的二次开发不久,接到一个任务.很常见的任务,主要是对数据库进行一些操作,其中查询的方法我写成这样: 01 function get_order_data($goods_id) 02 ...
- asp.net 登陆后在ashx处理程序中获取不到Session
登录后存储Session,另一个页面Ajax请求 ashx页面,发现无法获取到Session,Session is NULL 使用“IReadOnlySessionState”这个接口就可以
- 李洪强iOS开发Swift篇—06_流程控制
李洪强iOS开发Swift篇—06_流程控制 一.swift中的流程控制 Swift支持的流程结构如下: 循环结构:for.for-in.while.do-while 选择结构:if.switch 注 ...
- 【Xamarin挖墙脚系列:Android最重要的命令工具ADB】
原文:[Xamarin挖墙脚系列:Android最重要的命令工具ADB] adb工具提供了很好的基于命令的对系统的控制. 以前说过,安卓的本质是运行在Linux上的虚机系统.在Linux中,对系统进行 ...
- eclipse或IDEA连接魅蓝
1.首先 安装ADB 驱动 http://developer.android.com/tools/device.html 如果没装就自行去下载安装 别的品牌都可以顺利连接,魅族手机特有的原因导至在开发 ...
- B*tree dump
Oracle的索引是以平衡树的方式组织存储的:保存的是索引列的值,以及该行的rowid的一部分(文件号,块号,行号) 下面我们通过例子来了解一下: 1,create table test(id int ...
- matlab使用reshape时按照列优先原则取元素和摆放元素
参考 http://blog.csdn.net/superdont/article/details/3992033 a=[1 2 3 4] 如果使用b=reshape(a,1,4),则得到的结果是 ...
- ♫【网站优化】Reflow / Repaint
web移动开发最佳实践之js篇 浏览器的回流与重绘 by 张盛志 DOM性能瓶颈与Javascript性能优化 浏览器的渲染原理简介 其中一个跟浏览器有关的原因,那就是浏览器需要花时间.花精力去渲染. ...