正则化学习总结

正则表达式

符合一定规则的表达式。(操作字符串的规则)


作用:用于专门操作字符串。
特点:用一些特定的符号来表示一些代码操作,这样就简化了书写。所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。


具体操作功能:
1、匹配:String类中的 matches()方法。用规则匹配整个字符串,只要有一处不符合规则就匹配结束,返回false
2、切割:String类中的 split()方法。
3、替换:String类中的 replaceAll()、replaceFirst()方法.
4、获取:Pattern类中的compile、matcher、find、group等一系列方法


1、匹配

String类中的matches()方法
boolean - matches(String regex);告知此字符串是否匹配给定的正则表达式。

class RegexDemo
{
    public static void checkTel()
    //练习:匹配手机号,手机号段只有13xxx 15xxx 18xxx
    {   BufferedReader bufr = null;
        try
        {
            bufr = new BufferedReader(new InputStreamReader(System.in));
            String tel = bufr.readLine();
            //String tel = "12911289129";
            String regex = "[1][358]\\d{9}";
            boolean b = tel.matches(regex);
            if(b)
                sop("tel:"+tel);
            else
                sop("手机号不匹配");
        }
        catch (IOException e)
        {
        }
        finally
        {
            if(bufr != null)
                try
                {
                    bufr.close();
                }
                catch (IOException e)
                {
                }
        }

    }
    public static void demo()
    {
        String str = "c1";

        String reg = "[a-zA-Z]\\d";//第一位字母,第二位数字

        boolean b = str.matches(reg);
        sop(b);
    }
    public static void checkQQ()
    {
        String qq = "1356944544";

        String regex = "[1-9] [0-9]{4-14}";//正则表达式

        boolean flag = qq.matches(regex);
        if(flag)
            sop(qq+"---is OK!");
        else
            sop(qq+"---nonononono");
    }
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}

2、切割

1、String - split(String regex);
根据给定正则表达式的匹配拆分此字符串;
2、String - split(String regex,int limit);
根据匹配给定的正则表达式来拆分此字符串。

+ 表示出现一次或多次

不能用”.”来切割,因为被正则表达式(表示任意字符)占用,如果要用写作"\\."

为了可以让规则的结果被重用,可以将规则分装成一个组,用小括号()完成。
组的出现都有编号,从1 开始。想要使用已有的组,可以使用\\n 的形式获取,
n 就是组的编号。

(1(2(3))(4)) 有几个组看有几个左括号,第几个左括号就是第几组

正则表达式的弊端:符号定义越多,正则越长,阅读性越差。

class RegexDemo2
{
    public static void main(String[] args)
    {
        splitDemo("zhangsan  ,./\\  -lisi ,.,/,.,.   wangwu","[^a-zA-Z-]+");

        //splitDemo("zhangsan.lisi.wangwu","\\.");//用.切
        //splitDemo("C:\\abc\\a.txt","[^a-zA-Z.:]+");//用非字母、“.”以及‘:’切
        //splitDemo("C:\\abc\\a.txt","\\\\");//用\\切

        //splitDemo("erkkteeeeeyqqui","(.)\\1+");//用叠词切
    }
    public static void splitDemo(String str,String reg)
    {
        String[] arr = str.split(reg);
        sop(arr.length);
        for (String s : arr)
        {
            sop(s);
        }
    }
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}

3、替换

替换:String - replaceAll(String regex,String replacement);
使用给定的replacement替换此字符串所有匹配给定的正则表达式的子字符串。

String - replaceFirst(String regex,String replacement);
使用给定的replacement替换此字符串所有匹配给定的正则表达式的第一个子字符串。

class RegexDemo3 
{
    public static void main(String[] args)
    {
        String str = "wer234tyu452342346ioui678op";
        //1、要求:将字符串中的连续超过5个的数字替换成#
        replaceAllDemo(str,"[0-9]{5,}","#");
        replaceAllDemo(str,"\\d{5,}","#");

        String str1 = "ereeeeetyfffffui";
        //2、要求:将叠词替换成$  $在正则化中是特殊符号
        replaceAllDemo(str1,"(.)\\1+","\\$");//不写\\会越界,$后面没有数字默认整个字符串

        //3、要求,将叠词替换成单个词  -- 用$n符号可以指定组中的第n组
        replaceAllDemo(str1,"(.)\\1+","$1");//newStr 为前面组中的第一个组

    }
    public static void replaceAllDemo(String str,String reg,String newStr)
    {
        String str2 = str.replaceAll(reg,newStr);

        sop(str2);
    }
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}

4、获取

获取:将字符串中符合规则的子串取出。

操作步骤:
1、将正则表达式封装成对象;
2、让正则对象和要操作的字符串相关联;
3、关联后,获取正则匹配引擎;
4、通过引擎对符合规则的子串进行操作,比如取出。

static Pattern - compile(String regex);
将给定的正则表达式编译到模式中。
static Pattern - compile(String regex,int flags);
将给定的正则表达式编译到具有给定标识的模式中。
int - flags();
返回此模式的匹配标志。
Matcher - matcher(CharSequence input);
创建匹配给定输入与此模式的匹配器。

其实String类中的matches方法其实就是用的Pattern和Matcher
方法完成的。只不过被String的方法封装后,用起来比较简单,
但是功能却单一了。


class RegexDemo4
{
    public static void main(String[] args) 
    {
        getDemo();
    }
    public static void getDemo()
    {
        String str = "ming tian jiu yao fang jia le , da jia";

        String reg = "\\b[a-zA-Z]{4}\\b";//\b 单词边界

        //1、将规则封装成对象。
        Pattern p = Pattern.compile(reg);

        //2、3、让正则对象和要操作的字符串相关联。获取匹配器对象
        Matcher m = p.matcher(str);

        //boolean b = m.find();//让规则作用到字符串上,并进行符合规则的子串查找
        //sop(b);
        //sop(m.group());//group()方法用于获取匹配后的结果**

        //4、通过引擎对符合规则的子串进行操作
        //sop("matches:"+m.matches());//同一个匹配器用的是同一个指针,
        //这样在匹配前调用匹配器的其他方法,会让下个方法开始时匹配器的指针不在初始位置,使结果错误。
        while (m.find())
        {
            sop(m.group());
            sop(m.start()+"---"+m.end());//获取子串的索引(指针)位置,包含头不包含尾
        }
    }
    public static void sop(Object obj)
    {
        System.out.println(obj);
    }
}
<think>好的,我现在要回答关于机器学习正则化的概念、方法和应用的问题。首先,我需要理解用户的需求,他们可能想了解正则化的基本概念,常见的正则化方法,以及这些方法在实际中的应用场景。用户可能还希望了解不同正则化方法的优缺点,以及它们如何帮助防止过拟合。 首先,我应该从正则化的定义开始。正则化是机器学习中用来防止过拟合的技术,通过在损失函数中添加惩罚项来限制模型复杂度。过拟合是指模型在训练数据上表现很好,但在新数据上表现差,所以正则化有助于提高泛化能力。 接下来需要介绍常见的正则化方法,比如L1、L2正则化,以及Elastic Net和Dropout。需要分别解释它们的原理、公式、作用机制和优缺点。例如,L1正则化会添加权重的绝对值之和作为惩罚项,导致稀疏性,适合特征选择;而L2正则化添加权重的平方和,使得权重趋向于较小的值,防止过拟合。Elastic Net结合了L1和L2的优点,适用于高维数据。Dropout则是在神经网络中随机丢弃部分神经元,减少对特定神经元的依赖,增强泛化能力。 然后需要讨论应用场景,比如L1用于特征选择,L2用于防止过拟合,Dropout在深度学习中常用。还要提到正则化的实际应用案例,例如在图像分类、自然语言处理中的使用。 还要注意引用提供的资料,比如引用[2]和[3]中提到的L1、L2、Elastic Net和Dropout。确保回答中正确引用这些内容,并在适当的位置添加引用标识。 另外,用户要求回答结构清晰,逐步解决问题,所以需要分点解释,每个部分用小标题,使用中文,数学公式用$$...$$格式,行内公式用$...$。例如,在解释L1正则化时,需要写出其数学表达式:$$ J(w) = \text{原始损失} + \lambda \sum_{i=1}^n |w_i| $$,并说明各个符号的含义。 还要检查LaTeX语法是否正确,比如积分符号、上下标是否正确使用。例如,积分示例中的公式是否正确:$\int_{-\pi}^{\pi} \cos(nx)\sin(mx)dx = 0$。 最后,生成相关问题,可能需要围绕正则化的其他方法、比较不同方法、实际应用中的选择等。例如,如何选择L1和L2正则化?Dropout在训练和测试时的区别?正则化参数λ的影响? 现在需要组织这些内容,确保逻辑连贯,覆盖用户需求的所有方面,并且引用正确。可能还需要验证一些细节,比如Elastic Net的具体公式是否正确,Dropout的具体实现机制是否准确,确保没有错误信息。 总结步骤: 1. 定义正则化及其目的。 2. 分点介绍各种正则化方法,包括公式、原理、优缺点。 3. 应用场景和实际案例。 4. 生成相关问题。 5. 正确引用参考资料。 检查是否有遗漏,比如是否提到了数据清洗或模型训练中的正则化应用,但根据引用内容,主要关注正则化方法本身。确保每个部分都简明扼要,符合用户的要求。</think>### 机器学习中的正则化方法及应用解释 #### 一、正则化的基本概念 正则化是机器学习中用于**防止过拟合**的核心技术,通过在损失函数中加入**惩罚项**来限制模型复杂度,从而提高模型在未知数据上的泛化能力[^2]。其核心思想是对模型参数施加约束,避免因参数过大或过于复杂而过度拟合训练数据。 --- #### 二、常见正则化方法及原理 1. **L1正则化(Lasso)** - **公式**: $$ J(w) = \text{原始损失} + \lambda \sum_{i=1}^n |w_i| $$ - **原理**: 惩罚参数的绝对值之和,使得部分参数趋近于零,实现**特征选择**。 - **优点**: 生成稀疏权重矩阵,适合高维数据。 - **缺点**: 对异常值敏感,可能丢失重要特征。 2. **L2正则化(Ridge)** - **公式**: $$ J(w) = \text{原始损失} + \lambda \sum_{i=1}^n w_i^2 $$ - **原理**: 惩罚参数的平方和,使权重趋向较小的值,降低模型复杂度。 - **优点**: 对异常值更鲁棒,适合大多数回归问题。 - **缺点**: 无法直接进行特征选择[^2]。 3. **Elastic Net** - **公式**: $$ J(w) = \text{原始损失} + \lambda_1 \sum_{i=1}^n |w_i| + \lambda_2 \sum_{i=1}^n w_i^2 $$ - **原理**: 结合L1和L2正则化,平衡稀疏性与鲁棒性。 - **应用场景**: 高维数据且特征间存在相关性时(如基因组数据)。 4. **Dropout(经验正则化)** - **原理**: 在神经网络训练中随机“关闭”部分神经元,强制模型学习冗余表示。 - **优点**: 减少神经元间的协同依赖,增强泛化能力[^3]。 - **实现**: 训练时按概率$p$丢弃神经元,测试时保留全部神经元并缩放权重。 --- #### 三、正则化的应用场景 1. **特征选择**:L1正则化可用于筛选对预测目标最重要的特征(如金融风控模型)。 2. **防止过拟合**:L2正则化广泛应用于线性回归、支持向量机等模型。 3. **深度学习优化**:Dropout是卷积神经网络(CNN)和循环神经网络(RNN)中的标配技术(如图像分类任务)[^3]。 4. **高维数据处理**:Elastic Net在生物信息学中处理基因表达数据时表现优异。 --- #### 四、正则化的实际案例 - **自然语言处理(NLP)**:在文本分类任务中,L2正则化可防止词向量权重过大。 - **推荐系统**:L1正则化用于从用户行为数据中提取关键特征。 - **医学影像分析**:Dropout在ResNet等模型中减少过拟合,提升病灶检测准确率。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值