python3 偏最小二乘法实现

python3的sklearn库中有偏最小二乘法。

可以参见下面的库说明:http://scikit-learn.org/stable/modules/generated/sklearn.cross_decomposition.PLSRegression.html

程序来源:来源:https://blog.csdn.net/li_huifei/article/details/78467689 经过修改可以在python3上运行

我的数据A.csv

我的数据RON.csv

# -*- coding: utf-8 -*-

#看来这个程序适合的是python2版本的。来源:https://blog.csdn.net/li_huifei/article/details/78467689
#这个目前也可以用了,主要还是在第60行的数据转换,,,不太清楚怎样去做装换。主要是因为数据类型不清楚,所以用了最笨的方法,不知道结果正不正确。????【这个是错误的】
#PLSR3经过摸索,第68行,还是因为数据结构类型不对,之后把array类型的数组转换成了list,,,这样方便在外面套一个[],,之后运行没有问题,但是结果的正确与否,还有待验证。

#导入库的部分
import csv
from sklearn import preprocessing
from sklearn.cross_validation import train_test_split
from sklearn.decomposition import RandomizedPCA
from sklearn.cross_decomposition import PLSRegression   #偏最小二乘法的实现,  在这里是可以跳进 PLSRegression 里面的
import numpy as np
import math
import matplotlib.pyplot as plt

#导入数据的部分
A = np.loadtxt(‘A.csv‘,delimiter=‘,‘)                   #读入数据   这里的A就是y的矩阵   #读了这么多的数据???哪个是x,,哪个又是y呢???
print (A.shape)

RON = np.loadtxt(‘RON.csv‘,delimiter=‘,‘)               #这里的RON就是x的矩阵
print (RON.shape)

#暂且在这里设置全局变量吧。
x_train_st_i=[]

#定义全局函数的部分。
def error(y_predict,y_test):                            #定义计算误差平方和函数,,,传入的是估算出的值,和测试值,,这里仅仅是用来定义的,方便后面的调用。
    errs = []
    for i in range(len(y_predict)):
        e = (y_predict[i]-y_test[i])**2
        errs.append(e)
    return sum(errs)

#偏最小二乘法的实现部分。
x_train, x_test, y_train, y_test = train_test_split(RON,A,test_size=0.5)       #划分训练集测试集,,,这个是一个库函数?? ,,,,这里能够看出是A和RON进行建模的。
x_train_st = preprocessing.scale(x_train)                                      #数据标准化,这个是内置函数
y_train_st = preprocessing.scale(y_train)                                      #数据标准化,,这一句是我仿照上面的一句改写的。
n_components = 0                                                               #这个应该是保存主成分的个数。

while n_components<x_train_st.shape[1]:
    n_components=n_components+1                                                #在第一遍的时候n_components是1,第二遍循环的时候是2,,,第n遍循环是n,,最大是x的列数,也就是特征的个数,
    pls2 = PLSRegression(n_components=n_components)                            #计算SS (SS这个是全建模 , PRESS是减去一个进行建模,,,,在python里建模很简单,设置好参数,调用一下函数就能建模了)
                                                                               #这个不是偏最小二乘法吗???,,这里是循环计算主成分的个数,直到达到满意的精度。
    pls2.fit(x_train_st, y_train)                                              #fit也是一个函数,,,两个参数,第一个参数是训练集,第二个参数是目标。
    y_predict0 = pls2.predict(x_train_st)                                      #predict也是一个内置的函数,,,,这个是不是用建好的模型去做预测,,,,把参数训练集输入进去,得到的是预测的值。
    SS = error(y_predict0,y_train)                                             #这里是预测的值和真正的值之间的误差大小。
    y_predict1 = []                                                            #这是创建了一个新的变量。根据名字的意思,根据模型得到的y的预测值,实际上这个模型是留一法建立的模型。
    for i in range(x_train_st.shape[0]):                                       #计算PRESS,,,,这个是x_train_st的行数
        n_components1 = n_components                                           #但是我不明白,为什么这里还要加1,主成分不可能是0个吧,所以就从1开始了。
        x_train_st1 = np.delete(x_train_st,i,0)                                #这里的0是行,1是列,,这个应该是删除第i行,,,这里是标准化的数组。留一法的实现
        y_train_st1 = np.delete(y_train,i,0)                                   #这个也是删除第i行,这里都是经过标准化的(但这个x是经过标准化的,y却没有用标准化的数据)。,,这个没有用到过,是不是这里写错了??
        pls2 = PLSRegression(n_components=n_components1)                       #偏最小二乘法参数的设置,,,这里面一般有5个参数,,但这里只传入了主成分的个数。
        #参数1:n_components:int ,(default 2) ,,要保留的主成分数量,默认为2
        #参数2:scale:boolean,(default True),,是否归一化数据,默认为是
        #参数3:max_iter: an integer,(default 500),,使用NIPALS时的最大迭代次数
        #参数4:tol: non-negative real(default 1e-06),,迭代截止条件
        #参数5:copy: Boolean,(default True),,
        pls2.fit(x_train_st1, y_train_st1)                                     #这里是根据前面设置好的参数建模过程,这里的建模过程是不是不太对(这里x是归一化的,y并没有用归一化的),应该都是用归一化的才行呀。???

        #这里主要是进行了数据格式的转换,因为做预测要传进的是矩阵【格式很重要】
        x_train_st_i=[]                                                        #用之前要进行清空,这个很重要。用一个参数之前要进行清空。
        x_train_st_list=x_train_st[i].tolist()
        x_train_st_i.append(x_train_st_list)

        print (‘the x_train_st is ‘,x_train_st_i)                              #输出一下变量,查看格式是否正确,因为下面的predict函数需要用[[1,1,1,1,1,1]] 这种格式的数据

        y_predict11 = pls2.predict(x_train_st_i)                               #预测函数,给定之前留一法没有用到的样本,进行建模,预测对应的y值。????可是已经删除了不是吗???           ZHE这句出了一点问题????就是数据格式有问题,需要在最外面在加一个[]

        y_predict1.append(y_predict11)                                         #把所有的y值组成一个数组,便于计算误差。,这个也是y的预测值,用它来算出另一个误差。
    PRESS = error(y_predict1,y_train)                                          #可能错误:https://blog.csdn.net/little_bobo/article/details/78861578
    Qh = 1-float(PRESS/SS)
    if Qh<0.0985:                                                              #判断精度                           模型达到精度要求,可以停止主成分的提取了。
        plt.figure(1)
        plt.scatter(y_predict0,y_train)                                        #画了一个图,这个图是预测值,与测量值的图???
        plt.figure(2)
        plt.scatter(y_predict1,y_train)
        print (‘the Qh is ‘,Qh)
        print (‘the PRESS is‘,PRESS)
        print (‘the SS is‘,SS)
        break                                                                  #达到了上面的精度,就可以停止while的迭代了

                                                                               #这下面就没有看懂了。

print (‘n_components is ‘,n_components+1)                                      #这里为什么要加1???,,,难道因为计数是从0开始的??
SECs = []
errors = []
e = 100
for i in range(10):                                                            #循环测试
    #print i
    x_train, x_test, y_train, y_test = train_test_split( RON,A, test_size=0.5)  #划分训练集与测试集,这个是一个内置的函数。
    x_test_st = preprocessing.scale(x_test)                                     #数据标准化
    y_predict = pls2.predict(x_test_st)                                         #进行预测
    SECs.append(np.sqrt(error(y_predict,y_test)/(y_test.shape[0]-1)))
    errors.append(float(error(y_predict,y_test)))
    if SECs[-1]<e:
        y_predict_min = y_predict
        y_test_min = y_test

print (‘the prediced value is ‘ ,y_predict.T)                                    #画图,打印结果
print (‘the true value is‘,y_test)
print (‘the mean error is‘,float(np.mean(errors)))
print ("the mean SEC is ",float(np.mean(SECs)))

plt.figure(3)
plt.scatter(y_predict_min,y_test_min)

摘自:

原文地址:https://www.cnblogs.com/chulin/p/9522845.html

时间: 2024-10-29 19:29:14

python3 偏最小二乘法实现的相关文章

Partial least squares regression(偏最小二乘法回归)

偏最小二乘法(PLS)是近年来发展起来的一种新的多元统计分析 http://en.wikipedia.org/wiki/Partial_least_squares_regression Partial least squares regression(偏最小二乘法回归),布布扣,bubuko.com

【转载】偏最小二乘法回归(Partial Least Squares Regression)

偏最小二乘法回归(Partial Least Squares Regression) [pdf版本]偏最小二乘法回归.pdf 1. 问题 这节我们请出最后的有关成分分析和回归的神器PLSR.PLSR感觉已经把成分分析和回归发挥到极致了,下面主要介绍其思想而非完整的教程.让我们回顾一下最早的Linear Regression的缺点:如果样例数m相比特征数n少(m<n)或者特征间线性相关时,由于(n*n矩阵)的秩小于特征个数(即不可逆).因此最小二乘法就会失效. 为了解决这个问题,我们会使用PCA对

统计学的领域

统计学的领域 作者注:本文是为中国人民大学统计学院本科院刊所写的稿件.走过了四年本科,觉得应该对后来人讲一些负责任的话,以使大家能更高效地学习.我认为人生的奋斗,怕的不是没有动力,而是有动力却不知道方向.因此,我把我所了解的统计学的领域介绍给大家,让大家早日了解一下统计学的基本内容,早日找到自己的方向.当然,仅仅四年的学习,得出的观点或多或少会浅薄,所以也请各位大师多多指点批评. 如果学了几年统计,还连统计的那个经典定义都背不出就不应该了,在此我不再啰嗦一遍.统计学也不是什么神秘的学科,它的目的

机器学习的常用算法 --- 2016/7/19

机器学习是数据分析师高级进阶的一个核心技能.分享关于机器学习的文章,没有算法,没有代码,只是能够快速的了解机器学习! -------------------------------------------------------------------------------------------------------------------------------------------------- 在了解了需要解决的机器学习问题的类型之后,可以开始考虑搜集来的数据的类型以及可以尝试的机

最小二乘即曲线拟合的详细公式推导

(1)前言 (2)最小二乘的推导 (3)最小二乘求解线性 (4)曲线拟合的应用 ------------------qq:1327706646 -------------------------author:midu --------------------------------datetime:2014-12-10 17:48:00 (1)前言 关于最小二乘的应用,最早在高斯时代就被天才高斯用来求解,偏离轨道的行星,在别人还在用望远镜寻找的时候,高斯又是神奇般的轻而易举的算出了偏离轨道的行星

NMath Stats 统计计算和生物统计学算法库使用方法及下载地址

NMath Stats提供了统计计算和生物统计学领域的处理功能,包括描述统计.概率分布.组合功能.多重线型回归.假设检验.方差分析计算和多元统计. 具体功能: 提供了一个数据架构类来保证多种不同的数据类型(数值型.字符串型.时间数据型和通配符型),并提供了多种操作方法设置.插入.移除.排序和改变行和列 提供了描述统计的功能,包括求平均值.求方差.求标准差.求百分率.求中值.求四分点值.求几何平均数.求调和平均值.求均方根值.求峰值.求偏斜度等 提供了专门的处理功能,比如阶乘.对数阶乘.二项式系数

典型关联分析(CCA)原理总结

典型关联分析(Canonical Correlation Analysis,以下简称CCA)是最常用的挖掘数据关联关系的算法之一.比如我们拿到两组数据,第一组是人身高和体重的数据,第二组是对应的跑步能力和跳远能力的数据.那么我们能不能说这两组数据是相关的呢?CCA可以帮助我们分析这个问题. 1. CCA概述 在数理统计里面,我们都知道相关系数这个概念.假设有两组一维的数据集X和Y,则相关系数ρρ的定义为: ρ(X,Y)=cov(X,Y)D(X)?????√D(Y)?????√ρ(X,Y)=cov

准备学习的目录

初识机器学习算法有哪些? 机器学习无疑是现在数据分析领域的一个重要内容,凡事从事IT工作领域的人都在平时的工作中或多或少的会用到机器学习的算法. 机器学习有很多算法,不过大的方面可分为两类:一个是学习的方式,一个是算法的类似性. 学习方式: 根据数据类型的不同,对一个问题的建模有不同的方式.在机器学习或者人工智能领域,人们首先会考虑算法的学习方式.在机器学习领域,有几种主要的学习方式.将算法按照学习方式分类是一个不错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最合适的算法

机器学习算法之旅【翻译】【转】

在我们了解了需要解决的机器学习问题的类型之后,我们可以开始考虑搜集来的数据的类型以及我们可以尝试的机器学习算法.在这个帖子里,我们会介绍一遍最流行的机器学习算法.通过浏览主要的算法来大致了解可以利用的方法是很有帮助的. 可利用的算法非常之多.困难之处在于既有不同种类的方法,也有对这些方法的扩展.这导致很快就难以区分到底什么才是正统的算法.在这个帖子里,我希望给你两种方式来思考和区分在这个领域中你将会遇到的算法. 第一种划分算法的方式是根据学习的方式,第二种则是基于形式和功能的相似性(就像把相似的