中文文本分类-朴素贝叶斯

2023-11-05

原创作品,出自 “晓风残月xj” 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj)。

由于各种原因,可能存在诸多不足,欢迎斧正!

  最近在想怎么利用数据挖掘的方法进行评论自动审核,分类为垃圾评论和非垃圾评论,完成自动审核功能。实现中文文本分类,支持文件、文本分类,基于多项式分布的朴素贝叶斯分类器。由于工作实际应用是二分类,加之考虑到每个分类属性都建立map存储词语向量可能引起的内存问题,所以目前只支持二分类。当然,直接复用这个结构扩展到多分类也是很容易。之所以自己写,主要原因是没有仔细研读mahout、weka等代码,不能灵活地进行中文分词、停用词过滤、词频统计、TF-IDF等,也就是向量化和特征提取没有自己手写相对灵活。

一、贝叶斯分类器

  贝叶斯分类器是基于先验概率与条件概率进行概率计算的分类器。X是特征属性,Y是分类属性,P(Y|{x0,x1....xn})是X在取值{x0,x1,...xn}的条件下Y发生的概率,成为P(Y)的后验概率,P(Y)的先验概率。实际在计算P(Y|{x0,x1....xn})的时候由于维度太高,至少需要考虑特征属性与分类属性的所有搭配情况,计算量大而且无法对待分类数据集进行全面覆盖。

1.1朴素贝叶斯

  朴素贝叶斯就是假设特征属性的取值彼此独立,即没有相互作用关系。如果P(AB|C)=P(A|C)P(B|C),则A和B在C条件独立。贝叶斯定理也是贝叶斯基于先验概率计算条件概率的重要理论基础,如下是贝叶斯定理:

       

待分类的特征属性      


类别属性 


1)、在有分类属性的数据集上,计算:


2)、在给定特征属性数据上,有贝叶斯定理:


3)、已知P(x)是常数,加之特征属性间条件独立,只需求
 


二、中文文本分类

  中文分本分类通用方法是将文本按照一定规则编码成向量形式:特征属性和分类属性。具体的是利用一定的分词规则将文本切成一个个单词,然后去除停用词,如“了”、“的”等 没有实际语义含义的词汇,接着可以从剩余的词中选出尽可能标识分类属性的词汇降低维度,选取出来的词语组成特征属性。可以假设不同词汇的出现是相对独立的,于是就转换成了标准的朴素贝叶斯分类模型。

2.1.分词

 下面是知乎上一段关于中文分词理论上说明,觉得通俗有用,在此摘抄,标识感谢。原贴中文分词算法大概分为两大类

 1)、第一类是基于字符串匹配,即扫描字符串,如果发现字符串的子串和词相同,就算匹配。

这类分词通常会加入一些启发式规则,比如“正向/反向最大匹配”, “长词优先” 等策略。这类算法优点是速度块,都是O(n)时间复杂度,实现简单,效果尚可。也有缺点,就是对歧义和未登录词处理不好。歧义的例子很简单"长春市/长春/药店" "长春/市长/春药/店".未登录词即词典中没有出现的词,当然也就处理不好。ikanalyzer,paoding 等就是基于字符串匹配的分词。

   2)、第二类是基于统计以及机器学习的分词方式
这类分词基于人工标注的词性和统计特征,对中文进行建模,即根据观测到的数据(标注好的语料)对模型参数进行估计,即训练。 在分词阶段再通过模型计算各种分词出现的概率,将概率最大的分词结果作为最终结果。常见的序列标注模型有HMM和CRF。这类分词算法能很好处理歧义和未登录词问题,效果比前一类效果好,但是需要大量的人工标注数据,以及较慢的分词速度。ICTCLAS是基于HMM的分词库。

  

2.2.去停用词

  英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,字连起来组成词语。为了降低时空复杂度,提高存储和计算效率,会自动忽略某些词,即为停用词。停用词包括过滤词,如特定时期的黄色、政治等敏感关键词。停用词主要有两类:
   1)、过于频繁的词语,包括"然而"、"下面"等等。
   2)、文本中出现频率很高,但没有语义含义的词,包括副词、介词、连词等等。

   关于停用词,可以结合具体的数据集进行设定,如电商的禁用词等等。很多通用的停用词集合,这个个人认为还不错,可用停用词集合


2.3.特征提取

  文本分词并出去停用词之后,剩下的都可以看作是有效的词语,可以初步作为提取出来的特征属性。但是,需要进行一下处理,可以给不同的词语设置不同的权重,比较通用的方法是TF-IDF算法。

  TF-IDF是采用统计思想,用以评估词语相对文件集中某个文件的重要程度。字词的重要性与它在文件中出现的次数成正比增加,但同时会与着它在语料库中出现的频率成反比下降,如下面的公式。

  

 本次实验由于使用朴素贝叶斯分类,所以在计算条件概率的时候使用了类似TF-IDF的思想,所以赋予权重的时候并未直接采用该方法。而是人为设定固定的权重矩阵,毕竟是某个实际垂直场景的应用,我们知道那些词汇相对重要。


2.4.建立模型

    依据上面的公式,朴素贝叶斯需要知道先验概率和单个属性取值对应的条件概率,然后计算后验概率,下面是本次使用的概率计算方法。当时,这样计算的概率在文本比较稀疏的时候概率偏小,可能存在很多误差,实际展示的时候需要做归一化处理。

 1)、先验概率P(y)= 类y下单词总数/整个训练样本的单词总数
 2)、类条件概率P(xi|y)=(类y下单词xi在各个文档中出现过的次数之和+1)/(类y下单词总数+向量的维度)
 3)、P(y|xi)=P(y)*P(xi|y)/P(xi)等价于P(y)*P(xi|y)

 其中为了防止某个词语xi没有出现,导致该类的条件概率P(xi|y)为0,需要一些平滑技术,本次选择Add-one (Laplace) 平滑技术,即P(xi|y)=(类y下单词xi在各个文档中出现过的次数之和+1)/(类y下单词总数+向量的维度),保证分子不为0。关于平滑技术,也有很多地方可以考虑;当时,上面P(xi|y)的求取也借用了TF-IDF的思想。


三、代码

package com.csdn.jinxu.ChineseTextClassifier;

import com.google.common.base.Splitter;
import com.google.common.collect.Maps;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.ToAnalysis;
import org.ansj.util.FilterModifWord;
import org.apache.commons.lang.StringUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 实现描述:ansj中文分词
 *
 * @author jin.xu
 * @version v1.0.0
 * @see
 * @since 16-9-12 下午7:17
 */
public class AnsjSpliter {

    /**
     * 分词 
     * @param file 文档文件或者目录
     * @return
     * @throws IOException
     */
    public static Map<String,Integer> process(File file) throws IOException {
        Map<String, Integer> wordScoreMap = Maps.newHashMap();
        if(file.isDirectory()) {
            for(File tmp:file.listFiles()){
                Map<String,Integer> tmpWordScoreMap=process(tmp);
                for (Iterator iterator = tmpWordScoreMap.entrySet().iterator(); iterator.hasNext(); ) {
                    Map.Entry entry = (Map.Entry) iterator.next();
                    String key=(String)entry.getKey();
                    Integer value=(Integer)entry.getValue();
                    if (wordScoreMap.containsKey(key)) {
                        wordScoreMap.put(key,wordScoreMap.get(key) +value);
                    } else {
                        wordScoreMap.put(key,value);
                    }
                }
            }
        }
        else{
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            while ((tempString = reader.readLine()) != null) {
                wordScoreMap=process(tempString,wordScoreMap);
            }
            reader.close();
        }
        return  wordScoreMap;
    }

    /**
     * 分词 
     * @param inputText 文档文本
     * @return
     * @throws IOException
     */
    public static Map<String,Integer> process(String inputText) throws IOException {
        Map<String, Integer> wordScoreMap = Maps.newHashMap();
        process(inputText,wordScoreMap);
        return  wordScoreMap;
    }

    /**
     * 过滤停用词
     * @param file 停用词文件
     * @return
     * @throws IOException
     */
    public static HashMap<String,String> filter(File file) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader(file));
        HashMap<String,String>stopWordMap= Maps.newHashMap();
        String tempString = null;
        while ((tempString = reader.readLine()) != null) {
            stopWordMap.put(tempString.trim() , "_stop");
        }
        reader.close();
        return  stopWordMap;
    }

    /**
     * 过滤停用词
     * @param inputText 停用词文本,以逗号','隔开
     * @return
     * @throws IOException
     */
    public static HashMap<String,String> filter(String inputText) throws IOException {
        HashMap<String,String>stopWordMap= Maps.newHashMap();
        List<String> wordList= Splitter.on(',').splitToList(inputText);
        if(wordList.size()>0) {
            for (String word : wordList) {
                stopWordMap.put(word, "_stop");
            }
        }
        return  stopWordMap;
    }

    /**
     * 分词 
     * @param inputText 文档文本
     * @param wordScoreMap 单词-频数映射
     * @return
     * @throws IOException
     */
    private static Map<String,Integer> process(String inputText,Map<String,Integer>wordScoreMap) throws IOException {
        for (Term term : FilterModifWord.modifResult(ToAnalysis.parse(inputText))) {
            if(StringUtils.isNotBlank(term.getName().trim())) {
                if (wordScoreMap.containsKey(term.getName())) {
                    wordScoreMap.put(term.getName(), wordScoreMap.get(term.getName()) + 1);
                } else {
                    wordScoreMap.put(term.getName(), 1);
                }
            }
        }
        return  wordScoreMap;
    }
}


package com.csdn.jinxu.ChineseTextClassifier;

import java.util.Iterator;
import java.util.Map;


/**
 * 实现描述:朴素贝叶斯分类
 *
 * @author jin.xu
 * @version v1.0.0
 *          1.先验概率P(y)= 类y下单词总数/整个训练样本的单词总数
 *          2.类条件概率P(xi|y)=(类y下单词xi在各个文档中出现过的次数之和+1)/(类y下单词总数+向量的维度)
 *          3.P(y|xi)=P(y)*P(xi|y)/P(xi)等价于P(y)*P(xi|y)
 * @see
 * @since 16-9-13 下午5:44
 */
public class NBClassifier {
    private Map<String, Double> wordWeightMap;

    private Map<String, Integer> yesDocMap;
    private Map<String, Integer> noDocMap;

    private double yesPrioriProb;
    private double noPrioriProb;

    private Long wordDifCount;

    private Long yesClassWordCount;
    private Long noClassWordCount;

    public NBClassifier(Map<String, Integer> yesDocMap, Map<String, Integer> noDocMap, Map<String, Double> wordWeightMap) {
        this.wordWeightMap = wordWeightMap;

        this.wordDifCount = (long) this.wordWeightMap.size();//?????????????????

        this.yesDocMap = yesDocMap;
        this.noDocMap = noDocMap;

        yesPrioriProb = 1.0 * yesDocMap.size() / (yesDocMap.size() + noDocMap.size());
        noPrioriProb = 1.0 * noDocMap.size() / (yesDocMap.size() + noDocMap.size());

        this.yesClassWordCount = getWordCount(yesDocMap);
        this.noClassWordCount = getWordCount(noDocMap);
    }

    /**
     * 增量训练
     *
     * @param docMap  待加入训练集的数据
     * @param isbYes  对应标签
     */
    public void train(Map<String, Integer> docMap, boolean isbYes) {
        if (isbYes) {
            this.yesDocMap = mergeDocMap(this.yesDocMap, docMap);
        } else {
            this.noDocMap = mergeDocMap(this.noDocMap, docMap);
        }

        yesPrioriProb = 1.0 * yesDocMap.size() / (yesDocMap.size() + noDocMap.size());
        noPrioriProb = 1.0 * noDocMap.size() / (yesDocMap.size() + noDocMap.size());

        this.yesClassWordCount = getWordCount(yesDocMap);
        this.noClassWordCount = getWordCount(noDocMap);
    }


    /**
     * 分类文档
     *
     * @param wordFreMap  待分类文档对应的单词-频数映射
     * @return
     */
    public double[] classify(Map<String, Integer> wordFreMap) {
        double[][] conditionalProb = new double[2][wordFreMap.size()];
        conditionalProb[0] = getProbMatrix(yesDocMap, yesClassWordCount, wordFreMap);
        conditionalProb[1] = getProbMatrix(noDocMap, noClassWordCount, wordFreMap);

        double[] classProb = {yesPrioriProb, noPrioriProb};
        for (int i = 0; i < classProb.length; ++i) {
            for (int j = 0; j < wordFreMap.size(); ++j) {
                classProb[i] *= conditionalProb[i][j];
            }
        }
        return classProb;
    }

    /**
     * 概率归一化
     *
     * @param classProb  原概率列表
     * @return
     */
    public double[] normalized(double[] classProb) {
        double[] classProbAfterNor = new double[classProb.length];
        double sum = 0.0;
        for (int i = 0; i < classProb.length; ++i) {
            sum += classProb[i];
        }
        for (int i = 0; i < classProb.length; ++i) {
            classProbAfterNor[i] = classProb[i] / sum;
        }
        return classProbAfterNor;
    }

    /**
     * 将文档合并到训练文档集
     *
     * @param allDocMap  训练文档集
     * @param docMap     待增量添加文档
     * @return
     */
    public Map<String, Integer> mergeDocMap(Map<String, Integer> allDocMap, Map<String, Integer> docMap) {
        for (Iterator iterator = docMap.entrySet().iterator(); iterator.hasNext(); ) {
            Map.Entry entry = (Map.Entry) iterator.next();
            String key = (String) entry.getKey();
            Integer value = (Integer) entry.getValue();
            if (allDocMap.containsKey(key)) {
                allDocMap.put(key, allDocMap.get(key) + value);
            } else {
                allDocMap.put(key, value);
            }
        }
        return allDocMap;
    }

    /**
     * 计算给定分类属性取值下每个特征属性不同取值的条件概率矩阵
     *
     * @param docMap          给定分类属性取值对应的单词-频数映射
     * @param classWordCount 给定分类属性取值的单词总频数
     * @param wordFreMap      待分类文档对应的单词-频数映射
     * @return
     */
    private double[] getProbMatrix(Map<String, Integer> docMap, Long classWordCount, Map<String, Integer> wordFreMap) {
        double[] probMatrixPerClass = new double[wordFreMap.size()];
        int index = 0;
        for (Iterator iterator = wordFreMap.entrySet().iterator(); iterator.hasNext(); ) {
            Map.Entry entry = (Map.Entry) iterator.next();
            String key = (String) entry.getKey();
            Long tmpCount = 0l;
            Double weight = 1.0;
            if (docMap.containsKey(key)) {
                tmpCount = (long) docMap.get(key);
            }
            if (this.wordWeightMap.containsKey(key)) {
                weight = this.wordWeightMap.get(key);
            }
            probMatrixPerClass[index++] = 1.0 * (tmpCount + 1) * weight / (classWordCount + this.wordDifCount);
        }
        return probMatrixPerClass;
    }

    /**
     * 计算docMap中所有单词频数和
     *
     * @param docMap  单词-频数映射
     * @return
     */
    private Long getWordCount(Map<String, Integer> docMap) {
        Long totalFrequency = 0l;
        for (Iterator iterator = docMap.entrySet().iterator(); iterator.hasNext(); ) {
            Map.Entry entry = (Map.Entry) iterator.next();
            totalFrequency += (Integer) entry.getValue();
        }
        return totalFrequency;
    }

}

package com.csdn.jinxu.ChineseTextClassifier;

import com.google.common.collect.Maps;
import org.ansj.util.FilterModifWord;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 实现描述:分类入口
 *
 * @author jin.xu
 * @version v1.0.0
 * @see
 * @since 16-9-12 下午7:22
 */
public class MainApp {
    private static String YES_CLASS_INPUT_DIR = MainApp.class.getResource("/text/yes/").getPath();

    private static String NO_CLASS_INPUT_DIR = MainApp.class.getResource("/text/no/").getPath();

    private static String STOP_WORD_FILE = MainApp.class.getResource("/text/stop_word.txt").getPath();

    private static String INPUT_FILE1 = MainApp.class.getResource("/text/test.txt").getPath();

    public static void main(String[] args) throws IOException {
        HashMap<String, String> stopWordMap = AnsjSpliter.filter(new File(STOP_WORD_FILE));
        FilterModifWord.setUpdateDic(stopWordMap);

        Map<String, Integer> yesDocMap = AnsjSpliter.process(new File(YES_CLASS_INPUT_DIR));
        System.out.println("yesDocMap" + yesDocMap);

        Map<String, Integer> noDocMap = AnsjSpliter.process(new File(NO_CLASS_INPUT_DIR));
        System.out.println("noDocMap" + noDocMap);

        Map<String, Integer> testDocMap = AnsjSpliter.process(new File(INPUT_FILE1));
        System.out.println("testDocMap" + testDocMap);

        Map<String, Double> wordWeightMap = Maps.newHashMap();

        NBClassifier classifier = new NBClassifier(yesDocMap, noDocMap, wordWeightMap);
        double[] classProb = classifier.classify(testDocMap);

        classProb = classifier.normalized(classProb);
        print(classProb);

        classifier.train(testDocMap, false);
        classProb = classifier.classify(testDocMap);

        classProb = classifier.normalized(classProb);
        print(classProb);

    }

    private static void print(double[] classProb) {
        System.out.println("yes 概率" + classProb[0]);
        System.out.println("no 概率" + classProb[1]);
        if (classProb[0] > classProb[1]) {
            System.out.println("yes");
        } else {
            System.out.println("no");
        }

    }

}

  源代码github地址:https://github.com/XuJin1992/ChineseTextClassifier


  路漫漫其修远兮,很多时候感觉想法比较幼稚。首先东西比较简单,其次工作也比较忙,还好周末可以抽时间处理这个。由于相关知识积累有限,欢迎大家提意见斧正,在此表示感谢!后续版本会持续更新…


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

中文文本分类-朴素贝叶斯 的相关文章

  • 数据预处理的几个方法:白化、去均值、归一化、PCA

    以上转载自 http ufldl stanford edu wiki index php E7 99 BD E5 8C 96 假定数据表示成矩阵为X 其中我们假定X是 N D 维矩阵 N是样本数据量 D为单张图片的数据向量长度 去均值 这是
  • 【模式识别4】YOLO目标检测数据集xml格式转txt格式

    YOLO目标检测数据集xml格式转txt格式 1 转换前的xml格式 2 xml格式转txt格式代码 2 1 源代码 2 2 需要修改的地方 3 转换后的txt格式 代码资源 voc2txt py 1 转换前的xml格式 如果我们使用Lab
  • 四:SVM

    硬间隔最大化SVM SVM 介绍 SVM转化为最优解问题 KKT KKT图解 KKT定理 KKT例子 求解SVM最优化问题 拉格朗日对偶 拉格朗日对偶例子 用拉格朗日对偶解决问题 KKT在SVM中的意义 测试 SVM 介绍 SVM是一种分类
  • CNN中感受野的计算

    感受野 receptive field 是怎样一个东西呢 从CNN可视化的角度来讲 就是输出featuremap某个节点的响应对应的输入图像的区域就是感受野 比如我们第一层是一个3 3的卷积核 那么我们经过这个卷积核得到的featurema
  • 用遗传算法进行特征选择

    文章目录 一 问题举例 二 算法描述 1 基于类内类间距离的可分性判据 2 遗传算法 Genetic Algorithm 1 初始化种群 2 计算当前种群 M t 中每条染色体的适应度值 f m 3 基于适应度值的选择 4 交叉 5 变异
  • 基于BP神经网络的回归预测

    基本概念 误差反向传播神经网络简称为BP Back Propagation 网络 它是一种具有三层或三层以上的多层神经网络 每一层都由若干个神经元组成 如图所示为一个BP神经网络的结构图 它的左 右各层之间各个神经元实现全连接 即左层的每一
  • 最大公约数、最小公倍数、辗转相除法的求解和证明

    两个正整数的最大公约数 Greatest Common Divisor GCD 在计算机中通常使用辗转相除法计算 最小公倍数 Least Common Multiple LCM 可以使用GCD来计算 下面首先介绍GCD和LCM 然后介绍辗转
  • 什么是模式识别,模式识别主要识别什么?

    模式识别诞生于20实际20年代 随着40年代计算机的出现 50年代人工智能的兴起 模式识别在60年代初迅速发展成为一门学科 简单点说 模式识别是根据输入的原始数据对齐进行各种分析判断 从而得到其类别属性 特征判断的过程 为了具备这种能力 人
  • 模式识别(1)协方差矩阵相关和K-means聚类算法实现(含源码)

    模式识别实验一 实验一 协方差矩阵和矩阵特征值 特征向量的计算 题目简介 给定一组数据 实现该组数据的协方差矩阵的计算 并用代码实现计算一个方阵的特征值和特征向量 一 协方差部分 1 协方差的定义 协方差在概率论和统计学中用于衡量两个变量的
  • 模式识别学习初感悟

    学习模式识别已经快一个月了 从开始的混沌迷茫到现在的小有感觉 不能说自己进步了很多 只能说自己没有虚度这一个月的时光 下面相对自己这一个月的学习做一个总结 希望各位老师同学能多提宝贵意见 毕竟学术要在交流中才能发展 考研的生活结束后 顺利进
  • 统计学的基本概念

    转 浅谈协方差矩阵 一 统计学的基本概念 统计学里最基本的概念就是样本的均值 方差 标准差 首先 我们给定一个含有n个样本的集合 下面给出这些概念的公式描述 均值 标准差 方差 均值描述的是样本集合的中间点 它告诉我们的信息是有限的 而标准
  • Fisher线性判别分析

    文章目录 一 问题举例 二 解决方法 1 Fisher线性判别分析 LDA 2 算法描述 1 留一法 2 Iris数据集 3 Sonar 数据集 三 仿真结果 1 Iris数据集 2 Sonar 数据集 四 代码 一 问题举例 在UCI数据
  • 模式识别——特征提取(表达)

    特征表达 特征是机器学习系统的原材料 对最终模型的影响是毋庸置疑的 如果数据被很好地表达成了特征 通常线性模型就能达到满意的精度 关于特征 需要考虑以下三方面 1 特征表示的粒度 需要考虑 模型在一个什么程度上的特征表示 才能发挥效果 以图
  • 图像特征提取三大算法:HOG特征,LBP特征,Haar特征

    一 HOG特征 from http dataunion org 20584 html 1 HOG特征 方向梯度直方图 Histogram of Oriented Gradient HOG 特征是一种在计算机视觉和图像处理中用来进行物体检测的
  • pytorch 的 dataset 中使用 onnxruntime

    如果在 dataset 中预处理图像时 用到了 onnxruntime 的 cudaep 出现这样的错误 1 2022 12 13 13 53 01 554864883 E onnxruntime Default cuda call cc
  • 基于深度学习的图像检索 image retrieval based on deep learning (code ,代码)

    本次代码分享主要是用的caffe框架 至于caffe框架的安装过程不再说明 代码修改自 cross weights 的一篇2016年的文章 但是名字忘记了 谁记得 提醒我下 一 环境要求 1 python 2 gcc 3 opencv 4
  • 最小二乘曲线拟合——C语言算法实现二

    最小二乘曲线拟合 在上一篇博客中我们介绍了最小二乘法的原理 以及代码实现的例子 http blog csdn net beijingmake209 article details 27565125 本次我们再给出一个程序实现的例子 编译环境
  • 【行人重识别】Unsupervised Salience Learning for Person Re-identification

    Abstract 人眼可以基于 一些较小的显着区域来识别人的身份 然而 当使用现有方法计算图像的相似度时 通常会隐藏这种有价值的显着信息 此外 许多现有的方法学习区别性特征并以监督的方式处理急剧的视点变化 并要求为不同的摄像机视图对标注新的
  • 目标检测mAp

    目标检测的mAp的计算是根据不同的IoU下的对应的recall和precision计算得到
  • 算法笔记-DTW动态时间规整

    算法笔记 DTW动态时间规整 简介 简单的例子 定义 讨论 约束条件 步模式 标准化 点与点的距离函数 具体应用场景 分类 点到点匹配 算法笔记 DTW动态时间规整 动态时间规整 规划 Dynamic Time Warping DTW 是一

随机推荐

  • Latex之公式太长跨页

    文章目录 公式环境 跨页公式 公式环境 跨页公式 写毕业论文的过程中 难免会出现较长的公式 如果这个公式恰好是上一页放不下 放到下一页的话 上一页又空一大片 这样就很不美观了 本文介绍对这种公式的处理办法 第一步 在导言区加上命令 allo
  • Qt窗口程序设计

    转载自https blog csdn net lbb2016 article details 52509645 感谢博主 用Qt Creator编写一个简单的窗口程序 这次编写的窗口程序的效果图如下 这个小程序的功能是 在文本框中输入半径
  • Windows建立UDP的客户端和服务端

    一 UDP的服务端建立 udp服务端创建的步骤 1 加载库 2 创建套接字 3 绑定IP地址 4 接收数据 5 发送数据 6 关闭套接字 卸载库 代码如下 include
  • 你必须要记住的动态内存管理函数

    问题引入 首先我们要明白为什么要动态内存分配 这是因为我们所熟知的内存开辟方式通常有两个特点 1 空间开辟大小是固定的 2 数组在声明时 必须指定数组的长度 他所需要的内存在编译的时候分配 但是由于我们对空间的需求多种多样 有时候我们需要的
  • 服务器虚拟机ping不通百度,未知的名称或服务,解决方法

    ping不通百度 未知的名称或服务 解决方法 route添加一条路由 需要先安装net tools工具包 root localhost yum install net tools y root localhost route n Kerne
  • 拉格朗日函数与广义拉格朗日函数

    拉格朗日函数用来求解等式约束的最优化问题 广义拉格朗日函数用来求解不等式约束的最优化问题 无约束优化问题 关于优化问题包括无约束优化问题 等式约束优化问题 不等式约束优化问题 这里简略地介绍一下无约束优化问题 以后再来填坑 考虑无约束优化问
  • TypeError: ‘tuple‘ object does not support item assignment

    TypeError tuple object does not support item assignment 原因 修改了tuple 而tuple是不支持修改的 或者说tuple不支持直接修改 解决方法 定义一个临时变量temp temp
  • Docker日志查看命令

    docker容器列表查看 docker ps 日志查看语法 docker logs OPTIONS CONTAINER OPTIONS说明 f 跟踪日志输出 since 显示某个开始时间的所有日志 t 显示时间戳 tail 仅列出最新N条容
  • 2022十三届蓝桥杯国赛题解

    特此声明 本文仅为参考文档 标准答案请参考官方文档 试题A 该题是一道背包dp题 我的思路是定义三维dp 第一维表示第i个数 第二维表示前i个数的总和为j 第三维表示前i个数 总和为j 第i个数为z的方案数 首先观察这个题的性质 要求互不相
  • 十五、使用Selector(多路复用器)实现Netty中Reactor主从模型

    导论 前面几篇文章我们分别从 一 C10K问题经典问答 二 java nio ByteBuffer用法小结 三 Channel 通道 四 Selector选择器 五 Centos Linux安装nc 六 windows环境下netcat的安
  • 医疗场景下CV应用的总结与思考

    目录 背景 项目总体思路与框架 技术难题及解决思路 Data模块 Modeling模块 Deployment模块 可优化方向 标注流程 基于GAN的眼底图像生成模型 隐私计算 联邦学习 即时标注平台 自动化机器学习 背景 随着新生儿眼底筛查
  • 【Flask】Flask 会话

    Flask Sessions 会话 由于HTTP是无状态的 因此无法纪录客户一连串的动作 必须有一种机制使服务器能认得客户 这就引入了 会话 概念 服务器发给客户一个会话ID 当客户再访问服务器时就带着这个ID 服务器就凭着这个唯一的ID来
  • 毕业实习:Vue+Springboot+MySQL实现的订餐系统

    为期4天的毕业实习的收获 第一部分 vue框架的准备工作 测试vue cli创建工程 要以管理员身份运行cmd 1 在F盘下新建一个F shixuntestvue code文件 2 cd F 3 cd shixuntestvue code
  • python爬虫+数据分析完整流程--豆瓣电影分类排行榜

    整体思路 利用requests BeautifulSoup爬虫豆瓣电影分类排行榜数据 数据输出到本地csv文件 构建mongodb数据库 将数据存放入mongodb 利用pandas matplotlib画图分析数据 1 利用Beautif
  • Nginx安全性配置

    隐藏版本号 http server location http server tokens off 访问黑白名单设置 http server location limit except 白名单 只允许192 168 1 0 24网段的主机访
  • POJO/DTO/DO/EO/VO/BO/PO/AO的含义和使用

    关于POJO DTO DO EO VO BO PO AO 本文讨论 POJO DTO DO EO VO BO PO AO 的定义 另外讨论了这些xO在controller service dao mapper层里的使用规范 另外还稍微讨论了
  • 2023年第十四届蓝桥杯第一题阶乘求和的python另类解法

    蓝桥杯2023 求和 1 2 3 202320232023 的后9位数字 模除 乘方 n 202320232023 s s1 0 temp 10 9 for i in range 1 n 1 m 1 for k in range 1 i 1
  • 【Git系列】IDEA集成Git

    IDEA集成Git 1 idea配置git 2 idea添加暂存区和提交 创建文件 将整个项目添加到暂存区 提交到本地仓库 查看控制台 显示提交的信息 修改文件 再次提交 3 idea拉取和推送 拉取远程仓库 推送远程仓库 4 idea克隆
  • Qt出现“undefined reference to vtable for”原因总结 (转my gallery)

    由于Qt本身实现的机制所限 我们在使用Qt制作某些软件程序的时候 会遇到各种各样这样那样的问题 而且很多是很难 或者根本找不到原因的 即使解决了问题 如果有人问你为什么 你只能回答 不知道 今天我在这里列举的问题也是再编写Qt程序时 总是遇
  • 中文文本分类-朴素贝叶斯

    原创作品 出自 晓风残月xj 博客 欢迎转载 转载时请务必注明出处 http blog csdn net xiaofengcanyuexj 由于各种原因 可能存在诸多不足 欢迎斧正 最近在想怎么利用数据挖掘的方法进行评论自动审核 分类为垃圾