精华内容
下载资源
问答
  • matlab开发-偏最小二乘法判别分析法。使用PLS进行判别分析的教程和工具。
  • 由于之前偷懒,都是用PLS toolbox完成相关偏最小二乘法的数据分析工作,借此机会,就把PLS-DA的python实现好好唠唠。查过不少资料中,没有详细说调包sklearn实现的,废话不多说,进入正题。 sklearn中的最小二乘...

    PLS-DA的sklearn实例

    前两天收到了论文的拒稿意见,其中一条是“PLSDA的表示错误,应为PLS-DA”,好吧,以后都写PLS-DA!虚心接受专家意见。

    由于之前偷懒,都是用PLS toolbox完成相关偏最小二乘法的数据分析工作,借此机会,就把PLS-DA的python实现好好唠唠。查过不少资料中,没有详细说调包sklearn实现的,废话不多说,进入正题。

    sklearn中的偏最小二乘函数为PLSRegression(),这是一个回归函数,如果直接拿来做分类,显然得不到想要的结果。调用格式如下:

    from sklearn.cross_decomposition import PLSRegression
    model = PLSRegression()
    

    解决方法是:把标签矩阵(比如0,1,2,3,4的一个列向量)使用get_dummies()函数转换为类别矩阵,拿我的数据举例:

    import numpy as np 
    from sklearn.cross_decomposition import PLSRegression
    from sklearn.model_selection import train_test_split
    from sklearn.preprocessing import MinMaxScaler #归一化
    from sklearn.metrics import confusion_matrix,recall_score,classification_report,accuracy_score
    import pandas  as pd
    import matplotlib.pyplot as plt
    import seaborn  as sns
    from sklearn.model_selection import GridSearchCV
    import warnings
    from sklearn.model_selection import validation_curve
    from sklearn.model_selection import KFold
    #读取特征矩阵
    spec = pd.read_excel('correct_spec.xlsx')
    x = np.array(spec)
    #我这里的特征x形状: (939, 150)
    
    
    #做一个标签向量,标签y形状: (939,)
    y1 = np.zeros((189,1))
    y2 = 1*np.ones((188,1))
    y3 = 2*np.ones((185,1))
    y4 = 3*np.ones((188,1))
    y5 = 4*np.ones((189,1))
    y = np.vstack((y1,y2,y3,y4,y5))
    y = y.ravel()
    
    #先做一个数据集的划分
    train_X,test_X, train_y, test_y = train_test_split(x,  y, test_size=0.2)
    
    #然后对y进行转换
    train_y = pd.get_dummies(train_y)
    
    #建模
    model = PLSRegression(n_components=8)
    model.fit(train_X,train_y)
    
    #预测
    y_pred = model.predict(test_X)
    
    #将预测结果(类别矩阵)转换为数值标签
    y_pred = np.array([np.argmax(i) for i in y_pred])
    
    #模型评价
    print('测试集混淆矩阵为:\n',confusion_matrix(test_y,y_pred))
    print('平均分类准确率为:\n',accuracy_score(test_y,y_pred))
    

    接下里的问题就是函数中主成分数n_components的取值,如果直接使用网格搜索函数GridSearchCV()对n_components的值在一个范围内进行搜索,比如(1,20)一般情况下是行不通的,会发生过拟合,直接搜索到指定范围内的最大值。

    这时候想到的是使用validation_curve()函数绘制验证曲线,来选择这个超参数,但是依然会报错,原因大致是:这是一个回归函数,我们用它来做分类,y值不连续,所以我就要报错了,叭叭叭叭······ 即使按照上述方法事先转换y的类型,再调用validation_curve依然不行······

    所以这里只能自己写一个验证函数用来调参,选取原则就是训练集和验证集的得分最高时候对应的主成分数,且验证集的得分不能高于训练集。

    def accuracy_component(xc,xv,yc,yv,component,n_fold):
        k_range = np.linspace(1, component,component)
    
        
        kf=KFold(n_splits=n_fold,random_state=None, shuffle=True)
        accuracy_validation=np.zeros((1,component))
        accuracy_train=np.zeros((1,component))
        for j in range(component):
            p=0
            acc=0
            model_pls=PLSRegression(n_components=j+1)
            model_pls.fit(xc,yc_labels)
            y_pred = model_pls.predict(xv)
            y_pred = np.array([np.argmax(i) for i in y_pred]) 
            accuracy_train[:,j]=accuracy_score(yv,y_pred)
            for train_index, test_index in kf.split(xc):
                X_train, X_test = xc[train_index], xc[test_index]
                y_train, y_test = yc[train_index], yc[test_index]
                
                YC_labels = pd.get_dummies(y_train)
                YV_labels=pd.get_dummies(y_test)
                model_1=PLSRegression(n_components=j+1)
                model_1.fit(X_train,YC_labels)
                Y_pred = model_1.predict(X_test)
                Y_pred = np.array([np.argmax(i1) for i1 in Y_pred]) 
                acc=accuracy_score(y_test,Y_pred)+acc
                p=p+1
            accuracy_validation[:,j]=acc/p
        print(accuracy_validation)
        plt.plot(k_range, accuracy_validation.T, 'o-',label="Training",color="r")
        plt.plot(k_range, accuracy_train.T, 'o-',label="Cross-validation",color="b")
        plt.xlabel("N components")
        plt.ylabel("Score")
        plt.legend(loc="best")
        plt.rc('font',family='Times New Roman')
        plt.rcParams['font.size'] = 10
        plt.show()
        return accuracy_validation,accuracy_train
    

    得到最佳主成分n_components,重复上述过程,对模型进行训练即可,于是直接调包又香了

    展开全文
  • 1.统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行分析与预测的一门学科。统计学习包括监督学习、非监督学习、半监督学习和强化学习。 2.统计学习方法三要素——模型、策略、算法,对理解统计...

    统计学习方法

    1.统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行分析与预测的一门学科。统计学习包括监督学习、非监督学习、半监督学习和强化学习。
    2.统计学习方法三要素——模型、策略、算法,对理解统计学习方法起到提纲挈领的作用。
    3.本书主要讨论监督学习,监督学习可以概括如下:从给定有限的训练数据出发, 假设数据是独立同分布的,而且假设模型属于某个假设空间,应用某一评价准则,从假设空间中选取一个最优的模型,使它对已给训练数据及未知测试数据在给定评价标准意义下有最准确的预测。
    4.统计学习中,进行模型选择或者说提高学习的泛化能力是一个重要问题。如果只考虑减少训练误差,就可能产生过拟合现象。模型选择的方法有正则化与交叉验证。学习方法泛化能力的分析是统计学习理论研究的重要课题。
    5.分类问题、标注问题和回归问题都是监督学习的重要问题。本书中介绍的统计学习方法包括感知机、近邻法、朴素贝叶斯法、决策树、逻辑斯谛回归与最大熵模型、支持向量机、提升方法、EM算法、隐马尔可夫模型和条件随机场。这些方法是主要的分类、标注以及回归方法。它们又可以归类为生成方法与判别方法。

    最小二乘法拟合曲线

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-la7a6TQ4-1597652222270)(https://i.loli.net/2020/08/17/v1IUALXxqg4PeBp.png)]
    
    import numpy as np
    import scip
    展开全文
  • LDA 线性判别分析(二)

    千次阅读 2016-01-07 19:15:19
    4. 实例  将3维空间上的球体样本点投影到二维上,W1相比W2能够获得更好的分离效果。   ... LDA既然叫做线性判别分析,应该具有一定的预测功能,比如新来一个样例x,如何确定其类别?  
    4. 实例

          将3维空间上的球体样本点投影到二维上,W1相比W2能够获得更好的分离效果。

          clip_image002

          PCA与LDA的降维对比:

          clip_image004

          PCA选择样本点投影具有最大方差的方向,LDA选择分类性能最好的方向。

          LDA既然叫做线性判别分析,应该具有一定的预测功能,比如新来一个样例x,如何确定其类别?

          拿二值分来来说,我们可以将其投影到直线上,得到y,然后看看y是否在超过某个阈值y0,超过是某一类,否则是另一类。而怎么寻找这个y0呢?

          看

          clip_image006

          根据中心极限定理,独立同分布的随机变量和符合高斯分布,然后利用极大似然估计求

          clip_image008

          然后用决策理论里的公式来寻找最佳的y0,详情请参阅PRML。

          这是一种可行但比较繁琐的选取方法,可以看第7节(一些问题)来得到简单的答案。

    5. 使用LDA的一些限制

          1、 LDA至多可生成C-1维子空间

          LDA降维后的维度区间在[1,C-1],与原始特征数n无关,对于二值分类,最多投影到1维。

          2、 LDA不适合对非高斯分布样本进行降维。

          clip_image010

          上图中红色区域表示一类样本,蓝色区域表示另一类,由于是2类,所以最多投影到1维上。不管在直线上怎么投影,都难使红色点和蓝色点内部凝聚,类间分离。

          3、 LDA在样本分类信息依赖方差而不是均值时,效果不好。

          clip_image011

          上图中,样本点依靠方差信息进行分类,而不是均值信息。LDA不能够进行有效分类,因为LDA过度依靠均值信息。

          4、 LDA可能过度拟合数据。

    6. LDA的一些变种

    1、 非参数LDA

          非参数LDA使用本地信息和K临近样本点来计算clip_image013,使得clip_image013[1]是全秩的,这样我们可以抽取多余C-1个特征向量。而且投影后分离效果更好。

    2、 正交LDA

          先找到最佳的特征向量,然后找与这个特征向量正交且最大化fisher条件的向量。这种方法也能摆脱C-1的限制。

    3、 一般化LDA

          引入了贝叶斯风险等理论

    4、 核函数LDA

          将特征clip_image015,使用核函数来计算。

    7. 一些问题

          上面在多值分类中使用的

          clip_image017

          是带权重的各类样本中心到全样本中心的散列矩阵。如果C=2(也就是二值分类时)套用这个公式,不能够得出在二值分类中使用的clip_image013[2]

          clip_image019

          因此二值分类和多值分类时求得的clip_image013[3]会不同,而clip_image021意义是一致的。

          对于二值分类问题,令人惊奇的是最小二乘法和Fisher线性判别分析是一致的。

          下面我们证明这个结论,并且给出第4节提出的y0值得选取问题。

          回顾之前的线性回归,给定N个d维特征的训练样例clip_image023(i从1到N),每个clip_image025对应一个类标签clip_image027。我们之前令y=0表示一类,y=1表示另一类,现在我们为了证明最小二乘法和LDA的关系,我们需要做一些改变

          clip_image029

          就是将0/1做了值替换。

          我们列出最小二乘法公式

          clip_image031

          w和clip_image033是拟合权重参数。

          分别对clip_image033[1]和w求导得

          clip_image035

          clip_image037

          从第一个式子展开可以得到

          clip_image039

          消元后,得

          clip_image041

          clip_image043

          可以证明第二个式子展开后和下面的公式等价

          clip_image045

          其中clip_image047clip_image049与二值分类中的公式一样。

          由于clip_image051

          因此,最后结果仍然是

          clip_image053

          这个过程从几何意义上去理解也就是变形后的线性回归(将类标签重新定义),线性回归后的直线方向就是二值分类中LDA求得的直线方向w。

          好了,我们从改变后的y的定义可以看出y>0属于类clip_image055,y<0属于类clip_image057。因此我们可以选取y0=0,即如果clip_image059,就是类clip_image055[1],否则是类clip_image057[1]

          写了好多,挺杂的,还有个topic模型也叫做LDA,不过名字叫做Latent Dirichlet Allocation,第二作者就是Andrew Ng大牛,最后一个他导师Jordan泰斗了,什么时候拜读后再写篇总结发上来吧。

    展开全文
  • 线性判别分析(2)

    2016-10-31 22:00:19
    原文地址... ...4. 实例  将3维空间上的球体样本点投影到二维上,W1相比W2能够获得更好的分离效果。    PCA与LDA的降维对比:    PCA选择样本点投影具

    原文地址http://www.cnblogs.com/jerrylead/archive/2011/04/21/2024389.html



    4. 实例

          将3维空间上的球体样本点投影到二维上,W1相比W2能够获得更好的分离效果。

          clip_image002

          PCA与LDA的降维对比:

          clip_image004

          PCA选择样本点投影具有最大方差的方向,LDA选择分类性能最好的方向。

          LDA既然叫做线性判别分析,应该具有一定的预测功能,比如新来一个样例x,如何确定其类别?

          拿二值分来来说,我们可以将其投影到直线上,得到y,然后看看y是否在超过某个阈值y0,超过是某一类,否则是另一类。而怎么寻找这个y0呢?

          看

          clip_image006

          根据中心极限定理,独立同分布的随机变量和符合高斯分布,然后利用极大似然估计求

          clip_image008

          然后用决策理论里的公式来寻找最佳的y0,详情请参阅PRML。

          这是一种可行但比较繁琐的选取方法,可以看第7节(一些问题)来得到简单的答案。

    5. 使用LDA的一些限制

          1、 LDA至多可生成C-1维子空间

          LDA降维后的维度区间在[1,C-1],与原始特征数n无关,对于二值分类,最多投影到1维。

          2、 LDA不适合对非高斯分布样本进行降维。

          clip_image010

          上图中红色区域表示一类样本,蓝色区域表示另一类,由于是2类,所以最多投影到1维上。不管在直线上怎么投影,都难使红色点和蓝色点内部凝聚,类间分离。

          3、 LDA在样本分类信息依赖方差而不是均值时,效果不好。

          clip_image011

          上图中,样本点依靠方差信息进行分类,而不是均值信息。LDA不能够进行有效分类,因为LDA过度依靠均值信息。

          4、 LDA可能过度拟合数据。

    6. LDA的一些变种

    1、 非参数LDA

          非参数LDA使用本地信息和K临近样本点来计算clip_image013,使得clip_image013[1]是全秩的,这样我们可以抽取多余C-1个特征向量。而且投影后分离效果更好。

    2、 正交LDA

          先找到最佳的特征向量,然后找与这个特征向量正交且最大化fisher条件的向量。这种方法也能摆脱C-1的限制。

    3、 一般化LDA

          引入了贝叶斯风险等理论

    4、 核函数LDA

          将特征clip_image015,使用核函数来计算。

    7. 一些问题

          上面在多值分类中使用的

          clip_image017

          是带权重的各类样本中心到全样本中心的散列矩阵。如果C=2(也就是二值分类时)套用这个公式,不能够得出在二值分类中使用的clip_image013[2]

          clip_image019

          因此二值分类和多值分类时求得的clip_image013[3]会不同,而clip_image021意义是一致的。

          对于二值分类问题,令人惊奇的是最小二乘法和Fisher线性判别分析是一致的。

          下面我们证明这个结论,并且给出第4节提出的y0值得选取问题。

          回顾之前的线性回归,给定N个d维特征的训练样例clip_image023(i从1到N),每个clip_image025对应一个类标签clip_image027。我们之前令y=0表示一类,y=1表示另一类,现在我们为了证明最小二乘法和LDA的关系,我们需要做一些改变

          clip_image029

          就是将0/1做了值替换。

          我们列出最小二乘法公式

          clip_image031

          w和clip_image033是拟合权重参数。

          分别对clip_image033[1]和w求导得

          clip_image035

          clip_image037

          从第一个式子展开可以得到

          clip_image039

          消元后,得

          clip_image041

          clip_image043

          可以证明第二个式子展开后和下面的公式等价

          clip_image045

          其中clip_image047clip_image049与二值分类中的公式一样。

          由于clip_image051

          因此,最后结果仍然是

          clip_image053

          这个过程从几何意义上去理解也就是变形后的线性回归(将类标签重新定义),线性回归后的直线方向就是二值分类中LDA求得的直线方向w。

          好了,我们从改变后的y的定义可以看出y>0属于类clip_image055,y<0属于类clip_image057。因此我们可以选取y0=0,即如果clip_image059,就是类clip_image055[1],否则是类clip_image057[1]


    展开全文
  • 文章目录算法框架LRU统计学习方法最小二乘法拟合曲线感知器KNearestNeighbors KNN朴素贝叶斯决策树逻辑回归提升方法BoostAdaboostEM(Expectation ...algorithm)算法及其推广HMM条件随机场奇异分解主成分分析PageRank算法...
  • 线性判别分析 LDA

    千次阅读 2016-06-20 14:59:10
    Linear Discriminant Analysis 线性判别分析 LDA
  •  至此,我们只需要求出原始样本的均值和方差就可以求出最佳的方向w,这就是Fisher于1936年提出的线性判别分析。  看上面二维样本的投影结果图:   3. 线性判别分析(多类情况)  前面是...
  • 线性判别分析算法(LDA)

    千次阅读 2013-07-26 17:55:30
     至此,我们只需要求出原始样本的均值和方差就可以求出最佳的方向w,这就是Fisher于1936年提出的线性判别分析。  看上面二维样本的投影结果图:   3. 线性判别分析(多类情况)  前面是...
  • 4. 实例 将3维空间上的球体样本点投影到二维上,W1相比W2能够获得更好的分离效果。 PCA与LDA的降维对比: PCA选择样本点投影
  • 线性判别分析

    2014-07-03 15:33:57
     至此,我们只需要求出原始样本的均值和方差就可以求出最佳的方向w,这就是Fisher于1936年提出的线性判别分析。  看上面二维样本的投影结果图:   3. 线性判别分析(多类情况)  前面是...
  • LDA线性判别分析

    2017-10-03 15:00:20
     至此,我们只需要求出原始样本的均值和方差就可以求出最佳的方向w,这就是Fisher于1936年提出的线性判别分析。  看上面二维样本的投影结果图:   3. 线性判别分析(多类情况)  前面是...
  • 线性判别分析LDA

    2017-07-14 00:03:09
     至此,我们只需要求出原始样本的均值和方差就可以求出最佳的方向w,这就是Fisher于1936年提出的线性判别分析。  看上面二维样本的投影结果图:   3. 线性判别分析(多类情况)  前面是...
  • 线性判别分析(LDA)
  • 线性判别分析(二)

    2018-10-22 20:42:10
    转自:... (Linear Discriminant Analysis)(二) 4. 实例  将3维空间上的球体样本点投影到二维上,W1相比W2能够获得更好的分离效果。    PCA与LDA的降维对比:    ...
  • 线性判别分析(Linear Discriminant Analysis)(二) 4. 实例 将3维空间上的球体样本点投影到二维上,W1相比W2能够获得更好的分离效果。 PCA与LDA的降维对比: PCA选择样本点投影具有最大方差的方向...
  • 对于二分类模型,本文介绍逻辑回归和Fisher线性判别分析两种分类算法;对于多分类模型,我们将简单介绍Spss中的多分类线性判别分析和多分类逻辑回归的操作步骤 利用spass软件对数据进行预处理:生成虚拟变量 1.生成...
  • 线性判别分析(一)

    千次阅读 2013-11-12 20:29:44
     至此,我们只需要求出原始样本的均值和方差就可以求出最佳的方向w,这就是Fisher于1936年提出的线性判别分析。  看上面二维样本的投影结果图:   3. 线性判别分析(多类情况)  前面是针对只有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,140
精华内容 856
关键字:

偏最小二乘法判别分析实例