2017-10-12 22:47:01 yxp520123 阅读数 167
  • 机器学习数学基础之矩阵视频教学

    本课程囊括了机器学习理论中所需要的和线性代数相关的所有知识。帮助想入门机器学习的朋友们快速掌握数学基础。 主要内容: 1. 矩阵的定义、性质、运算、分解以及应用。 2. 线性空间、范数、生成子空间相关知识。

    11826 人正在学习 去看看 AI100讲师

参考大神的博客:http://blog.csdn.net/zouxy09/article/details/24971995

范数的定义:

范数是一个函数,输入是一个向量或者矩阵,输出是一个数。

L0范数的定义:

向量或矩阵中非零元素的个数。

L1范数的定义:

向量或矩阵中元素的绝对值之和,也有个美称叫“稀疏规则算子”(Lasso regularization)。

L2范数的定义:

向量或矩阵中元素的平方和再开方。


为什么要稀疏?让我们的参数稀疏有什么好处呢?这里扯两点:
1)特征选择(Feature Selection):
大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。
2)可解释性(Interpretability):
另一个青睐于稀疏的理由是,模型更容易解释。例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型:y=w1*x1+w2*x2+…+w1000*x1000+b(当然了,为了让y限定在[0,1]的范围,一般还得加个Logistic函数)。通过学习,如果最后学习到的w*就只有很少的非零元素,例如只有5个非零的wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但如果1000个wi都非0,医生面对这1000种因素,累觉不爱。



最小化误差是为了让我们的模型拟合我们的训练数据,而规则化参数是防止我们的模型过分拟合我们的训练数据。因为参数太多,会导致我们的模型复杂度上升,容易过拟合,也就是我们的训练误差会很小。但训练误差小并不是我们的最终目标,我们的目标是希望模型的测试误差小,也就是能准确的预测新的样本。所以,我们需要保证模型“简单”的基础上最小化训练误差,这样得到的参数才具有好的泛化性能(也就是测试误差也小),而模型“简单”就是通过规则函数来实现的。

另外,规则项的使用还可以约束我们的模型的特性。这样就可以将人对这个模型的先验知识融入到模型的学习当中,强行地让学习到的模型具有人想要的特性,例如稀疏、低秩、平滑等等。


机器学习中应用L0范数是约束参数矩阵,期望参数矩阵的L0范数小,就是非零元素的个数少,这样矩阵就稀疏,影响因素就小;但是L0范数是非凸的,不能用多项式迭代求解,所以就是NPhard问题。既然L0可以实现稀疏,为什么不用L0,而要用L1呢?个人理解一是因为L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。

折中L0范数,用L1代替,L1也能刻画参数矩阵的稀疏性,尽管L1也是非凸的函数,但是L1不是NPhard问题,可以求解。

L2范数是凸函数,可以刻画相似度,预测值和标记值的距离问题,并且L2范数可以作为参数矩阵的正则化项,让参数矩阵尽可能平滑,避免过拟合。

为什么L2范数可以防止过拟合?回答这个问题之前,我们得先看看L2范数是个什么东西。

L2范数是指向量各元素的平方和然后求平方根。我们让L2范数的规则项||W||2最小,可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0,这里是有很大的区别的哦。而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。为什么越小的参数说明模型越简单?我也不懂,我的理解是:限制了参数很小,实际上就限制了多项式某些分量的影响很小(看上面线性回归的模型的那个拟合的图),这样就相当于减少参数个数。

这里也一句话总结下:通过L2范数,我们可以实现了对模型空间的限制,从而在一定程度上避免了过拟合。

L2范数的好处是什么呢?这里也扯上两点:

1)学习理论的角度:

从学习理论的角度来说,L2范数可以防止过拟合,提升模型的泛化能力。

2)优化计算的角度:

从优化或者数值计算的角度来说,L2范数有助于处理 condition number不好的情况下矩阵求逆很困难的问题。



2019-09-24 18:11:09 qq_16236875 阅读数 10
  • 机器学习数学基础之矩阵视频教学

    本课程囊括了机器学习理论中所需要的和线性代数相关的所有知识。帮助想入门机器学习的朋友们快速掌握数学基础。 主要内容: 1. 矩阵的定义、性质、运算、分解以及应用。 2. 线性空间、范数、生成子空间相关知识。

    11826 人正在学习 去看看 AI100讲师

1 L1和L2 正则化的区别

L1 是模型各个参数的绝对值之和,L2 为各个参数平方和的开方值,L1 更趋向于产生少量的特征,其他特征为0,最优的参数值很大概率出现在坐标轴上,从而导致产生稀疏的权重矩阵,而L2 会选择更多的矩阵,但是这些矩阵趋向于0

2 Loss Function 有哪些,怎么用?

平方损失(预测问题),交叉熵(分类问题),hinge 损失(SVM 支持向量机),CART 回归树的残差损失

3 线性回归的表达式,损失函数

线性回归y=wx+b,w和x 可能是多维的,线性回归的loss 函数为平方损失函数

一般会要求反向求导推导

 

2019-05-02 16:25:10 qq_36536126 阅读数 114
  • 机器学习数学基础之矩阵视频教学

    本课程囊括了机器学习理论中所需要的和线性代数相关的所有知识。帮助想入门机器学习的朋友们快速掌握数学基础。 主要内容: 1. 矩阵的定义、性质、运算、分解以及应用。 2. 线性空间、范数、生成子空间相关知识。

    11826 人正在学习 去看看 AI100讲师

改变变量k的值,修改函数handwritingClassTest随机选取训练样本,改变训练样本的数目,都会对k-近邻算法的错误率产生影响

import operator 
from numpy import *
from scipy import *
from matplotlib import *
"""
KNN近邻分类思路:
1,用shape[0]得到行数
2,把带划分数据用tile扩展成一个矩阵
3,(用该矩阵-训练数据)平方后开方得到一个列表
4,对列表按距离升序排列
5,选取前K个中标签出现次数后按降序排列,[0][0]即为出现最多的标签作为带预测的划分标签
"""
#inx为自己输入要分类的测试数,dataset为训练集,labels为标签集,k为kNN中的K值
#shape[0]得到训练样本多少行
#tile建立inx,dataSetSize行,1列
#sum(axis=1),按行相加
#argsort递增排序
def classify0(inX,dataSet,labels,k):
    dataSetSize=dataSet.shape[0]
    diffMat=tile(inX,(dataSetSize,1))-dataSet
    sqDiffMat=diffMat**2
    sqDistances=sqDiffMat.sum(axis=1)    #
    distances=sqDistances**0.5
    sortedDistIndicies=distances.argsort() #生成的不是距离而是标号列表 
    #print(sortedDistIndicies)
    classCount={}
    for i in range(k):
    #print(sortedDistIndicies[i])              
        voteIlabel=labels[sortedDistIndicies[i]]    
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1   #这一步是做相同标签的统计(+1),找到键voteIlabel对应的值,如果不存在这样的键则返回默认值0
       #print(classCount.get(voteIlabel,0))
    sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #sorted排序做升序,返回副本,原始输入不变,里面的参数设置请参考https://www.cnblogs.com/timtike/p/6562402.html,https://blog.csdn.net/hshl1214/article/details/40587985#print(sortedClassCount[0][0])                                                       #或者参考https://www.cnblogs.com/zhoufankui/p/6274172.html
    return sortedClassCount[0][0]
 
 
 
def img2vector(filename):
    returnVect=zeros((1,1024))
    fr=open(filename)
    for i in range(32):
        lineStr=fr.readline()
        for j in range(32):
            returnVect[0,32*i+j]=int(lineStr[j])
    return returnVect
 
 
  
from os import listdir
def handwritingClassTest():
    hwLabels=[]
    trainingFileList=listdir(r'C:\Users\Administrator\Desktop\DL\digits\trainingDigits')
    m=len(trainingFileList)
    trainingMat=zeros((m,1024))
    for i in range(m):
        fileNameStr=trainingFileList[i]
        fileStr=fileNameStr.split('.')[0]         #提取文件名
        classNumStr=int(fileStr.split('_')[0])               #提取文件名前面的数字
        hwLabels.append(classNumStr)
        trainingMat[i,:]=img2vector(r'C:\Users\Administrator\Desktop\DL\digits\trainingDigits/%s'%fileNameStr)  #/代表子文件夹
    testFileList=listdir(r'C:\Users\Administrator\Desktop\DL\digits\testDigits')
    errorCount=0.0
    mTest=len(testFileList)
    for i in range(mTest):
        fileNameStr=testFileList[i]
        fileStr=fileNameStr.split('.')[0]         #提取文件名
        classNumStr=int(fileStr.split('_')[0])               #提取文件名前面的数字
        vectorUnderTest=img2vector(r'C:\Users\Administrator\Desktop\DL\digits\testDigits/%s'%fileNameStr)  #/代表子文件夹
        classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
        print("the classifier come back with %d,the real result is %d"%(classifierResult,classNumStr))
        if(classifierResult!=classNumStr):errorCount+=1
    print('\n the total numer of errors is %d'%errorCount)
    print('\n the total error rate is %f'%(errorCount/float(mTest)))
 
 #可以选择显示一下
#handwritingClassTest()	



"""
字符预测函数思路:
1,输入特征值
2、建立特征值数组
3、归一化特征值
4、输入预测文档如:4_0.txt
5、返回预测值
"""
def classifyChrct():
    hwLabels=[]
    trainingFileList=listdir(r'C:\Users\Administrator\Desktop\DL\digits\trainingDigits')
    m=len(trainingFileList)
    trainingMat=zeros((m,1024))
    for i in range(m):
        fileNameStr=trainingFileList[i]
        fileStr=fileNameStr.split('.')[0]         #提取文件名
        classNumStr=int(fileStr.split('_')[0])               #提取文件名前面的数字
        hwLabels.append(classNumStr)
        trainingMat[i,:]=img2vector(r'C:\Users\Administrator\Desktop\DL\digits\trainingDigits/%s'%fileNameStr)  #/代表子文件夹
    inputDocument=input('Please input the document with .txt that you want forecast\n')
    vectorUnderTest=img2vector(r'C:\Users\Administrator\Desktop\DL\digits\testDigits/%s'%(inputDocument))
    classifierResult=classify0(vectorUnderTest,trainingMat,hwLabels,3)
    print("the classifier come back with %d"%(classifierResult))
    
 #预测看结果
classifyChrct()

文本文件链接:https://pan.baidu.com/s/1Lhxzz98EI2hdJBTDaz6sfg
提取码:od8y

2019-11-07 17:15:29 NEW_old_WEI 阅读数 41
  • 机器学习数学基础之矩阵视频教学

    本课程囊括了机器学习理论中所需要的和线性代数相关的所有知识。帮助想入门机器学习的朋友们快速掌握数学基础。 主要内容: 1. 矩阵的定义、性质、运算、分解以及应用。 2. 线性空间、范数、生成子空间相关知识。

    11826 人正在学习 去看看 AI100讲师

机器学习NO.3

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

L1正则和L2正则的区别:

1.L1是模型各个参数的绝对值之和。
2.L2是模型各个参数的平方和的开方值。
3.L1会趋向于产生少量特征,而其他的特征都是0,因为最优的参数值很大概率出现在坐标轴上,这样就会导致某一维的权重为0,产生稀疏权重矩阵
4.L2会选择更多的特征,这些特征都会接近于0.最优的参数值很小概率出现在坐标轴上,因此每一维的参数都不会是0.当最小化||w||时,就会是每一项趋近于0

学习曲线

如果有10000行数据,我们从1行数据开始,逐渐学习更多行的数据
方法:数据集大小为横轴,训练误差为纵轴,绘制训练曲线和验证集曲线
结果:当训练较少数据的时候,训练的模型将能够非常完美的适应较少的训练数据,那么训练数据的误差很小,但是训练出来的模型却不能很好适应交叉验证集数据或测试集数据,反应到学习曲线上的结果就i是验证集的误差较大。
随着数据集的增长,训练集的误差会增大,验证集的误差会减小,直至收敛

机器学习问题解决流程(初学者)

1.用少量数据金额简单模型跑出一个baseline
2.绘制学习曲线,检验是否有高偏差和高方差
3.根据学习曲线来决定下一步行动,更多的数据或者更多的特征
4.人工检查验证集中算法预测错误的实例,尝试找到其中的共性来着受优化
5.尝试其他模型

多项式回归Polynomial regressio

import numpy as np
import os
import matplotlib.pyplot as plt
#画图
%matplotlib inline

#随机种子
np.random.seed(42)

#保存图像
PROJECT_ROOT_DIR="."
lujing="第三天" 

def save_fig(fig_id,tight_layout=True):#定义一个保存图像的函数
    path = os.path.join(PROJECT_ROOT_DIR,"images",lujing,fig_id+".png")#指定保存图像路径 当前目录下的images文件夹下的qwertyuio文件夹
    print("Saving figure",fig_id)#提示函数,正在保存图片
    plt.savefig(path,format='png',dpi=300)#保存图片(需要指定保存路径,保存格式,清晰度)

#把讨厌的警告信息过滤掉
import warnings
warnings.filterwarnings(action="ignore",message="^internal gelsd")

m=100
X=6*np.random.rand(m,1)-3#创建数据集的特征部分
y=0.5*X**2+X+2+np.random.rand(m,1)#创建数据集的标签部分

plt.plot(X,y,"b.")#把数据点画出来
plt.xlabel("x_1",fontsize=18)
plt.ylabel("y",rotation=0,fontsize=18)
plt.axis([-3,3,0,10])
save_fig("一图")#保存图像
plt.show()

Saving figure 一图在这里插入图片描述

from sklearn.preprocessing import PolynomialFeatures#从预处理包中导出多项式特征处理模块
from sklearn.linear_model import LinearRegression#从线性模型里导入夏宁分类器

poly_features=PolynomialFeatures(degree=2,include_bias=False)#初始化多项式特征对象
X_poly = poly_features.fit_transform(X)#转化原始特征为多项式特征
poly_features

PolynomialFeatures(degree=2, include_bias=False, interaction_only=False,
order=‘C’)

lin_reg = LinearRegression()#初始化一个线性分类器
lin_reg.fit(X_poly,y)#分类器拟合多项特征
lin_reg.intercept_,lin_reg.coef_#获取参数

(array([2.49786712]), array([[0.9943591 , 0.49967213]]))

X_new = np.linspace(-3,3,100).reshape(100,1)
X_new_poly = poly_features.transform(X_new)
y_new=lin_reg.predict(X_new_poly)
plt.plot(X,y,"b.")
plt.plot(X_new,y_new,"r-",linewidth=2,label="Predictions")
plt.xlabel("x_1",fontsize=18)
plt.ylabel("y",rotation=0,fontsize=18)
plt.legend(loc="upper left",fontsize=14)
plt.axis([-3,3,0,10])
save_fig("二图")
plt.show()

Saving figure 二图
在这里插入图片描述

from sklearn.preprocessing import StandardScaler#从预览处理包里导入标准化处理模块
from sklearn.preprocessing import MinMaxScaler#从预览处理包中导入归一处理模块
from sklearn.pipeline import Pipeline#导入流水先处理模块

for style,width,degree in (("g-",1,300),("b--",2,2),("r-+",2,1)):#遍历三种画图方式
    polybig_features = PolynomialFeatures(degree=degree,include_bias=False)#初始化多项式特征对象
    std_scaler = StandardScaler()#数据标准化
    mm_scaler = MinMaxScaler()
    lin_reg = LinearRegression()#初始化线性分类器
    polynomial_regression = Pipeline([
        ("poly_features",polybig_features),#pipeline第一步 处理特征
        ("std_scaler",std_scaler),#标准化数据
        ("lin_reg",lin_reg),#初始化线性回归器
    ])
    polynomial_regression.fit(X,y)#训练模式
    y_newbig = polynomial_regression.predict(X_new)#预测数据
    plt.plot(X_new,y_newbig,style,label=str(degree),linewidth=width)#画拟合好的3个曲线中的一个
    
plt.plot(X,y,"b.",linewidth=3)#画原始数据点
plt.legend(loc="upper left")
plt.xlabel("x_1",fontsize=18)
plt.ylabel("y",rotation=0,fontsize=18)
plt.axis([-3,3,0,10])
save_fig("三图")
plt.show()

Saving figure 三图在这里插入图片描述

学习曲线

from sklearn.metrics import mean_squared_error#从度量包里导入均方误差的衡量标准
from sklearn.model_selection import train_test_split#从模型选择包里导入数据集切分模块

def plot_learning_curves(model,X,y):
    X_train,X_val,y_train,y_val = train_test_split(X,y,test_size=0.2,random_state=6)#切分数据集,训练集80%。验证集20%,指定随即种子
    train_errors=[]#收集训练误差
    val_errors=[]#收集验证误差
    for m in range(1,len(X_train)):#遍历训练集数据
        model.fit(X_train[:m],y_train[:m])#拟合数据
        y_train_predict = model.predict(X_train[:m])#预测训练集的值
        y_val_predict=model.predict(X_val)#预测验证集的值
        train_errors.append(mean_squared_error(y_train[:m],y_train_predict))#计算真实值和训练集预测值之间的均方误差并收集
        val_errors.append(mean_squared_error(y_val,y_val_predict))#计算真实值和验证集预测值之间的均方误差并收集
        
    plt.plot(np.sqrt(train_errors),"r-+",linewidth=2,label="train")
    plt.plot(np.sqrt(val_errors),"b-",linewidth=3,label="val")
    plt.legend(loc="upper right",fontsize=14)   #not shown i the book
    plt.xlabel("Training set size",fontsize=14) #not shown
    plt.ylabel("RMSE",fontsize=14)              #not shown

lin_reg = LinearRegression()#初始化线性回归器
plot_learning_curves(lin_reg,X,y)#调用函数
plt.axis([0,80,0,3])                           #not shown i the book
save_fig("四图")                               #not shown
plt.show()                                     #not shown

Saving figure 四图在这里插入图片描述

相关系数

阅读数 697

没有更多推荐了,返回首页