两种正则

http://www.chinaz.com/Program/PHP/022510G432010.html

 

简介

正则表达式(Regular Expression,缩写为regexp,regex或regxp),又称正规表达式、正规表示式或常规表达式或正规化表示法或正规表示法,是指一个用 来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本 内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的在正则表达式引擎。正则表达式这个概念最初是由 Unix中的工具软件(例如sed和grep)普及开的。(摘自维基百科)

PHP同时使用两套正则表达式规则,一套是由电气和电子工程师协会(IEEE)制定的POSIX Extended 1003.2兼容正则(事实上PHP对此标准的支持并不完善),另一套来自PCRE(Perl Compatible Regular Expression)库提供PERL兼容正则,这是个开放源代码的软件,作者为 Philip Hazel。

使用POSIX兼容规则的函数有:
ereg_replace()
ereg()
eregi()
eregi_replace()
split()
spliti()
sql_regcase()
mb_ereg_match()
mb_ereg_replace()
mb_ereg_search_getpos()
mb_ereg_search_getregs()
mb_ereg_search_init()
mb_ereg_search_pos()
mb_ereg_search_regs()
mb_ereg_search_setpos()
mb_ereg_search()
mb_ereg()
mb_eregi_replace()
mb_eregi()
mb_regex_encoding()
mb_regex_set_options()
mb_split()

使用PERL兼容规则的函数有:
preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()

定界符:

POSIX兼容正则没有定界符,函数的相应参数会被认为是正则。

PERL兼容正则可以使用任何不是字母、数字或反斜线(/)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[] 和 <> 作为定界符

修正符:

POSIX兼容正则没有修正符。

PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误):

(PCRE_CASELESS):
匹配时忽略大小写。

m(PCRE_MULTILINE):
当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(/n)的之后和之前。

s(PCRE_DOTALL):
如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。

x(PCRE_EXTENDED):
如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。

e
如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。

A(PCRE_ANCHORED):
如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。

D(PCRE_DOLLAR_ENDONLY):
如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面。如果设定了 m 修正符则忽略此选项。

S
当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。

U(PCRE_UNGREEDY):
使“?”的默认匹配成为贪婪状态的。

X(PCRE_EXTRA):
模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。

u(PCRE_UTF8):
模式字符串被当成UTF-8。

逻辑区隔:

POSIX兼容正则和PERL兼容正则的逻辑区隔符号作用和使用方法完全一致:
[]:包含任选一操作的相关信息。
{}:包含匹配次数的相关信息。
():包含一个逻辑区间的相关信息,可被用来进行引用操作。
|:表示“或”,[ab]和a|b是等价的。

元字符与“[]”相关:

有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号“[]”内被识别的。

POSIX兼容正则和PERL兼容正则“[]之外”“一致”的元字符:
/ 有数种用途的通用转义符
^ 匹配字符串的开头
$ 匹配字符串的结尾
? 匹配0或者1
* 匹配 0 个或多个前面指定类型的字符
+ 匹配 1 个或多个前面指定类型的字符

POSIX兼容正则和PERL兼容正则“[]之外”“不一致”的元字符:
. PERL兼容正则匹配除了换行符外的任意一个字符
. POSIX兼容正则匹配任意一个字符

POSIX兼容正则和PERL兼容正则“[]之内”“一致”的元字符:
/ 有数种用途的通用转义符
^ 取反字符,但仅当其为第一个字符时有效
- 指定字符ASCII范围,仔细研究ASCII码,你会发现[W-c]等价于[WXYZ//^_`abc]

POSIX兼容正则和PERL兼容正则“[]之内”“不一致”的元字符:
- POSIX兼容正则中[a-c-e]的指定会抛出错误。
- PERL兼容正则中[a-c-e]的指定等价于[a-e]。

匹配次数与“{}”相关:

POSIX兼容正则和PERL兼容正则在匹配次数方面完全一致:
{2}:表示匹配前面的字符2次
{2,}:表示匹配前面的字符2次或多次,默认都是贪婪(尽可能多)的匹配
{2,4}:表示匹配前面的字符2次或4次

逻辑区间与“()”相关:

使用()包含起来的区域是一个逻辑区间,逻辑区间的主要作用是体现出一些字符出现的逻辑次序,另一个用处就是可以用来引用(可以将此区间内的值引用给一个变量)。后一个作用比较奇特:

<?php
$str  =  " http://www.163.com/ " ;
// POSIX兼容正则:
echo   ereg_replace ( " (.+) " , " <a href =  // 1 > // 1</a> " , $str ) ;
// PERL兼容正则:
echo   preg_replace ( " /(.+)/ " , " <a href = $1 >$1</a> " , $str ) ;
// 显示两个链接
?>

在引用的时候,括号是可以嵌套的,逻辑次序是按照“(”出现的次序来标定的。

类型匹配:

POSIX兼容正则:
[:upper:]:匹配所有的大写字母
[:lower:]:匹配所有的小写字母
[:alpha:]:匹配所有的字母
[:alnum:]:匹配所有的字母和数字
[:digit:]:匹配所有的数字
[:xdigit:]:匹配所有的十六进制字符,等价于[0-9A-Fa-f]
[:punct:]:匹配所有的标点符号,等价于[.,"'?!;:]
[:blank:]:匹配空格和TAB,等价于[ /t]
[:space:]:匹配所有的空白字符,等价于[ /t/n/r/f/v]
[:cntrl:]:匹配所有ASCII 0到31之间的控制符。
[:graph:]:匹配所有的可打印字符,等价于:[^ /t/n/r/f/v]
[:print:]:匹配所有的可打印字符和空格,等价于:[^/t/n/r/f/v]
[.c.]:功能不明
[=c=]:功能不明
[:<:]:匹配单词的开始
[:>:]:匹配单词的结尾

PERL兼容正则(这里可以看出PERL正则的强大):
/a alarm,即 BEL 字符(’0)
/cx "control-x",其中 x 是任意字符
/e escape(’0B)
/f 换页符 formfeed(’0C)
/n 换行符 newline(’0A)
/r 回车符 carriage return(’0D)
/t 制表符 tab(’0)
/xhh 十六进制代码为 hh 的字符
/ddd 八进制代码为 ddd 的字符,或 backreference
/d 任一十进制数字
/D 任一非十进制数的字符
/s 任一空白字符
/S 任一非空白字符
/w 任一“字”的字符
/W 任一“非字”的字符
/b 字分界线
/B 非字分界线
/A 目标的开头(独立于多行模式)
/Z 目标的结尾或位于结尾的换行符前(独立于多行模式)
/z 目标的结尾(独立于多行模式)
/G 目标中的第一个匹配位置

<think> 我们正在讨论Scikit-learn中的两种正则化:L1和L2正则化。根据用户之前的问题和我们的回答,我们知道在Scikit-learn中,这两种正则化通常在线性模型(如线性回归、逻辑回归)和SVM等模型中使用。用户现在想了解Scikit-learn中这两种正则化的具体定义。 回顾引用: - 引用[1]提到Scikit-learn提供了各种机器学习算法,包括监督学习,并支持模型评估和调优,如交叉验证和网格搜索。 - 引用[2]强调了Scikit-Learn的易用性,并提到了数据预处理、模型选择和评估。 - 引用[4]展示了在Scikit-learn中使用SVM的示例,其中SVM的C参数实际上就是正则化参数(在SVM中,C是正则化强度的倒数,即C越大,正则化越弱)。 在Scikit-learn中,正则化的定义与数学定义一致,但具体实现和参数名称可能因模型而异。我们重点关注线性模型(如Logistic回归和线性回归)和SVM。 1. **L1正则化(Lasso)**:在Scikit-learn中,可以通过设置`penalty='l1'`来使用L1正则化。例如,在`LogisticRegression`中: ```python from sklearn.linear_model import LogisticRegression model = LogisticRegression(penalty='l1', solver='liblinear', C=1.0) ``` 这里,`C`是正则化强度的倒数,即`C`值越小,正则化强度越大(对应数学公式中的$\lambda$越大)。L1正则化会使得部分特征的权重变为0,从而实现特征选择。 2. **L2正则化(Ridge)**:在Scikit-learn中,通过设置`penalty='l2'`来使用L2正则化。例如: ```python model = LogisticRegression(penalty='l2', C=1.0) ``` L2正则化会使得所有权重都接近于0但不为0,避免模型过拟合。 注意:在Scikit-learn中,正则化参数通常用`C`表示,而`C`与数学公式中的$\lambda$的关系为:$C = \frac{1}{\lambda}$。因此,`C`值越大,正则化越弱(即惩罚越小)。 另外,在SVM中(如引用[4]中的示例),同样使用参数`C`来控制正则化强度: ```python svm = SVC(kernel='rbf', C=1.0, gamma='auto') ``` 这里的`C`也是正则化参数,其作用等同于线性模型中的`C`。 总结Scikit-learn中两种正则化的定义: - **L1正则化**:通过添加权重的L1范数(绝对值之和)作为惩罚项,在Scikit-learn中通过`penalty='l1'`设置,并配合参数`C`调整强度。 - **L2正则化**:通过添加权重的L2范数(平方和)作为惩罚项,在Scikit-learn中通过`penalty='l2'`设置,并配合参数`C`调整强度。 在编写回答时,我们将按照以下结构: 1. 首先明确Scikit-learn中两种正则化的一般定义。 2. 分别介绍L1和L2正则化在Scikit-learn中的具体实现(使用代码示例)。 3. 解释参数`C`与正则化强度$\lambda$的关系。 4. 讨论不同模型(线性模型和SVM)中正则化的应用。 注意:在Scikit-learn中,并不是所有模型都同时支持L1和L2正则化。例如,线性回归模型有`Lasso`(L1)和`Ridge`(L2)两个不同的类,而逻辑回归则通过`penalty`参数选择。 最后,生成相关问题。 </think> ### Scikit-Learn中的正则化定义 在Scikit-Learn中,正则化通过向损失函数添加惩罚项来控制模型复杂度,防止过拟合。L1和L2正则化是其核心实现,具体定义如下: #### 1. L1正则化(Lasso正则化) 在Scikit-Learn中的定义为: $$ J(\theta) = \text{Loss}(\theta) + \alpha \sum_{i=1}^{n} |\theta_i| $$ 其中: - $\text{Loss}(\theta)$ 是原始损失函数(如均方误差/交叉熵) - $\alpha$ 是正则化强度参数($\alpha > 0$) - $\sum|\theta_i|$ 是权重向量的L1范数(绝对值之和) 关键实现: ```python # Lasso回归示例(线性模型) from sklearn.linear_model import Lasso model = Lasso(alpha=0.1) # α控制正则化强度 ``` 特点: - 产生稀疏权重矩阵(部分权重归零) - 内置特征选择能力 - 适用于高维数据特征筛选[^2] #### 2. L2正则化(Ridge正则化) 在Scikit-Learn中的定义为: $$ J(\theta) = \text{Loss}(\theta) + \alpha \frac{1}{2}\sum_{i=1}^{n} \theta_i^2 $$ 其中: - $\frac{1}{2}\sum\theta_i^2$ 是权重向量的L2范数平方(Scikit-Learn标准形式) - $\alpha$ 控制正则化强度 关键实现: ```python # Ridge回归示例 from sklearn.linear_model import Ridge model = Ridge(alpha=0.5) # 正则化强度 # SVM中的实现(引用[4]) from sklearn.svm import SVC svm = SVC(kernel='rbf', C=1.0) # C=1/α ``` 特点: - 使所有权重均匀缩小但不归零 - 提高模型稳定性和泛化能力 - 适用于特征间存在相关性的场景[^4] #### 参数说明 | 参数 | 含义 | 值域关系 | |------------|--------------------------|------------------| | $\alpha$ | 正则化强度(线性模型) | $\alpha \propto$ 惩罚强度 | | $C$ | 正则化倒数(SVM) | $C = \frac{1}{\alpha}$ | > **注意**:在SVM中正则化参数名为$C$(如引用[4]),其与$\alpha$的关系为$C = \frac{1}{\alpha}$,即$C$值越大正则化越弱[^4]。 ### 应用场景对比 | 特性 | L1正则化 | L2正则化 | |--------------|------------------------|------------------------| | **权重特性** | 稀疏解(部分权重=0) | 稠密解(所有权重≠0) | | **特征选择** | 内置特征选择能力 | 无自动特征选择 | | **最佳场景** | 高维数据/特征筛选 | 共线性数据/防过拟合 | | **Scikit类** | `Lasso`, `LogisticRegression(penalty='l1')` | `Ridge`, `SVC(C=值)` | 在Scikit-Learn中,可通过交叉验证自动选择最优$\alpha$或$C$值(如引用[1]提到的网格搜索功能)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值