说明:本文不讲解PLS算法,需要对该算法有一定基础,只提供python代码,包含计算过程、可视化画图、多元高次优化、评价函数。调用方法和参数请见代码最后注释。PLS 网上并没有找到严格的多元高次线性回归的证明, 但经过测试我验证了代码的可用性,一定情况下高次(即可包含如x*x的项)拟合更加高,但很多时候并不是如此,只是提供一种优化的可能,只需要改 polynomial 参数即可。该代码基本已是完整代码,只有 def Polynomial(self): 高次计算函数代码有缺陷,如有更好想法可以一起改进。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from sklearn import preprocessing
from numpy.matlib import repmat
import csv
from math import ceilclass Linear:def __init__(self, dependent, document, polynomial=1):self.dependent = dependentself.document = documentself.polynomial = polynomialself.openfile()self.n = len(self.df.columns) - self.dependentself.Polynomial()x0, y0, num, xishu, ch0, xish, sol = self.find()self.save(sol=sol)self.PLOT(ch0=ch0, num=num, x0=x0, y0=y0, xishu=xishu, xish=xish)def openfile(self):file_type = self.document.split(".")[-1]if file_type == "csv":self.df = pd.read_csv(self.document, encoding='GBK')elif file_type == "xlsx" or file_type == "xls":self.df = pd.read_excel(self.document)else:exit("Unknown file type")def Polynomial(self):if self.polynomial != 1:temp = self.df.iloc[:, -self.dependent:]self.df.drop(self.df.columns[-self.dependent:], axis=1, inplace=True)count = self.ncount_begin = 0for i in range(1, self.polynomial):count_end = countfor k in range(self.n):for j in range(count_begin, count_end):name = "x" + str(k + 1) + str(j + 1) if i == 1 else "x" + str(k + 1) + self.df.columns[j][1:]count += 1self.df[name] = self.df.iloc[:, j].mul(self.df.iloc[:, k])count_begin = count_endfor i in range(len(temp.columns)):self.df[temp.columns[i]] = temp.iloc[:, i]self.df.to_csv("changed.csv", encoding='GBK')def find(self):df = self.dfdf_matrix = np.array(df)mu = np.mean(df_matrix, axis=0)sig = np.std(df_matrix, axis=0)rr = df.corr()rr.to_csv("相关系数矩阵.csv", encoding='GBK')data = preprocessing.scale(df_matrix)m = self.dependentn = len(df.columns) - mself.n = nx0 = df_matrix[:, :n]y0 = df_matrix[:, n:]e0 = data[:, :n]f0 = data[:, n:]num = len(df.iloc[:, 0])chg = np.identity(n)w = np.zeros([n, n])w_star = np.zeros([n, n])t = np.zeros([num, n])ss = []Q_h2 = []press_i = [0 for i in range(num)]press = [0 for i in range(n)]flag = 0for i in range(n):matrix = e0.T @ f0 @ f0.T @ e0[val, vec] = np.linalg.eig(matrix)val = val.argsort()w[:, i] = vec[:, val[len(val) - 1]]w_star[:, i] = chg @ w[:, i]t[:, i] = e0 @ w[:, i]alpha = [e0.T @ t[:, i] / (t[:, i].T @ t[:, i])]chg = chg @ (np.identity(n) - w[:, i:i + 1] @ alpha)e0 = e0 - t[:, i:i + 1] @ alphabeta = np.linalg.pinv(np.c_[t[:, :i + 1], np.ones(num)]) @ f0beta = np.delete(beta, (-1), axis=0)cancha = f0 - t[:, :i + 1] @ betacancha = np.array([[cancha[i][j] ** 2 for j in range(len(cancha[i]))] for i in range(len(cancha))])ss.append(cancha.sum())for j in range(num):t1 = t[:, :i + 1]f1 = f0she_t = t1[j:j + 1, :]she_f = f1[j:j + 1, :]t1 = np.delete(t1, j, axis=0)f1 = np.delete(f1, j, axis=0)beta1 = np.linalg.pinv(np.c_[t1, np.ones(num - 1)]) @ f1beta1 = np.delete(beta1, (-1), axis=0)cancha = she_f - she_t @ beta1cancha = np.array([[cancha[i][j] ** 2 for j in range(len(cancha[i]))] for i in range(len(cancha))])press_i[j] = cancha.sum()press[i] = np.array(press_i).sum()if i > 0:Q_h2.append(1 - press[i] / ss[i - 1])# print('Q_h2[{}] = {}'.format(i, (1 - press[i] / ss[i - 1])))else:Q_h2.append(1)if Q_h2[i] < 0.0975:# print('Number of components proposedr = %d' % (i + 1))# print("Q_h2 = {}".format(Q_h2[-1]))r = iflag = 1breakif not flag:exit("Can't find")beta_z = np.linalg.pinv(np.c_[t[:, :r + 1], np.ones(num)]) @ f0beta_z = np.delete(beta_z, (-1), axis=0)xishu = w_star[:, :r + 1] @ beta_zmu_x = mu[:n]mu_y = mu[n:]sig_x = sig[:n]sig_y = sig[n:]ch0 = []for i in range(m):ch0.append(float(mu_y[i] - np.true_divide(mu_x, sig_x) * sig_y[i] @ xishu[:, i:i + 1]))xish = np.zeros([n, m])for i in range(m):xish[:, i] = np.true_divide(xishu[:, i], sig_x.T) * sig_y[i]sol = np.r_[np.array([ch0]), xish]# 防止报错 nan_2_0# x0, y0, num, xishu, ch0, xish, sol = map(lambda x: np.nan_to_num(x), [x0, y0, num, xishu, ch0, xish, sol])return x0, y0, num, xishu, ch0, xish, soldef PLOT(self, ch0, num, x0, y0, xishu, xish):plt.rcParams['font.sans-serif'] = ['SimHei']  # 用黑体显示中文plt.rcParams['axes.unicode_minus'] = Falsech0 = repmat(ch0, num, 1)y_hat = ch0 + x0 @ xishy1max = y_hat.max(axis=0)y2max = y0.max(axis=0)ymax = np.r_[np.array([y1max]), np.array([y2max])].max(axis=0)for i in range(self.dependent):print("y{}: R^2 score = {}".format(i + 1, R2_func(y_hat[:, i], self.df.iloc[:, -self.dependent + i])))plt.subplot(self.dependent, 2, i * 2 + 1)x = [-1, ceil(ymax[i])]plt.plot(x, x, '-')plt.plot(y_hat[:, i], y0[:, i], '*')plt.title("y{}".format(i + 1))plt.subplot(self.dependent, 2, i * 2 + 2)x = np.arange(self.n)plt.bar(x, height=xishu[:, i].reshape([1, self.n], order='F')[0], width=0.5)plt.plot([0, self.n], [0, 0], "-")plt.title("y{}".format(i + 1))plt.tight_layout()plt.savefig("verify.jpg")plt.show()def save(self, sol):sol = np.r_[[["y{}".format(i + 1) for i in range(self.dependent)]], sol]sol = np.c_[["dependent", "x0"] + list(self.df.columns[:-self.dependent]), sol]print(sol)with open("result.csv", "w", newline="") as file:writer = csv.writer(file)writer.writerows(sol)def R2_func(y_test, y):return 1 - ((y_test - y) ** 2).sum() / ((y.mean() - y) ** 2).sum()if __name__ == '__main__':# 因变量个数,文件位置,次数# 文件格式说明:第一行为数据名称(非数据),每一列不能全为0,请自行删除全为0的列# 文件格式说明:第一列拒绝 index , 前面 m 列为自变量, 后面 n 列为因变量# 文件类型说明: 支持 .csv .xlsx .xlsLinear(2, "data.csv", 1)

代码生成文件说明:

changed.csv        如果启用了多元高次回归会生成该文件,计算高次项的值
result.csv        结果文件
verify.jpg        可视化结果
相关系数矩阵.csv        相关系数矩阵文件

代码会print的值说明:

第一个二维矩阵为结果的值进行打印
接下来为R^2 score评价函数

可供测试文件:

https://www.pancake2021.work/wp-content/uploads/data.csv

测试文件说明:

该data文件为2021小美赛C题我们组自己制作的data,有一定参考性,不完全可靠,只是提供一种测试可能。该文件因变量为2个即最后的score和DRA。

个人博客地址偏最小二乘法(PLS)Python参考代码 – Pancake's Personal Website

偏最小二乘法(PLS)Python代码相关推荐

  1. matlab pls rmsecv,偏最小二乘法PLS回归NIPALS算法及Matlab程序及例子.doc

    偏最小二乘法PLS回归NIPALS算法及Matlab程序及例子 偏最小二乘法PLS回归NIPALS算法的Matlab程序及例子 function [T,P,W,Wstar,U,b,C,B_pls,.. ...

  2. 几种最小二乘法及python代码:ELS、TLS、RLS

    1.ARMAX模型 下面各章节,我就是使用上面公式的符号,其中y是输出,u是输入,e是噪声.有m个输出y,r个输入u. 进一步精简为: Y=Pθ+E 其中:Y为要预测的部分,P为已知数据(包括y的t- ...

  3. 偏最小二乘法PLS分类,多输入单输出模型。

    %%  清空环境变量 warning off             % 关闭报警信息 close all               % 关闭开启的图窗 clear                 ...

  4. PLS回归 (OLS)最小二乘法 PCA) 偏最小二乘法 (PLS) SIMPLS算法 20200723

  5. 最小二乘模型 matlab程序,我提供给大家一个偏最小二乘法的代码

    下面是一个偏最小二乘法的完整代码,就是结果不尽如人意,望高人指点一二! 实测数据矩阵: X = [ 30 405 1.5 47.5 40 435 3.0 45.0 50 465 1.0 42.5 60 ...

  6. r语言pls分析_R语言中的偏最小二乘PLS回归算法

    偏最小二乘回归: 我将围绕结构方程建模(SEM)技术进行一些咨询,以解决独特的业务问题.我们试图识别客户对各种产品的偏好,传统的回归是不够的,因为数据集的高度分量以及变量的多重共线性.PLS是处理这些 ...

  7. 偏最小二乘法 Partial Least square

    最小二乘法:http://baike.so.com/doc/723226.html 偏最小二乘法(Partial Least square) http://blog.sciencenet.cn/blo ...

  8. Matlab中的偏最小二乘法(PLS)回归模型,离群点检测和变量选择

    全文下载:http://tecdat.cn/?p=22319 本文建立偏最小二乘法(PLS)回归(PLSR)模型,以及预测性能评估.为了建立一个可靠的模型,我们还实现了一些常用的离群点检测和变量选择方 ...

  9. 偏最小二乘(PLS)原理分析Python实现

    目录 1  偏最小二乘的意义​​​​​​​ 2​ ​​​​​​PLS实现步骤 3 弄懂PLS要回答的问题 4 PLS的原理分析 4.1 自变量和因变量的主成分求解原理 4.1.1 确定目标函数 4.1 ...

  10. 回归预测 | MATLAB实现PLS(偏最小二乘法)和PCR(主成分回归)多输入单输出

    回归预测 | MATLAB实现PLS(偏最小二乘法)和PCR(主成分回归)多输入单输出 目录 回归预测 | MATLAB实现PLS(偏最小二乘法)和PCR(主成分回归)多输入单输出 预测效果 基本介绍 ...

最新文章

  1. php的buffer缓存区
  2. 洛谷 - P7771 【模板】欧拉路径(Hierholzer算法)
  3. 牛客网 在线编程 数据流中的中位数
  4. 这周,全球首个IT技术全中文免费学习平台诞生了!太惊艳!
  5. Audio Offload
  6. #C++初学记录(算法测试2019/5/5)(深度搜索)
  7. 2017北京国庆刷题Day5 morning
  8. 《Android群英传》— Android 书籍
  9. JetBrains:更改webstrom、IDEA等主题
  10. tp3.2 URL模式
  11. 面向对象编程---掷骰子游戏
  12. 谷歌企业文化建设分析
  13. 贪婪模式与正则匹配过程
  14. 每日一言:愿你等待的,终有回答
  15. Oracle OCP学习——Catalog的配置与使用
  16. python一句代码生成26个英文字母
  17. 「独立思考」的背后是一个残酷的世界
  18. 放榜!腾讯iOA、腾讯天幕入选国内数字化可信服务首批认证产品
  19. Uncaught TypeError: Cannot read properties of undefined (reading ‘push’) ---- vue-router报错
  20. 『前端实习笔记』前言 坎坷的找实习之路

热门文章

  1. java blog 引擎_推荐10个Java开源CMS系统
  2. VC 整人程序 修改分区表
  3. azure java sdk_用于 Azure 媒体服务的 Java SDK 使用入门 | Microsoft Docs
  4. 佳能Canon PIXMA MP236 打印机驱动
  5. 【学术技巧】论文答辩,老师会仔细看论文内容吗?
  6. Pytho爬虫-4567电影网电影信息爬取
  7. Top 10 JavaScript编辑器,你在用哪个?
  8. 全开源!Office多人协作应用,在线编辑Word、Excel和PPT文档
  9. mos管h桥电机驱动电路与设计原理图-KIA
  10. 深度卷积神经网络及各种改进