2022年1月

原作者视频链接:(我写了一首歌纪念死在24岁的自己)【我从人间走过】

**我从人间走过(歌词)** 作词:瞳荧 作曲:瞳荧、wells、Pixar 编曲:wells 演唱:十八薰 和声:十八薰 和声编写:斯大王 混音:沈钰博 来这人间那一瞬间空气略有些堵塞 晨光正熹微哭过之后 也就安静睡了 此刻未来与过去都还未发生呢 “要好好长大,小孩子快乐就够了” 葡萄藤、蔷薇篱笆和新建起的居民楼 藏在边边角角的快乐 仅我们知道的 广场上有 雀鸟追着蜻蜓赶日落 欢笑时光还没变成后来的旧伤口 而下一秒会在转角处遇到某个某某 带我看夜莺泣血义无反顾追逐自由 他站在旧世界的路口 对我挥了挥手 说: “去成为了不起的人吧,我的朋友” 自幼并行的小船突然驶向不同河流 意外爱上黄昏来时闭眼将末日虚构 意气风发的稚鸟翅膀直指最高楼 “去做你想做的吧,亲爱的别回头” 别回头 别回头 别怕未来会把过去写旧 梦怀宇宙 别怕困囚 戴着镣铐向光伸手 于是我接过期望继续奔向流光尽头 意外比告别来得更快遗憾还未开口 我会永远记得年迈的他拍拍我额头 说: “别难过,人生路很长,总有人要先走” (像飞鸟赶不及同天光邂逅) 我从人间走过阳光正暖 也算有幸见过星河浩瀚 没见过的也算不得遗憾 寥寥数年已经足够圆满 如果那天紧紧握住你犹豫伸出的手 能否让你感觉这人世还有一丝温柔 值得你留恋 可惜人生从来没有如果 错过的永远错过 活着的永远记得 深夜里崩溃在吹田市的不知名街头 大言不惭承诺梦想却撞得头破血流 仿佛一直在失去哪还有力气说以后 “没必要选择坚强,放肆哭吧小朋友” 没想过热爱 竟成为途中的唯一绳索 星空分崩离析 光与梦碰撞出新宇宙 遥远亿万光年外 悄然升起了新星斗 故事中真情实感的那个人才是小丑 后来小狐狸 迷失在高楼林立 奔波的小王子 只剩孤独压抑 等待的玫瑰花 遗忘了来年花期 冷暖间隙中挤压着无法呼吸 “倘若某天我也悄无声息 死在了无人关注的角落里 希望某日你想起我不要难过哭泣 记得我说每次离别都是童话的开始” 我从人间走过阳光正暖 (我记得 那年我们 信誓旦旦说着永远) 也算有幸见过星河浩瀚 (不信天 不信命 不信缘分会输给时间) 没见过的也算不得遗憾 寥寥数年已经足够圆满 我从人间走过风雨未晚 (我记得那年 阳光正慵懒 院里葡萄特别甜 幼稚的我们 肩靠着肩等 流星到凌晨三点) 也算有缘相逢挚友二三 (电视上没播到结局的动画片 离别还太远) 可惜时光没有办法能永远定格在那一年) 没相遇最好 以免说再见 (途中多遗憾 未来还太远 心火在冬日消减 像走不到春天 偏熬到夏天 认命还不愿服天) 毕竟告别总比重聚难言 (有时也想过 花烂漫某天 与世界无声道别 可是偏偏又太多太多遗憾挂牵 没画句点) 我从人间走过风雨未晚 (形形色色的人 来了又走 早该习惯了) 也算有缘相逢挚友二三 (开心或快乐 无所谓了 明天还是一样浑噩地活) 没相遇最好以免说再见 (爱我的人 别难过 恨我的人随便高歌) 毕竟告别总比重聚难言 (我从人间走过 已然拥过阳光足够了)(一切还未结束呢 故事还没讲够呢 结局早就给你了 要记得去发现哦 想我就听听歌吧 人生都在里面了 想做的也都做了 没什么遗憾了)

一、ACF(自相关系数检验周期)

%% 通过autocorr和xcorr自相关求周期
clear ;clc
%加载TOP13家供货商240周的供货量数组文件
load FFt.mat;
%使用autocorr函数
Randi = randi([2 14],1,1)
A = FFt([1:96],Randi) ;
len = length(A) ;
[ACF,lags,bounds] = autocorr(A,len-1) ;
subplot(2,1,1) ;
plot(lags(1:end),ACF(1:end)) ;
title('autocorr求S-top13的自相关') ;
%使用xcorr函数
B = A - mean(A) ;%减掉均值
[c,lags] = xcorr(B) ;
d = c ./ c(len) ;%归一化
subplot(2,1,2) ;
plot(lags(len:end),d(len:end)) ;%取中点n为起始的后面n个序列
title('xcorr求S-top13的自相关') ;
from statsmodels.tsa.stattools import acf

# Expected time period
for lag in fft_periods:
    # lag = fft_periods[np.abs(fft_periods - time_lag).argmin()]
    acf_score = acf(data["value"].values, nlags=lag)[-1]
    print(f"lag: {lag} fft acf: {acf_score}")

expected_lags = np.array([timedelta(hours=12)/timedelta(minutes=5), timedelta(days=1)/timedelta(minutes=5), timedelta(days=7)/timedelta(minutes=5)]).astype(int)
for lag in expected_lags:
    acf_score = acf(data["value"].values, nlags=lag, fft=False)[-1]
    print(f"lag: {lag} expected acf: {acf_score}")

周期检验图

1.autocorr求S-top13的自相关

2.corr求S-top13的自相关

xcorr求S-top13的自相关

二、FFt(傅里叶变换计算周期)

%% 判断TOP13家供货商的供货量(S)是否为周期波动。如果周期波动,求出周期。
clear;clc;
%加载TOP13家供货商240周的供货量数组文件
load FFt.mat;
%将首列的240个周次作为横坐标(Weeks)
weeks = FFt([1:240],1);
%随机生成2到14中的一个整数用以随机择取13个供货商中的一家
Randi = randi([2 14],1,1)
SNumbers = FFt([1:240],Randi);
%绘制该供货商未经fft(傅里叶函数)变换的原始图像并观察是否存在周期此性
plot(weeks,SNumbers)
xlabel('Weeks')
ylabel('SNumbers')
title('FFt Data')
%大致判断该原始图像是否具有周期性
judge = input("请输入观察该供货商的供货量(S)数据是否具有周期性,'是'请输入'1','不是'请输入'0':")
if judge == 1
    %如果具有周期性,则使用FFt(傅里叶变换)函数将随机择取的供货商所在列的供货量(S)进行变换
    y = fft(SNumbers);
    y(1) = [];
    plot(y,'ro')
    %绘制经过fft(傅里叶函数)变换后的图像
    xlabel('real_SNumbers(y)')
    ylabel('imag_SNumbers(y)')
    title('傅里叶转换')
    %变换数据前半部分的幂
    n = length(y);
    power = abs(y(1:floor(n/2))).^2;
    %最大频率
    maxfreq = 1/2;      
    %等距频率网格
    freq = (1:n/2)/(n/2)*maxfreq;    
    plot(freq,power)
    xlabel('Weeks/Cycle')
    ylabel('Power')
    period = 1./freq;
    plot(period,power);
    %放大最大功率(周次)
    xlim([0 240]); 
    xlabel('Weeks/Cycle')
    ylabel('SNumbers')
end

随机验证周期图

1.Weeks

Weeks

2.Weeks_Cycle

Weeks_Cycle

三、Topsis

(一)Inter2Max

%% 定义Inter2Max函数以备主函数调用
function [posit_x] = Inter2Max(x,a,b)
    r_x = size(x,1);  % row of x 
    M = max([a-min(x),max(x)-b]);
    posit_x = zeros(r_x,1);  
    % 初始化posit_x全为0
    for i = 1: r_x
        if x(i) < a
           posit_x(i) = 1-(a-x(i))/M;
        elseif x(i) > b
           posit_x(i) = 1-(x(i)-b)/M;
        else
           posit_x(i) = 1;
        end
    end
end

(二)Mid2Max

%% 中间型数据转极大型数据
%定义Mid2Max函数以备主函数调用
function [posit_x] = Mid2Max(x,best)
    M = max(abs(x-best));
    posit_x = 1 - abs(x-best) / M;
end```
%% 中间型数据转极大型数据
%定义Mid2Max函数以备主函数调用
function [posit_x] = Mid2Max(x,best)
    M = max(abs(x-best));
    posit_x = 1 - abs(x-best) / M;
end

(三)Min2Max

%% 及小型数据转极大型数据
%定义Min2Max函数以备主函数调用
function [posit_x] = Min2Max(x)
    posit_x = max(x) - x;
    % posit_x = 1 / x; 如果x全部都大于0,需要这样正向化
end

(四)Positivization

%% 调用Mid2Max.m和Min2Max.m和Inter2Max.m函数定义正向化函数
function [posit_x] = Positivization(x,type,i)
% 输入变量有三个:
% x:需要正向化处理的指标对应的原始列向量
% type: 指标的类型(1:极小型, 2:中间型, 3:区间型)
% i: 正在处理的是原始矩阵中的哪一列
% 输出变量posit_x表示:正向化后的列向量
    if type == 1  %极小型
        disp(['第' num2str(i) '列是极小型,正在正向化'] )
        posit_x = Min2Max(x);  %调用Min2Max函数来正向化
        disp(['第' num2str(i) '列极小型正向化处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    elseif type == 2  %中间型
        disp(['第' num2str(i) '列是中间型'] )
        best = input('请输入最佳的那一个值: ');
        posit_x = Mid2Max(x,best);
        disp(['第' num2str(i) '列中间型正向化处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    elseif type == 3  %区间型
        disp(['第' num2str(i) '列是区间型'] )
        a = input('请输入区间的下界: ');
        b = input('请输入区间的上界: '); 
        posit_x = Inter2Max(x,a,b);
        disp(['第' num2str(i) '列区间型正向化处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    else
        disp('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值')
    end
end

(五)topsis

%% Step1:清空界面,并加载矩阵X
clear;clc %清空界面
load X.mat %加载数据
%% Step2:判断是否需要正向化处理
[n,m] = size(X);%计算矩阵的大小
disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标']) %输出共有多少个评价对象
JUDGING = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0:  ']);%定义是否需要正向化处理
if JUDGING == 1
    Position = input('请输入需要正向化处理的指标所在的列 '); 
    disp('请输入需要处理的这些列的指标类型(1-极小型, 2-中间型, 3-区间型) ')
    TYPE = input('例如:第1列是极小型,第2列是中间型,第3列是区间型,就输入[1,2,3]:  ');%同样为了保证代码逻辑的完整性,此处添加正向化的处理步骤
      for i = 1 : size(Position,2)  %这里需要对这些列分别处理,因此需要知道一共要处理的次数,即循环的次数
        X(:,Position(i)) = Positivization(X(:,Position(i)),TYPE(i),Position(i));
       end
    disp('正向化后的矩阵 X =  ')%输出正向化的矩阵
    disp(X)
end%以end作为结尾
%% Step3:对正向化后的矩阵进行标准化
Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);%利用repmat函数
disp('标准化矩阵 Z = ')%输出标准化矩阵Z
disp(Z)
%% Step4:判断是否需要增加权重
disp("请输入是否需要增加权重向量,需要输入1,不需要输入0")%以此作为增加权重步骤的开始
JUDGING = input('请输入是否需要增加权重: ');%判断是否需要增加权重
if JUDGING == 1%用if 和 for 循环来判断是否需要增加权重
    JUDGING = input('使用熵权法确定权重请输入1,否则输入0: ');%确定是否需要用熵权法增加权重
    if JUDGING == 1%==是判断符号
        if sum(sum(Z<0)) >0   % 如果之前标准化后的Z矩阵中存在负数,则重新对X进行标准化
            disp('原来标准化得到的Z矩阵中存在负数,所以需要对X重新标准化')
            for i = 1:n%使用for循环
                for j = 1:m
                    Z(i,j) = [X(i,j) - min(X(:,j))] / [max(X(:,j)) - min(X(:,j))];
                end
            end
            disp('X重新进行标准化得到的标准化矩阵Z为:  ')
            disp(Z)
        end
        weight = Entropy_Method(Z);
        disp('熵权法确定的权重为:')%输出最终权重数据
        disp(weight)
    else
        disp(['如果你有3个指标,你就需要输入3个权重,例如它们分别为0.25,0.25,0.5, 则你需要输入[0.25,0.25,0.5]']);
        weight = input(['你需要输入' num2str(m) '个权数。' '请以行向量的形式输入这' num2str(m) '个权重: ']);
        OK = 0;  % 用来判断用户的输入格式是否正确
        while OK == 0 
            if abs(sum(weight) -1)<0.000001 && size(weight,1) == 1 && size(weight,2) == m  % 注意,Matlab中浮点数的比较要小心
                OK =1;
            else
                weight = input('你输入的有误,请重新输入权重行向量: ');
            end
        end
    end
else
    weight = ones(1,m) ./ m ; %如果不需要加权重就默认权重都相同,即都为1/m
end

%% Step5:计算与最大值的距离和最小值的距离,并算出得分
D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ] .* repmat(weight,n,1) ,2) .^ 0.5;   %此为与最大值即最优解的距离
D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ] .* repmat(weight,n,1) ,2) .^ 0.5;   %此为与最小值即最劣解的距离
S = D_N ./ (D_P+D_N);    % 这里得到未归一化的得分
disp('最后的得分为:')
stand_S = S / sum(S)%将数据进行归一化处理,以便于比较。
[sorted_S,index] = sort(stand_S ,'descend')%对各个供应商进行排序,得到最终数据

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3svr12kkscyss

特别申明:本教程仅供学习使用,不得用于任何违法行为!

一、登录堡塔面板

(一)找到“软件商店”



1.下载插件

插件源码地址:https://github.com/Xeath/btp_frps
作者:Xeath
功能介绍:图形化设置、修改 frps 配置
支持版本:Linux 64 位系统(搭配 systemd 组件开机自启动)
安装方法:宝塔面板安装
离线下载地址:
https://www.bt.cn/bbs/forum.php?mod=attachment&aid=MzQ5MDF8MTBmM2E3YTh8MTYxNDk1MTY4MXwwfDM1OTY3

2.导入插件

将下载完的.ZIP包直接从上图中上传导入。

(二)安装Frp插件

1.离线下载

地址:https://github.com/fatedier/frp/releases

2.选择对应版本

我这里是ARM64位架构的Linux服务器

3.在堡塔离线更新

点击上面图片里的“离线更新”,把压缩包直接上传即可。

二、配置Frp

1.通用设置

不会配置的话,保持基本设置不变

监听地址  0.0.0.0 * 支持监听 IPv6 地址
TCP 端口 7000
UDP 端口 7001 * 用于辅助客户端进行打洞穿透 NAT
KCP 端口 7000 * KCP 协议的 UDP 端口,可与 TCP 端口相同
验证密钥 “这个地方自己填自己的密码”

2.仪表盘设置

监听地址 0.0.0.0 * 默认与通用设置的监听地址相同
监听端口 7538
验证账户 xxxxx
验证密码 “自己设置”

我设置的端口是7538

4.启动Frp

4.登录Frp后台

后台地址格式:服务器公网IP:仪表盘设置中的“监听端口”
例:192.168.23.23:7538

三、配置客户端

1.配置frpc.ini

内容如下:
[common]
server_addr = 47.104.188.80
server_port = 7000
token = “这里是当时自己设置的密码”

[WEB]
type = tcp
local_ip = 127.0.0.1
local_port = 3000
remote_port = 7001

2.启动frpc

我使用的是GIT工具

输入代码 ./frp -c ./frpc.ini

3.启动本地服务

3.1 使用GIT工具进入需要穿透的目录中

3.2 启动服务

将硬盘文件直接通过TCP映射到公网
例如:serve
(需要GIT工具安装过serve)

4.检测穿透

在网址输入服务器公网IP加上相应穿透的端口即可

例如 192.168.1.1:7001
这就是我的硬盘文件展示

四、特别说明

  • 以上的所有端口都需要服务器开放防火墙,如果是阿里云的机器,那么还要去官网开放安全组,腾讯云类似。
  • 公网映射以后不是P2P的握手服务器,而是一个中转服务器,所以会走服务器的流量,映射的速度完全取决你机器的能力了。
  • 不建议做视频还有图床,因为没有备案的话,你这是违规的。
  • 如果本地电脑实在家用宽带下的,建议不用绑定域名了,不然分分钟服务商打电话强制你家拆机,给你纳入宽带黑户。