《统计学习方法》(李航),《机器学习》(周志华)学习随笔

《统计学习方法》(李航)学习笔记

【1】第一章 统计学习方法概论

1.3.2的2. 经验风险最小值与结构风险最小值中提到'当模型是条件概率分布,损失函数是对数损失函数时,经验风险最小化等价于极大似然估计'。P9

个人注解:

F={P|P(Y|X);θ}

L(θ)=Π1nP(yi|xi)

log(L(θ))=Σ1nlogP(yi|xi)

考虑到N是常数,则

1NΣ1nlog(P(yi|xi))

由此可知,经验风险最小,实际上等价于对数极大似然函数取最大。

【2】1.4.2的例1.1对wj求偏导,P12

L(w)=12Σi=1NΣj=0M[wjxijyi]2

对上式求导:

12Σi=1N2(wjxijyj)xij=0:Σi=1Nwjxi2j=Σi=1Nxijyjwj=Σi=1NxiyiΣi=1Nxij+1

《机器学习》(西瓜书)

【1】第四章 决策树ID3算法递归结束的三个条件
(1)子结点中的样本属于同一类。
(2)子结点的特征用完了。
(3)子结点没有样本了。
https://www.jianshu.com/p/d153130b813f
【2】第四章 决策树连续值处理

西瓜书 决策树连续值属性处理 (P83~85)

import numpy as np
import pandas as pd

西瓜的密度及对应的标签如下:

density=[(0.697,'y'),(0.774,'y'),(0.643,'y'),(0.608,'y'),(0.556,'y'),
         (0.403,'y'),(0.481,'y'),(0.437,'y'),(0.666,'n'),(0.243,'n'),(0.245,'n'),
         (0.343,'n'),(0.639,'n'),(0.657,'n'),(0.36,'n'),(0.593,'n'),(0.719,'n')]
df=pd.DataFrame(density,columns=['density','good_or_bad'])
df
density good_or_bad
0 0.697 y
1 0.774 y
2 0.643 y
3 0.608 y
4 0.556 y
5 0.403 y
6 0.481 y
7 0.437 y
8 0.666 n
9 0.243 n
10 0.245 n
11 0.343 n
12 0.639 n
13 0.657 n
14 0.360 n
15 0.593 n
16 0.719 n

数据集D的信息熵:

def calEnt(df):
    """
    计算信息熵
    """
    good=(df.iloc[:,1]=='y').sum()
    bad=(df.iloc[:,1]=='n').sum()
    good_ratio=good/(good+bad)
    bad_ratio=1-good_ratio
    if 1 in [good_ratio,bad_ratio]:
        return 0 
    ent=-(np.log2(good_ratio)*good_ratio+np.log2(bad_ratio)*bad_ratio)
    return ent
ent_D=calEnt(df);ent_D
0.9975025463691153

根据二分法取候选值

x1=df.iloc[:,0].values.copy();x1 #注意这里要用copy!否则就是view,而后续的sort将改变df的index!
array([0.697, 0.774, 0.643, 0.608, 0.556, 0.403, 0.481, 0.437, 0.666,
       0.243, 0.245, 0.343, 0.639, 0.657, 0.36 , 0.593, 0.719])
x1.sort()
t_ready=(x1[:-1]+x1[1:])/2;t_ready
array([0.244 , 0.294 , 0.3515, 0.3815, 0.42  , 0.459 , 0.5185, 0.5745,
       0.6005, 0.6235, 0.641 , 0.65  , 0.6615, 0.6815, 0.708 , 0.7465])
a,b=np.array([1,2]),np.array([3,4])

求解Gain(D,a)

def get_gain(df,t_ready):
    """
    求解连续属性的信息增益
    df为连续属性数据集
    t_ready是根据二分法求解的连续属性待定值
    """
    result=[]
    ent_D=calEnt(df)
    df_count=len(df)
    for i in t_ready:
        small_part=df.where(df.iloc[:,0]<=i).dropna()
        large_part=df.where(df.iloc[:,0]>i).dropna()
        small_part_ent=calEnt(small_part)
        large_part_ent=calEnt(large_part)
        small_count=len(small_part)
        large_count=len(large_part)

        ratio_group=np.array([small_count/df_count,large_count/df_count])
        ent_group=np.array([small_part_ent,large_part_ent])

        gain=ent_D-(ratio_group*ent_group).sum()
        result.append((i,gain))
    return result
        
results=get_gain(df,t_ready)
results.sort(key=lambda x:x[1])
results
[(0.708, 0.00033345932649475607),
 (0.6615, 0.0007697888924075302),
 (0.641, 0.0013653507075551685),
 (0.5745, 0.002226985278291793),
 (0.6005, 0.002226985278291793),
 (0.5185, 0.003585078590305879),
 (0.6234999999999999, 0.003585078590305879),
 (0.65, 0.006046489176565584),
 (0.6815, 0.024085993037174735),
 (0.45899999999999996, 0.03020211515891169),
 (0.244, 0.05632607578088),
 (0.7464999999999999, 0.06696192680347068),
 (0.42000000000000004, 0.0934986902367243),
 (0.29400000000000004, 0.1179805181500242),
 (0.35150000000000003, 0.18613819904679052),
 (0.3815, 0.2624392604045632)]

因此,可得属性“密度”的信息增益是0.262,对应的划分点为0.381,与西瓜书的结果一致!

再验证含糖率:

suger=[(0.46,'y'),(0.376,'y'),(0.264,'y'),(0.318,'y'),(0.215,'y'),(0.237,'y'),(0.149,'y'),(0.211,'y'),
      (0.091,'n'),(0.267,'n'),(0.057,'n'),(0.099,'n'),(0.161,'n'),(0.198,'n'),(0.37,'n'),(0.042,'n'),(0.103,'n')]
df_suger=pd.DataFrame(suger,columns=['suger','good_or_bad'])
xx=df_suger.iloc[:,0].values.copy()
xx.sort()
suger_ready=(xx[1:]+xx[:-1])/2
results=get_gain(df_suger,suger_ready)
results.sort(key=lambda x:x[1]);results
[(0.2655, 0.02025677859928121),
 (0.344, 0.024085993037174735),
 (0.0495, 0.05632607578088),
 (0.2505, 0.06150029019652836),
 (0.41800000000000004, 0.06696192680347068),
 (0.2925, 0.0715502899435908),
 (0.074, 0.1179805181500242),
 (0.22599999999999998, 0.12369354800009502),
 (0.373, 0.14078143361499595),
 (0.155, 0.15618502398692902),
 (0.095, 0.18613819904679052),
 (0.213, 0.21114574906025385),
 (0.1795, 0.2354661674053965),
 (0.101, 0.2624392604045632),
 (0.20450000000000002, 0.33712865788827096),
 (0.126, 0.34929372233065203)]

因此,可得属性“含糖率”的信息增益是0.349,对应的划分点为0.126,与西瓜书的结果一致!

【3】第三章 线性回归最小二乘“参数估计”的求解 P54~P55

E(w,b)=argminΣi=1m(yiwxib)2E(w,b)/w=2(Σ(wxi+byi)xi)=2(wΣxi2+Σ(byi)xi)....(1)E(w,b)/b=2(Σi=1m(wxi+byi))=2(mb+Σ(wxiyi)).......(2)

令 (1)式,(2)式均为0,

由(2)式为0得:

b=1mΣ(yiwxi)=1mΣyi1mΣwmx¯....(4)

其中,

x¯1mΣxi

将(4)带入,(1)=0中:

wΣxi2=ΣxiyibΣxi=Σxiyi(1mΣyiwx¯)mx¯=Σxiyix¯Σyi+wmx¯2w=Σyi(xix¯)Σ(xi2mx¯2)b=1mΣ(yiwxi)=1mΣyi1mΣwmx¯

【4】P55 线性回归 矩阵求导

在解决该问题之前,先进行一定的知识回顾:

对于一元微积分的导数(标量对标量)与微分有关系:

df=f'(x)dx;

对于多元微积分中的梯度(标量对向量的导数)与微分有关系:

df=Σi=1n(f/xi)dxi=(f/xi)TdX

那么对于标量对矩阵导数与微分的关系:

df=Σi=1mΣj=1n(f/xij)dXij=tr((f/X)TdX)

tr为矩阵的迹。

上式的理解:

tr(ATB)AB

比如

A=(a11a12a13a21a22a23a31a32a33)B=(b11b12b13b21b22b23b31b32b33)

那么A与B的内积为

a11b11+a12b12+...a33b33=Σi=1i=3Σj=1j=3aijbij

ATB=(a11b11+a21b21+a31b31a12b12+a22b22+a32b32a13b13+a23b23+a33b33)

ATBA,B

下面简单介绍矩阵微分的运算法则:

(1)d(X±Y)=dX±dY;d(XY)=(dX)Y+X(dY)d(XT)=(dX)T:dtr(X)=tr(dX)(2)dX1=X1dX(X1)(3)d|X|=tr(XdX),XXXd|X|=|X|tr(X1dX)(4)d(XY)=dXY+XdYX,Y(5)dσ(X)=σ(X)dX,σ(X)=[σ(Xij)]σ(X)=[σ(Xij)]X=[X11X12X21X22]dsin(X)=[cosX11dX11cosX12dX12cosX21dX21cosX22dX22]=cos(X)d(X)

迹的变形:

1.a=tr(a)2.tr(AT)=tr(A)3.线tr(A±B)=tr(A)±tr(B)4.tr(AB)=tr(BA)ABTΣi,jAijBji5./tr(AT(BC))=tr((AB)TC)

对于复合函数,链式法则失效!不能随意沿用标量的链式法则。要从微分入手建立复合法则:

df=tr((f/Y)dY)dYdX使dXf/X.

下面直接解决《机器学习》(西瓜书)线性回归部分矩阵求导问题 (P55)

Ew^=(YXW^)T(YXW^)P=(YXW^)PTPdE=d(PTP)=(dPT)P+PTdP=(dP)TP+PTdPdE=tr(dE)=tr((dP)TP+PTdP)=tr((dP)TP)+tr(PTdP)tr((dP)TP)=tr(PT(dP))tr(PTdP)=tr((dP)TP)=tr(PT(dP))dE=tr(PTdP)+tr(PTdP)=2tr(PTdP)=tr(2PTdP)....(1)dP=d(Y)d(XW^)X,Y/dX=0,dY=0dP=d(Y)((dX)W^+XdW^)=XdW^(1)dE=tr(2PT(XdW^))=tr(2XTP)TdW^dE=tr((E/W^)TdW^)(E/W^)=2XTP=2XT(XW^Y)

附:md数学符号写法:https://www.cnblogs.com/ywsun/p/14271547.html#autoid-0-7-0

posted @   JohnYang819  阅读(324)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2019-02-18 python 变量搜寻顺序法则LEGB之E注意事项
点击右上角即可分享
微信分享提示