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中文版第二版>的读书笔记,这里会记录一些个人感觉稍微有些重要的内容,方便以后查阅,可能会因为个人实力原因导致理解有误,若有发现欢迎指出.一些个 ...
随机推荐
- C语言写解一元二次方程程序心得
前言:在网上看到不少解一元二次方程的小程序,在使用时总得出一大堆小数,感觉很不爽,遂自己重新写了一遍. 首先,先回忆一下一元二次方程的求根公式: 分别读取二次项.一次项和常数项系数并且求出delta ...
- 蓝牙音箱bose soundlink mini2链接mac后itunes自动启动的问题解决
1.在应用程序列表中复制一个应用重命名为DoNothingApp.app(非系统应用才可以成功复制) 2.打开terminal执行该命令(执行后需要输入密码),注意mv和iTunes.app后分别有一 ...
- http://www.cnblogs.com/xdp-gacl/p/4040019.html
http://www.cnblogs.com/xdp-gacl/p/4040019.html
- Lua table pair和ipair区别
官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the constru ...
- usaco3.33Camelot(BFS)
恶心的题啊 .. 先枚举哪个点是所有人集合的点 再枚举所有骑士遇见国王的点 如果全部枚举出来会大大的TLE 经大牛验证 只需要枚举国王周围的点就可以了+-2 之内 然后各种繁琐 各种错误 骑士有可能不 ...
- 解决MySQL服务启动时报1067错误
工具/原料 MySQL_5.6.24_win32 方法/步骤 当我们安装完Mysql时,如果在服务当中(可以在“运行”-->"service.msc"打开并查看)无法看到My ...
- Devexpress 汉化 代码 zt
将一下代码放到需要汉化的窗体Load事件中 解压汉化初丁文件 /// <summary> /// 汉化DX控件 /// </summary> private void Chin ...
- 作品第二课----点击DIV显示其内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Tomcat启动失败闪退
最近把电脑系统从win8升到了8.1(之前源于各种原因都没升外带升级失败),用都用了1个月了,突然发现tomcat启动不了,提示找不到什么什么- -,因为平时基本都是从开发工具里运行的服务器,都没有问 ...
- [ZETCODE]wxWidgets教程四:菜单栏和工具栏
本教程原文链接:http://zetcode.com/gui/wxwidgets/menustoolbars/ 翻译:瓶哥 日期:2013年11月28日星期四 邮箱:414236069@qq.com ...