easyAI是用来简易快速开发人工智能应用的JAVA引擎,也同时可以深度开发定制需求。本文档详细讲述本框架的所有即时更新版本内容, 详细列举部分主要内置API,内置参数,各种模式及应用,对于深度学习easyAI开发人员提供帮助。同时可以让企业低成本部署,快速应用落地,并降低人才门槛及费用。 点击可查看easyAi视频教程, easyAi-1.1.8Maven包下载地址
YoloConfig yoloConfig = new YoloConfig();//配置文件类;
配置文件类,这是一个用来保存学习过程中需要的各种参数,各种分类器参数及各种需要初始化的内部类。
private int windowWidth = 90;//检测框宽度
private int windowHeight = 140//检测框高度
private int typeNub = 10;//训练的类别种类数
private int enhance = 800//训练增强,训练样本数越少该值设置越大,训练样本数越多该值设置量越小,最小为1
private double iouTh = 0.05;//NMS合并框交并比阈值
private double containIouTh = 0.15;//判断是否包含样本交并比阈值
private double pth = 0.4;//可信概率阈值,超过该概率才认为检测区域内部有需要检测的内容
图片解析与图片训练
Picture picture = new Picture();//图片解析类,用于将图片解析为三通道像素矩阵
FastYolo yolo = new FastYolo(yoloConfig);//创建识别类
读取训练图片,进行图像训练
///////////////训练部分 YoloConfig yoloConfig = new YoloConfig();//创建配置参数类 //配置类内的配置参数,根据实际情况修改 private int windowWidth = 90;//检测窗口宽 private int windowHeight = 140;//检测窗口高 private int typeNub = 10;//需要识别的种类数 private int hiddenNerveNub = 16;//线性层隐层神经元数量 private double lineStudy = 0.01;//线性层学习率 private int kernelSize = 3;//卷积核尺寸 private boolean showLog = false;//是否打印学习过程中的log private double convStudy = 0.01;//卷积层学习率 private int enhance = 800;//训练样本过少时增强效果,如果有足够训练数据量,请将其设置为1 private double iouTh = 0.05;//NMS合并框交并比阈值 private double containIouTh = 0.15;//训练时是否包含样本判断交并比阈值 FastYolo yolo = new FastYolo(yoloConfig); //初始化图像识别类 List<YoloSample> data//目标标注类集合 YoloSample data;//标注类 //标注类属性 private String locationURL;//标注图片的本地url private List<YoloBody> yoloBodies;//该图片的内部标注 YoloBody yoloBody;//内部标注类 //内部标注类属性 private int x;//目标左上角x的值 private int y;//目标左上角得y的值 private int width;//目标的宽度 private int height;//目标的高度 private int typeID;//标注类别id //开始训练 yolo.toStudy(data);//训练耗时较长
学习完成提取模型,并将模型myModel序列化为JSON字符串形式保存
YoloModel yoloModel = yolo.getModel(); writeModel(JSON.toJSONString(yoloModel), "D:\\lesson/yoloModel.json");
服务启动初始化静态配置,并注入学习模型
FastYolo yolo = new FastYolo(yoloConfig); //初始化图像识别类 YoloModel yoloModel = readModelParameter();//从训练的模型中JSON反序列化读取模型 yolo.insertModel(yoloModel);//识别类注入模型
识别过程
FastYolo yolo
此识别类为系统启动时已经单例初始化的,要获取从单例初始化已经完成,并注入模型后的FastYolo类,识别过程请不要 "new" 这个类。
//////////////////////识别部分 long eventId;需要生成一个线程唯一id 保证识别时的线程安全,可直接用雪花算法id Picture picture = new Picture();//初始化图像解析类 ThreeChannelMatrix th = picture.getThreeMatrix("D:\\lesson/number.png");//将图像解析为矩阵 List<OutBox> list = yolo.look(th,eventId);//对该图像矩阵进行识别,并返回识别结果
识别结果
List<OutBox> list;//识别结果集合 ////识别结果类 OutBox outBox; private int x;//检测到物体在该图片中的横坐标 private int y;//检测到物体在该图片中的纵坐标 private int width;//检测到物体在该图片中的宽度 private int height;//检测到物体在该图片中的高度 private int typeID;//检测到物体在该图片中的类别id
图片摘要
第一个参数:threeChannelMatrix
图像三通道矩阵,通过Picture
类读取本地文件或输入流获取,
前文代码有注释说明。
第二个参数:boxSize
将一张图片横纵各分为几个区域提取特征,该值越大,生成的摘要id敏感度越高
第三个参数:regionSize
相似特征区域分区种类数量,该值越大,生成的摘要id敏感度越高
最终返回id
即为该图片摘要id,通过id逐位对比即可对比相似程度
FastPictureExcerpt fastPictureExcerpt = new FastPictureExcerpt(); String id = fastPictureExcerpt.creatImageName(threeChannelMatrix, 5, 10);
id敏感度越高,对图片变化越敏感,越适合越大的检索区域匹配,即特征越细致,但缺点id长度越长。
id敏感度越低,对图片变化越不敏感,越适合越小的检索区域匹配,特征越粗,优点是id长度越短。
对语言训练模板中的语句进行词向量嵌入训练
SentenceConfig sentenceConfig = new SentenceConfig();//语句训练配置类 WordEmbedding wordEmbedding = new WordEmbedding();//word2Vec训练及生成器 wordEmbedding.setConfig(sentenceConfig);//词向量装载配置参数类 SentenceModel sentenceModel = new SentenceModel();//装载训练样本类 for (Sentence sentence : sentences) {//读取模板语句 sentenceModel.setSentence(sentence.getWord()); } wordEmbedding.init(sentenceModel, wordVectorDimension);//wordVectorDimension 设置词向量维度 WordTwoVectorModel wordTwoVectorModel = wordEmbedding.start();//word2Vec词向量嵌入训练器开始训练 String model = JSON.toJSONString(wordTwoVectorModel);//训练完毕 保存模型
最好不要将标点符号带入训练语句,在训练量不足的时候可以展现更好的效果
包含数字的语句用统一的占位符代替 例如 35,3,36% 变为 #,#,#%
词嵌入训练之前,对模板语句进行随机乱序重新排列后再进行训练是有帮助的,可以打乱一些人工标注的规律性痕迹
wordTemple
初始化词嵌入生成器要进行单例化,在内存中长期持有。
语句模型训练
//语句训练类,参数分别是上文的语句配置类,和训练完毕或者注入模型后的词向量嵌入生成器。 RRNerveManager randomNerveManager =new RRNerveManager(getSentenceConfig(), getWordEmbedding(), true); Map<Integer, List<String>> model = new HashMap<>();//训练语句模板,主键是类别id,值是该类别id下所有模板语句 RandomModel mySentenceModel = randomNerveManager.studyType(model);//开始学习 String sentenceModel = JSON.toJSONString(mySentenceModel);//学习完成保存模型
RandomNerveManager
初始化语句模型要进行单例化,在内存中长期持有。
RandomNerveManager
的构造参数getWordEmbedding()
是依赖已经训练或注入模型完毕,已经单例化的词嵌入生成器
中文语句词嵌入及语义识别注入模型
SentenceConfig sentenceConfig = new SentenceConfig();//语句训练配置类 WordEmbedding wordEmbedding = new WordEmbedding();//word2Vec训练及生成器 wordEmbedding.insertModel(readWord2VecModel(),wordVectorDimension);//注入词嵌入模型,wordVectorDimension词向量维度与训练的词向量该参数保持一致 RRNerveManager randomNerveManager = new RRNerveManager(sentenceConfig, wordEmbedding,false);//中文语义分类器 randomNerveManager.insertModel(readSentenceModel());//注入中文语义分类模型
RandomNerveManager
注入语句模型后要进行单例化,在内存中长期持有。
WordEmbedding
注入词嵌入模型后要进行单例化,在内存中长期持有。
中文语句语义识别
String word ="识别语句"; RRNerveManager randomNerveManager = beanMangerOnly.getRRNerveManager();//单例化获取的注入过模型的中文语义识别器 Trust trust = randomNerveManager.getType(word, SnowflakeIdWorker.get().nextId());//获取结果 后者参数是一个用户线程,一个唯一id来保证线程安全 int type = trust.getKeys();//获取结果id type为类别id
返回结果是集合,若用户在配置类里设置返回结果数量为1,那么集合中只有最大可能的结果,若设置多语义数量结果返回,则返回的是有可能的多个语义。
中文语句语义配置参数说明
private SentenceModel sentenceModel;//语句训练模板 private int typeNub = 11;//语义分类种类数 private int wordVectorDimension = 21;//词向量嵌入维度 private int maxWordLength = 15;//最大识别单句长度 private double weStudyPoint = 0.01;//学习率 private double weLParam = 0.001;//正则系数 private int randomNumber = 11;//网络集群数量 private int nerveDeep = 6;//集群网络中每个rnn网络的深度 private boolean showLog = true;//是否打印学习过程 private int dateAug = 12000;//数据增广量 private int TopNumber = 1;//获取最有可能的语义结果数量
maxWordLength
增加单句长度,那么网络集群数量与集群网络中每个rnn网络的深度,数据增广量都要增加,需要更多的内存与更慢的计算速度(建议增加硬件配置),还有更多的训练样本,否则增加长度表现效果会直线下降。
纯切词模式
wordTemple.setSplitWord(true)
将模板设置成纯切词模式
wordTemple.setSplitWord(true); List<List<String>> lists = talk.getSplitWord("空调坏了,帮我修一修"); for (List<String> list : lists) { System.out.println(list); }
捕捉用户输入语句的关键词
CatchKeyWord catchKeyWord = new CatchKeyWord(); List<KeyWordForSentence> keyWordForSentenceList = new ArrayList<>(); for (Sentence sentence : sentences) { String word = sentence.getWord();//模板中的用户语句 String keyWord = sentence.getNoun();//该用户语句中的关键词 if (keyWord != null && keyWord.length() > 0) {//关键词必须存在 KeyWordForSentence keyWordForSentence = new KeyWordForSentence(); keyWordForSentence.setSentence(word);//输入语句 keyWordForSentence.setKeyWord(keyWord);//输入关键词 keyWordForSentenceList.add(keyWordForSentence); } } catchKeyWord.study(keyWordForSentenceList);//进行关键词训练 KeyWordModel keyWordModel = catchKeyWord.getModel();//训练完毕获取模型并将其序列化以JSON字符串形式保存
keyWord
必须完全包含于语句code
内才有效
catchKeyWord
需要在服务启动的时候进行单例化。
对获取关键词类进行服务启动初始化
CatchKeyWord catchKeyWord = new CatchKeyWord(); catchKeyWord.insertModel(keyWordModel);//注入训练时的模型(通过JSON反序列化)
对用户输入语句的关键词进行捕捉
List<String> keyWords=catchKeyWord.getKeyWord(sen);//返回关键词集合
catchKeyWord
从上文服务器初始化中单例的CatchKeyWord获取
理解用户输入的语句并根据语义直接回复用户
没有模型文件,选择初始化后进行样本学习,学习完成序列化实体类保存模型文件。
List<TalkBody> sentences = new ArrayList();//语句回复训练样本 CustomManager customManager = beanMangerOnly.getCustomManager();//语句生成管理器 customManager.init();//管理器初始化 CreatorModel creatorModel = customManager.study(sentences, 1);//进行训练并返回模型 String model = JSON.toJSONString(creatorModel);//序列化模型文件并保存该文件
训练样本实体
public class TalkBody {//语句回复训练样本 private String question;//问题 private String answer;//回答问题 }
有模型文件,则选择初始化后直接注入
CustomManager customManager = beanMangerOnly.getCustomManager();//语句生成管理器 customManager.init();//管理器初始化 customManager.insertModel(CreatorModel model);//若已有模型文件,则初始化管理器后,直接反序列化模型文件后注入管理器
完成初始化管理器,并注入模型后,用户输入语句进行回复
String word="广告可以退款么"//用户输入语句 long id=SnowflakeIdWorker.get().nextId();//用户线程唯一ID,用来负责线程安全,推荐雪花算法生成的id; String answer = customManager.getAnswer(word, id);//返回回复语句
对用户输入的语句进行延伸
List<String> sentenceList = new ArrayList<>();//模板中所有语句集合 static{ 将模板中所有语句集合注入到sentenceList当中 } SentenceCreator creator =new SentenceCreator();//词句延伸类 需要服务启动时单例化 WordTemple wordTemple = new WordTemple();//同上文模板类需要服务启动时单例化 creator.initFirst(sentenceList, wordTemple); creator.study();//进行训练 String myModel = JSONObject.toJSONString(creator.getModel());//训练完成将模型反序列化为JSON字符串保存
creator
词句延伸类,需要服务启动时单例化保存
对语句延伸类进行初始化
CreatorSentenceModel model = JSONObject.parseObject(readPaper(file), CreatorSentenceModel.class); creator.initModel(wordTemple, model);//注入语句延伸模型
CreatorSentenceModel
模型注入到creator
语句延伸类并单例化,
并将CreatorSentenceModel
单例保存
若用户语句拆词数量过少,则对用户语句进行延伸生成新的语句
List<String> words = talk.getSplitWord(sen).get(0);//对该词进行拆词 if (words.size() < 3) {//拆词数量小于3,则对语句进行补全 String fillName = beanMangerOnly.sentenceCreator().fill(sen, talk);//补全语句 type = talk.talk(fillName).get(0);//对补全后的语句进行识别 } else { type = talk.talk(sen).get(0);//对原句进行识别 }
//创建一个DNN神经网络管理器 包路径:org.wlld.nerveCenter /** * 初始化神经元参数,该参数设置都为线性层参数 * * @param sensoryNerveNub 输入神经元个数 * @param hiddenNerveNub 隐层神经元个数 * @param outNerveNub 输出神经元个数 * @param hiddenDepth 隐层深度 * @param activeFunction 激活函数 * @param studyPoint 线性分类器学习率 * @param rzType 正则函数 * @param lParam 正则系数 * @throws Exception 如果参数错误则抛异常 */ public NerveManager(int sensoryNerveNub, int hiddenNerveNub, int outNerveNub, int hiddenDepth, ActiveFunction activeFunction, double studyPoint, int rzType, double lParam) /** * 线性层初始化 * * @param initPower 是否是第一次注入 * @param isShowLog 是否打印学习参数 * @param isSoftMax 最后一层是否用softMax激活 */ public void init(boolean initPower, boolean isShowLog, boolean isSoftMax)//深度神经网络初始化 /** * 初始化卷积层神经网络 * * @param step 卷积步长 建议为2 * @param kernLen 卷积核大小 建议为3 * @param xSize 检测窗口行高 * @param ySize 检测窗口行宽 * @param convStudyPoint 卷积层学习率 * @param convFunction 卷积层激活函数 * @param isShowLog 是否打印学习参数 * @param isSoftMax 最后一层是否用softMax激活 */ public void initImageNet(int step, int kernLen, int xSize, int ySize, boolean isSoftMax, boolean isShowLog, double convStudyPoint, ActiveFunction convFunction) public void initRnn(boolean initPower, boolean isShowLog)//初始化神经网络为rnn网络 包路径 org.wlld.rnnNerveCenter public ModelParameter getModelParameter()//返回Rnn训练结果模型 public void insertModelParameter(ModelParameter modelParameter)//注入RNN训练结果模型 nerveManager.getSensoryNerves()获取感知神经元集合 //获取输入层神经元 public List<SensoryNerve> getSensoryNerves() /** * @param eventId 唯一的事件id * @param parameter 输入点的数据 * @param isStudy 是否是学习 (学习状态没有输出) * @param E 标注 * @param outBack 回调结果 * @throws Exception */ //神经网络输入层发送参数 SensoryNerve.postMessage(long eventId, double parameter, boolean isStudy, Map<Integer, Double> E, OutBack outBack) //每一次输出结果都会返回给回调类,通过回调类拿取输出结果,并通过eventId来对应事件 //卷积神经网络输入层发送参数 /** * @param eventId 唯一的事件id * @param parameter 特征矩阵 * @param isKernelStudy 是否是学习 (学习状态没有输出) * @param E 标注 * @param outBack 回调结果 * @throws Exception */ SensoryNerve.postMatrixMessage(long eventId, Matrix parameter, boolean isKernelStudy, Map<Integer, Double> E, OutBack outBack) public ModelParameter getDnnModel()//返回神经网络训练结果模型 public ModelParameter getConvModel()//返回卷积神经网络训练结果模型 public void insertDnnModel(ModelParameter modelParameter)//注入神经网络训练结果模型 public void insertConvModel(ModelParameter modelParameter)//注入卷积神经网络训练结果模型
OutBack
,通过OutBack实现类获取对应神经元返回参数。
/** * 初始化神经元参数 * * @param sensoryNerveNub 输入神经元个数 * @param hiddenNerveNub 隐层神经元个数 * @param outNerveNub 输出神经元个数 * @param hiddenDepth 隐层深度 * @param activeFunction 激活函数 * @param isDynamic 是否是动态神经元 * @param studyPoint 学习率 * @param rzType 正则函数 * @param lParam 正则系数 * @throws Exception 如果参数错误则抛异常 */ public NerveJumpManager(int sensoryNerveNub, int hiddenNerveNub, int outNerveNub , int hiddenDepth, ActiveFunction activeFunction, boolean isDynamic, double studyPoint, int rzType, double lParam); /** * 初始化残差Rnn神经元(跳层)参数 * @param initPower 是否是首次进行训练 * @param isShowLog 是否打印续写过程中的参数 * @param toSoftMax 是否增加softMax输出层 * @throws Exception 如果参数错误则抛异常 */ public void initRnn(boolean initPower, boolean isShowLog, boolean toSoftMax) throws Exception //获取输入层神经元 public List<SensoryNerve> getSensoryNerves() //输入层发送参数 /** * @param eventId 唯一的事件id(每个用户线程一个id用来处理线程安全) * @param parameter 该输入层的输入参数 * @param isStudy 是否是学习 (学习状态没有输出) * @param E 标注 * @param outBack 回调结果 * @param isEmbedding 是否获取word2Vec返回结果(单独为词向量嵌入兼容,若无需则传false) * @param rnnMatrix rnn参数全层数特征矩阵,矩阵中每一行是每一层的特征向量 * @param storeys 自定义跳层路径的数组,即在rnn中经过的隐层层数(隐层层数从1开始),若不在此路径集合内则跳跃 */ SensoryNerve.postMessage(long eventId, double parameter, boolean isStudy, Map<Integer, Double> E , OutBack outBack, boolean isEmbedding, Matrix rnnMatrix, int[] storeys) public ModelParameter getModelParameter();//返回跳层RNN训练结果模型 public void insertModelParameter(ModelParameter modelParameter);//注入跳层RNN训练结果模型
int[] storeys
来记录途径层数。
//创建一个内存中的数据表 DataTable dataTable = new DataTable(column); //构造参数是列名集合 public DataTable(Set<String> key) //指定主列名集合中该表的主键 dataTable.setKey("point"); //创建一片随机森林 RandomForest randomForest = new RandomForest(7); //构造参数为森林里的树木数量 public RandomForest(int treeNub); //唤醒随机森林里的树木 randomForest.init(dataTable); //将加入数据的实体类一条条插入森林中 randomForest.insert(Object object); //森林进行学习 randomForest.study(); //插入特征数据,森林对该数据的最终分类结果进行判断 int type = randomForest.forest(Object objcet);
public Knn(int nub);//构造参数,有几个人参与投票 public void insertMatrix(Matrix vector, int tag);//参数分别是特征向量和类别,注入进KNN当中 public int getType(Matrix vector);//输入特征向量,返回类别 public void removeType(int type);//移除一个分类
public LVQ(int typeNub, int lvqNub, double studyPoint);//类别数量,循环次数,学习率,注意lvq的递增类别id必须从0开始 public void insertMatrixBody(MatrixBody matrixBody);//注入特征向量 public void start();//执行学习
public MeanClustering(int speciesQuantity, int maxTimes);//聚多少个类,迭代次数上限 public void setFeature(double[] feature);//输入特征数组 public void start();//开始聚类 public List<RGBNorm> getMatrices();//聚类结束时,获取聚类实体 其中 RGBNorm.getRgb() 为该实体的聚类结果 public double[] getResultByNorm();//将聚类结果依照各特征范数的自然排序后,返回所有聚类特征集合
public GMClustering(int speciesQuantity, int maxTimes);//聚多少个类,迭代次数上限 public void insertParameter(Matrix matrix)//输入特征数组必须是行向量 public void start();//开始聚类 public double getProbabilityDensity(double[] feature);//获取该特征的概率密度
适应函数类需要实现适应函数接口,并实现生成返回值
public interface PsoFunction {//粒子群回调函数 //根据参数返回函数值 double getResult(double[] parameter,int id) throws Exception; }
构造例子群类
/** * 初始化 * * @param dimensionNub 维度 * @param minBorder 最小边界 * @param maxBorder 最大边界 * @param times 迭代次数 * @param particleNub 粒子数量 * @param psoFunction 适应函数 * @param inertialFactor 惯性因子 * @param selfStudyFactor 个体学习因子 * @param socialStudyFactor 社会学习因子 * @param isMax 最大值是否为最优 * @param maxSpeed 最大速度 * @param initSpeed 初始速度 * @throws Exception */ public PSO(int dimensionNub, int[] minBorder, int[] maxBorder, int times, int particleNub, PsoFunction psoFunction, double inertialFactor, double selfStudyFactor, double socialStudyFactor , boolean isMax, double maxSpeed, double initSpeed) public void start()//粒子群开始进行迭代 public double[] getAllBest()//迭代结束获取全局最优解
动态规划类:DynamicProgramming
,
动作函数要继承动作抽象类Action
,并重写以下方法
public abstract class Action {//动作 private int actionId;//动作id public int getActionId() {//返回该动作id return actionId; } public void setActionId(int actionId) {//设置该动作id this.actionId = actionId; } public int[] action(int[] stateId) {//stateId状态进行该动作后生成新的状态 return new int[0]; } public int[] actionTest(int[] stateId) {//stateId状态进行该动作后生成新的测试状态 return new int[0]; } protected int getProfit(int[] stateId) {//stateId的状态进行该动作后所获得的收益 return 0; } } Map<Integer, Action> actionMap = dynamicProgramming.getActionMap();//从dynamicProgramming获取内部动作集合 }
状态类:DynamicState
public class DynamicState { private int[] stateId;//状态id private boolean isFinish = false;//是否是终结态 public void setFinish(boolean finish) { isFinish = finish; } public DynamicState(int[] stateId) {//设置状态id this.stateId = stateId; } List<DynamicState> dynamicStateList = dynamicProgramming.getDynamicStateList();//从dynamicProgramming获取内部状态集合 }
启动开始动态规划的策略迭代,并生成价值函数,api调用如下:
dynamicProgramming.setMaxTimes(int maxTimes)//策略改进最大迭代次数 dynamicProgramming.setValueTh(double valueTh);//设置策略改进价值阈值 dynamicProgramming.setGaMa(double gaMa);//设置贴现因子 dynamicProgramming.gameStart();//开始策略迭代生成价值函数 dynamicProgramming.getValueFunction();//返回价值函数 dynamicProgramming.getBestAction(int[] stateId);//获取当前最优动作集合
矩阵类:Matrix
1,Matrix matrix = new Matrix(int x, int y);//初始化构造一个行为x,列为y的矩阵类 2,Matrix matrix= new Matrix(int x, int y, String matr);//初始化构造一个行为x,列为y,内部数据为 matr 的矩阵 3,int getX();//获取行数 4,int getY();//获取列数 5,void setState(int x, int y);//设置矩阵属性,根据x,y的数值大小,属性分别是0矩阵,行矩阵,列矩阵 6,double getAVG();//获取当前矩阵中所有数值的平均值 7,boolean isRowVector();//该矩阵是否是一个行矩阵 8,boolean isVector();该矩阵是否为一个向量 9,boolean isZero();该矩阵是否为一个0矩阵 10,void clear();//清除矩阵数据 11, double getDet();//求该矩阵的行列式 12,Matrix getSonOfMatrix(int x, int y, int xSize, int ySize);//求该矩阵的分块矩阵 13,Matrix getRow(int x);//求该矩阵指定一行的行向量 14,Matrix getColumn(int y);//求该矩阵指定一列的列向量 15,String getString();//返回字符串形式的该矩阵 16,String getPositionString();//返回带坐标的该矩阵字符串 17,void setNub(int x, int y, double number);//向该矩阵指定xy的位置输入一个数值 18,double getNumber(int x, int y);//向该矩阵指定xy的位置获取一个数值 19,double getSigmaByVector(boolean isRow, int index);计算矩阵中某一行或者某一列所有元素的和,isRow是否是行,index下标
2,Matrix matrix= new Matrix(int x, int y, String matr)
示例:
Matrix matrix = new Matrix(2, 2,
"[1,2]#[3,4]")
,构造一个行为2,列为2,第一行数据为[1,2],第二行数据为[3,4]的矩阵。
矩阵运算类:MatrixOperation
static Matrix add(Matrix matrix1, Matrix matrix2);//矩阵相加 static Matrix sub(Matrix matrix1, Matrix matrix2);//矩阵相减 static Matrix getLinearRegression(Matrix parameter, Matrix out);//多元线性回归 static double getEDistByMatrix(Matrix matrix1, Matrix matrix2);//矩阵相似度(欧氏距离) static double getEDist(Matrix matrix1, Matrix matrix2);//两个向量之间欧式距离的平方 static Matrix pushVector(Matrix myMatrix, Matrix matrix, boolean addRow);//向一个矩阵里合并一个行向量或者列向量到矩阵行或者列的末尾 static Matrix push(Matrix matrix, double nub, boolean isRow);//向一个向量里PUSH一个值 static Matrix matrixToVector(Matrix matrix, boolean isRow);//将一个矩阵转成行向量 static double innerProduct(Matrix matrix1, Matrix matrix2);//求两个向量的内积 static double getNorm(Matrix matrix);//求向量范数 static double getNormCos(Matrix matrix1, Matrix matrix2);//求两个向量之间的余弦 static Matrix transPosition(Matrix matrix);//矩阵转置 static int inverseNumber(double[] myInverse);//逆序数奇偶性判定 static Matrix getInverseMatrixs(Matrix matrix);//矩阵求逆 static Matrix adjointMatrix(Matrix matrix);//求伴随矩阵 static double algebraicCofactor(Matrix matrix, int row, int column);//求矩阵代数余子式 static Matrix mulMatrix(Matrix matrix1, Matrix matrix2);//矩阵相乘 static void mathMul(Matrix matrix, double nub);//矩阵数乘 static void mathSub(Matrix matrix, double nub);//矩阵数减 static void mathDiv(Matrix matrix, double nub);//矩阵数除 static List<Double> matrixToList(Matrix matrix);//矩阵转list集合 static Matrix listToRowVector(List<Double> list);//list集合转行向量 static Matrix im2col(Matrix matrix, int kernLen, int step);//卷积im2col static Matrix reverseIm2col(Matrix matrix, int kernLen, int step, int xSize, int ySize);//逆向im2col //对两个相乘的矩阵中的一个求偏导,errorMatrix 为loss矩阵,isFirstPd=true 对相乘的前矩阵first求偏导,反之依然。 static Matrix matrixMulPd(Matrix errorMatrix, Matrix first, Matrix second, boolean isFirstPd);
所有的矩阵运算,返回矩阵都是一个新的实例化矩阵,对参与运算的所有原矩阵原数值不产生任何影响
图像解析类:Picture
Picture picture = new Picture();//实例化一个图像解析类 ThreeChannelMatrix getThreeMatrix(String fileURL);//根据本地图片url返回一个RGB三通道矩阵类 ThreeChannelMatrix getThreeMatrix(InputStream file);//根据一个输入流返回一个RGB三通道矩阵类
ThreeChannelMatrix
,所有像素值都为归一化后的0-1之间的值!
RGB三通道矩阵:ThreeChannelMatrix
Matrix getMatrixR();//返回R矩阵 Matrix getMatrixG();//返回G矩阵 Matrix getMatrixB();//返回B矩阵 Matrix getH();//返回灰度矩阵