[TOC]
数学建模
待学习
- 三维作图
- 文件读写
一、线性回归:用于预测一个连续的输出变量。
import numpy as np
from sklearn.linear_model import LinearRegression
# 创建一个随机数据集
np.random.seed(0)
X = np.random.rand(100, 1)# 生成一个形状为(100, 1)的随机数组,表示特征X。#表示一个二维数组,其中有100行和1列#随机数是在0到1之间均匀分布的。
y = 2 + 3 * X + np.random.rand(100, 1)# 生成目标变量y,其中包含噪声项。
# 创建线性回归模型并拟合数据
model = LinearRegression()
model.fit(X, y)
# 打印模型的系数和截距项
print('Coefficients:', model.coef_)#斜率
print('Intercept:', model.intercept_)#截距
# 预测新数据
X_new = np.array([[0.5], [1.0]])
y_new = model.predict(X_new)
# 打印预测结果
print('Predictions:', y_new)
这段代码是一个简单的线性回归示例,用于拟合一个随机生成的数据集并进行预测。我会逐行解释代码的功能:
-
import numpy as np
: 导入NumPy库,并将其命名为np
,用于处理数组和矩阵等数值运算。 -
from sklearn.linear_model import LinearRegression
: 从scikit-learn库中导入线性回归模型。 -
np.random.seed(0)
: 设置随机种子为0,以确保每次运行代码时生成的随机数相同。 -
X = np.random.rand(100, 1)
: 生成一个形状为(100, 1)的随机数组,表示特征X。 -
y = 2 + 3 * X + np.random.rand(100, 1)
: 生成目标变量y,其中包含噪声项。 -
model = LinearRegression()
: 创建一个线性回归模型的实例。 -
model.fit(X, y)
: 使用X和y拟合线性回归模型。 -
print('Coefficients:', model.coef_)
: 输出模型的系数,即斜率。 -
print('Intercept:', model.intercept_)
: 输出模型的截距项。 -
X_new = np.array([[0.5], [1.0]])
: 创建新的特征数据用于预测。 -
y_new = model.predict(X_new)
: 使用训练好的模型对新数据进行预测。 -
print('Predictions:', y_new)
: 输出预测结果。
这段代码的主要目的是演示如何使用线性回归模型拟合数据并进行预测。
资料
数学建模老哥
链接:https://pan.baidu.com/s/1NBqiSIKkIJoS32MQhR82IA?pwd=1111
提取码:1111
数据 P64
Statista - The Statistics Portal for Market Data, Market Research and Market Studies 贵 淘宝
matlab基础
快捷键
- 切换文本与代码
ctrl+e
- 分节
ctrl+alt+enter
- 切换不同的节
ctrl + 上/下
- 运行节
ctrl+enter
- 帮助
help
- 为添加和取消注释
ctrl + r/t
(%) - 多行注释
- 打印
disp("hello world")
%{
hello world
%}
- 显示高精度
format long g
- 清空命令行
clc
- 清空工作区
clear
格式
- format
- 精度
- Digits()
- vpa()
矩阵
-
生成向量(左闭右闭)
x=0:2:6 # 0 2 4 6 x=linspace(first,last,numbers)
-
特殊矩阵
- eye 单位矩阵
- ones 全为1
- zeros 全为0
- rand (0,1)随机
-
取数
x=[1,2,3]
x(2)%第二个
x([1,3])%第1,3个
x(1:2,m)=[]%删除
-
变维
reshape()
-
变向
Rot()
Fliup()
上下翻转 -
向量
%点乘 dot(a,b) %叉乘 cross(a,b)
-
广播机制
% 创建一个矩阵 A = [1, 2, 3; 4, 5, 6; 7, 8, 9]; % 创建一个向量 B = [2, 3, 4]; % 使用广播机制实现矩阵每一行中的每一个元素除以向量中对应位置的元素 result = A ./ B; result =A.* B;%对应元素相乘 disp(result);
-
矩阵的抽取
-
运算
.*
inv(X) 逆
det(X) 行列式
.‘ 或 transpose() 转置
e=eig(A) 特征值
多项式
-
表示
p=[1,2,3] poly2sym(p) 1*x^2+2*x^1+3
-
乘法、除法
x=[1,2] y=[2,34,4] z=conv(x,y)%本质是卷积 [x,r]=dconv(z,x)%商和余数
-
求导
p=[123,31,321] x=polyder(p)
cell元胞数组
-
创建
cell(4)% 44 cell(2,3)% 2x3 cell(size(A))%与A相同大小 c1={1:3,"af"}%花括号
-
引用
- 小括号,引用的是元胞,
data=c1(row,col)%class(data)=cell data={[1,2,3]}
- 大括号,引用的是数据
data=c1{1,1};% data=1:3 1 2 3 [x,y]=c1{1,:};%x=1,y=2 x,y是线性索引顺序
-
类型转换
- num2cell 数组转化为元胞数组,
- mat2cell
- cell2num
struct/字典
s=struct('field1',{},'field2',{})
s=struct('field1',value1,'field2',value2)
s(1)%各field的第一个
s(2).field1%取field的第二个
- 创建方法
分类数组
- 创建
c={'女','男','男'}
c1=categorical(c)
%c1= 女 男 男
- 显示种类
categories(c1)%按照unicode进行编码
- 排序
- sort
sort(c1)%默认将c1按照unicode进行升序排序
- reorderccats
cc={'low','low','middle','high','middle','low'}
neworder={'low','middle','high'};
cc=reordercats(c,neworder)%要有左值进行接收
可用categories(cc)查看是否生效。
注意:
1.改的是类别的顺序,不是元素的顺序
2.建议对元胞数组
- 实战
%cc为分类数组
cc=reordercats(cc,{'low','middle','high'});
[~,ind]=sort(cc,'descend');
ss=s(ind,:)
符号运算
-
创建
syms x y z=[x+y;x-y]
-
subs(z,x,1)
部分代入 -
eval()
-
sym
-
expand(cos(x+y)) 多项式展开
-
simple 符号简化
-
[n,m]=numden(A)
通分 -
运算
syms x y
f1=x+y;
f2=x-y;
f11=matlabFunction(f1);%转化为能进行数值运算的函数
f11(1,2);% 3
- fsolve 函数句柄
% deal.m
function f=deal(x)
f(1)=x(1)+x(2)+1;
f(2)=x(1)-x(2);
end
% test.mlx
clc
clear
fun=@deal;
x0=[0,0];
x=fsolve(fun,x0);
含参的 fsolve(@f,x,c)
# deal2.m
function f=deal2(x,c)
f(1)=x(1)+x(2)+c;
f(2)=x(1)-x(2);
end
% test.mlx
clc
clear
fun=@(x)deal2(x,10);%重点是这一行
x0=[0,0];
x=fsolve(fun,x0);
文件读写
readtable()
ismissing()
函数返回缺失值位置
数学工具
求和
p=[1,2,3,4;4,3,5,2]
sum(p)%对每列求和,返回行向量
阶乘
- factorial
极限与导数
%极限
syms x h
f=sin(x)/x
limit(f,x,0)
%导数
f=(sin(x+h)-sin(X))/h%同理可计算偏导
拆分
diff()
级数求和
F=symsum(f,k,start,final)% 可求不定项
积分
int(f,x,start,final)
-
二重积分
integral2()
-
三重积分
integral3()
傅里叶变换
fourier
泰勒展开
taylor
常微分方程
解析解法
dsolve()
e.g.1
syms y(t) a
eqn = diff(y,t) == a*y;
S = dsolve(eqn)
e.g.2
syms y(x)
eqn = (x^2-1)^2*diff(y,2) + (x+1)*diff(y) - y == 0;
S = dsolve(eqn)
e.g.3
syms y(t) a b
eqn = diff(y,t,2) == a^2*y;
Dy = diff(y,t);
cond = [y(0)==b, Dy(0)==1];
ySol(t) = dsolve(eqn,cond)
数值求解
欧拉法
-
欧拉法 误差
h^2
function [x,y]=euler(f,x0,y0,xf,h) n=fix(xf-x0)/h; y(1)=y0; x(1)=x0; for m=1:n x(m+1)=x(m)+h; y(m+1)=y(m)+h*feval(f,x(m),y(m)); end
MATLAB-欧拉法、改进欧拉法、ode45求解微分方程_matlab欧拉法求解微分方程数值解-CSDN博客
h=0.01;%步长 x=0:h:1; u=zeros(length(x),1); u(1)=3; for i=1:length(x)-1 du=-3*u(i)+6*x(i)+5; u(i+1)=u(i)+h*du; end figure(1) U=2*exp(-3*x)+2*x+1; plot(x,U,'r')%解析解 hold on plot(x,u,'bo','MarkerFaceColor','b')%数值解
-
改进欧拉法 误差
h^3
yp=yn+h*f(xn,yn)
yc=yn+h*f(xn+1,yp)
yn+1=1/2*(yp+yc)
龙格库塔法 ode P81
求解一阶微分方程
偏微分方程 PDE P82
椭圆型,抛物型,双曲型二阶非齐次偏微分方程
-
椭圆型二阶非齐次偏微分方程
对空间求二阶偏导数
-
抛物型,双曲型二阶非齐次偏微分方程
多了对t的偏导
-
散度内含有函数
-
偏微分方程组
-
步骤
构造标准方程
确定边界pdegeom
求解
==pdeTool==
有限元法
作图工具
通用部分
清空及创造数据
clear;clc;close all
x=linspace(1,200,100);%1~200,100个点
y1=log(x)+1;
y2=log(x)+2;
figure;%生成图形窗口
二维曲线
clear;clc;close all
x=linspace(1,200,100);%1~200,100个点
y1=log(x)+1;
y2=log(x)+2;
figure;%生成图形窗口
plot(x,y1);
hold on%多图共存在一个窗口上
plot(x,y2,'color',r,'LineWidth',2)%指定线的宽度
hold off%关闭多图共存
legend('y1','y2');%生成图例
散点图
clear;clc;close all
x=linspace(1,200,100);%1~200,100个点
y1=log(x)+1;
y2=log(x)+2;
figure;
y3=y1+rand(1,100)-0.5
plot(x,y1,'LineWidth',2,'Color',[0.21,0.21,0.67]);%rgb颜色
hold on
plot(x,y3,"o",'LineWidth',0.2,'Color',[0.46,0.63,0.90],'MarkerFaceColor',[0.35,0.90,0.89],'MarkerEdgeColor',[0.18,0.62,0.17]) %MarkerFaceColor->内部填充%MarkerEdgeColor->边框
二维渐变图
clear;clc;close all
x=linspace(0,3*pi,200);
y=cos(x)+rand(1,200);%随机1行200列,0~1
sz=25;%圈尺寸为200
c=linspace(1,10,length(x));%代表100中颜色
scatter(x,y,sz,c,'filled')%filled for 填充
条形图
A=[60.6679;87.412;143.2;267.93];
C=[127.5;160;231;400]
B=C-A;
D=[A,B,C];
bar1=bar([2:5:17],A,'BarWidth',0.2,'FaceColor','k')
bar2=bar([3:5:18],B,'BarWidth',0.2,'FaceColor',[0.5,0.5,0.5]);
bar3=bar([4:5:19],C,'BarWidth',0.2,'FaceColor','w');
hold on;
ylabel('耗时/s')
xlabel('GMM阶数')
legend('训练耗时','测试耗时','总耗时');
labelID={'8阶','16阶','32阶','64阶'};
set(gca,'XTick',3:5:20);
set(gca,'XTickLabel',labelID)
填充图
x=0.4:0.1:2*pi;
y1=sin(2*x);
y2=sin(x);
%确定y1,y2上下界
maxY=max([y1;y2]);
minY=min([y1:y2]);
%确定填充多边形,按照顺时针方向来确定点
%fliplr实现左右翻转,从
xFill=[x,flipr(x)];
yFill=[maxY,fliplr(minY)];
figure
fill(xFill,yFill,[0.21,0.21,0.67]);
hold on
plot(x,y1,'k','LineWidth',2)
plot(x,y2,'k','LineWidth',w)
hold off
多y轴
分组直方图
scatterhistogram()
load patients
Smoker = categorical(Smoker);
s = scatterhistogram(Age,Smoker);
xlabel('Age')
ylabel('Smoker')
上色
xvalues = [7 6 5 6.5 9 7.5 8.5 7.5 10 8];
yvalues = categorical({'onsale','regular','onsale','onsale', ...
'regular','regular','onsale','onsale','regular','regular'});
grpvalues = {'Red','Black','Blue','Red','Black','Blue','Red', ...
'Red','Blue','Black'};
s = scatterhistogram(xvalues,yvalues,'GroupData',grpvalues);
s.Title = 'Shoe Sales';
s.XLabel = 'Shoe Size';
s.YLabel = 'Price';
s.LegendTitle = 'Shoe Color';
分组散点图
gscatter()
算法
层次分析法
- 筛选
- 评价
主观性强,不适合作为主要算法
论文
https://kns.cnki.net/kcms/detail/detail.aspx?filename=CN113869568A&dbname=SCPDTEMP
算法
剩余矩形匹配算法
功能
依照某一列进行排序
- 基于sort
[~,ind]=sort(p,'descend')%降序排列
ss=s(ind,:)