国产乱精品一区二区三区_韩国一级特黄的一级毛片_日本精品视频在线播放_欧美熟妇淫乱视频_欧美日韩在线视频中文字幕_亚洲国产精品一区久_永久免费看擁有海量影視資源_人成无码区免费aⅤ片_午夜电影在线观看国产1区_777免费视频在线观看软件

北太天元應(yīng)用案例分享:用向量機(jī)做心臟病篩查

標(biāo)簽: 數(shù)模競賽

社區(qū)小助手 2024-06-27 10:03:57

數(shù)據(jù)

age,sex,cp,trestbps,chol,fbs,restecg,thalach,exang,oldpeak,slope,ca,thal,target

42,1,1,120,295,0,1,162,0,0,2,0,2,1

48,0,2,130,275,0,1,139,0,0.2,2,0,2,1

54,1,2,120,258,0,0,147,0,0.4,1,0,3,1

54,0,2,108,267,0,0,167,0,0,2,0,2,1

51,0,2,130,256,0,0,149,0,0.5,2,0,2,1

57,0,0,128,303,0,0,159,0,0,2,1,2,1

61,1,0,138,166,0,0,125,1,3.6,1,1,2,0

45,1,0,115,260,0,0,185,0,0,2,0,2,1

60,0,3,150,240,0,1,171,0,0.9,2,0,2,1

49,0,0,130,269,0,1,163,0,0,2,0,2,1

53,1,2,130,246,1,0,173,0,0,2,3,2,1

54,1,0,140,239,0,1,160,0,1.2,2,0,2,1

51,1,0,140,298,0,1,122,1,4.2,1,3,3,0

49,1,2,118,149,0,0,126,0,0.8,2,3,2,0

58,1,2,105,240,0,0,154,1,0.6,1,0,3,1

48,1,1,130,245,0,0,180,0,0.2,1,0,2,1

48,1,0,122,222,0,0,186,0,0,2,0,2,1

52,1,2,138,223,0,1,169,0,0,2,4,2,1

54,1,1,192,283,0,0,195,0,0,2,1,3,0

63,0,0,150,407,0,0,154,0,4,1,3,3,0

70,1,1,156,245,0,0,143,0,0,2,0,2,1

這是一個關(guān)于心臟病篩查的數(shù)據(jù)集片段,每一行代表一個病人的信息。以下是各列字段的解釋:

  • age:年齡 - 病人的年齡(以歲為單位)。

  • sex:性別 - 通常為0(女性)或1(男性)。

  • cp:胸痛類型 - 這是一個分類變量,表示胸痛的類型。不同的數(shù)字可能代表不同的胸痛類型(例如,0可能表示無胸痛,1、2、3、4可能代表不同類型的胸痛)。

  • trestbps:靜息血壓 - 病人在靜息狀態(tài)下的血壓(單位可能是mmHg)。

  • chol:血清膽固醇 - 病人的血清膽固醇水平(單位可能是mg/dL)。

  • fbs:空腹血糖 - 病人的空腹血糖水平(0可能表示正常,1可能表示高于正常)。

  • restecg:靜息心電圖結(jié)果 - 這可能是一個分類變量,表示靜息狀態(tài)下的心電圖結(jié)果。

  • thalach:最大心率 - 病人能達(dá)到的最大心率(單位可能是次/分鐘)。

  • exang:運(yùn)動誘發(fā)的心絞痛 - 0可能表示沒有,1可能表示有。

  • oldpeak:ST段下降 - 這是心電圖的一個參數(shù),可能表示心肌缺血的程度(單位可能是mV或其他相關(guān)單位)。

  • slope:ST段峰值斜率 - 這也是心電圖的一個參數(shù),可能與心臟的病理狀況有關(guān)(例如,1、2、3可能表示不同的斜率類型)。

  • ca:冠狀動脈造影的主要血管數(shù)量 - 這可能是一個分類變量,表示在冠狀動脈造影中檢測到的主要血管數(shù)量(0可能表示無血管受損,其他數(shù)字可能表示受損血管的數(shù)量)。

  • thal:缺陷類型 - 這可能是一個分類變量,表示某種心臟缺陷或病理狀況的類型。

  • target:目標(biāo)變量 - 這是我們要預(yù)測或分類的變量。通常,1可能表示病人有心臟病,0可能表示沒有。

下面是北太天元軟件的代碼, 關(guān)于心臟病數(shù)據(jù)集的多類支持向量機(jī)(SVM)分類器的完整實(shí)現(xiàn),包括數(shù)據(jù)預(yù)處理、主成分分析(PCA)降維、交叉驗(yàn)證劃分、模型訓(xùn)練和測試、以及結(jié)果可視化。下面是對代碼的詳細(xì)解讀:

導(dǎo)入插件和數(shù)據(jù)

北太天元代碼

load_plugin("optimization");
data = readmatrix('heart disease.csv');


load_plugin("optimization"): 加載優(yōu)化工具箱,用于求解二次規(guī)劃問題。

readmatrix('heart disease.csv'): 讀取心臟病數(shù)據(jù)集。

數(shù)據(jù)預(yù)處理

北太天元代碼

if any(any(ismissing(data)))
    data = rmmissing(data);
end

檢查數(shù)據(jù)中是否有缺失值,并使用rmmissing函數(shù)刪除包含缺失值的行。

分離特征和標(biāo)簽

北太天元代碼

X = data(:,1:end-1);
y = data(:,end);

將數(shù)據(jù)集中的最后一列作為標(biāo)簽,其余列作為特征。

主成分分析降維

北太天元代碼

[coeff,score,latent] = pca(X);
X_pca = score(:,1:2);

使用自定義的pca函數(shù)對特征進(jìn)行降維,保留前兩個主成分。

劃分訓(xùn)練集和測試集

北太天元代碼

cv = my_cvpartition(size(X_pca,1),'HoldOut',0.3);
% ...(省略部分代碼)

使用自定義的my_cvpartition函數(shù)進(jìn)行HoldOut交叉驗(yàn)證劃分,將數(shù)據(jù)集分為70%的訓(xùn)練集和30%的測試集。

訓(xùn)練SVM模型

北太天元代碼

SVMModel = my_fitcecoc(X_train,Y_train,C);

使用自定義的my_fitcecoc函數(shù)訓(xùn)練多類SVM模型。該函數(shù)內(nèi)部采用一對一(One-vs-One)策略,為每個類別對訓(xùn)練一個SVM分類器。

預(yù)測測試集并計(jì)算準(zhǔn)確率

北太天元代碼

[label,score] = predict(SVMModel,X_test);
accuracy = sum(label-1 == Y_test) / length(Y_test);

使用predict函數(shù)對測試集進(jìn)行預(yù)測,并計(jì)算準(zhǔn)確率。注意這里假設(shè)標(biāo)簽是從1開始的,所以計(jì)算準(zhǔn)確率時需要將預(yù)測的標(biāo)簽減1。

可視化

matlab復(fù)制代碼

gscatter(X_pca(:,1),X_pca(:,2),y);
% ...(省略繪制決策邊界的代碼)

使用gscatter函數(shù)繪制原始數(shù)據(jù)點(diǎn)的散點(diǎn)圖,并使用輪廓線繪制決策邊界。

自定義函數(shù)解讀

pca: 實(shí)現(xiàn)主成分分析算法,對數(shù)據(jù)進(jìn)行降維。

my_cvpartition: 自定義的交叉驗(yàn)證劃分函數(shù),這里只實(shí)現(xiàn)了HoldOut方法。

my_fitcecoc: 實(shí)現(xiàn)多類SVM分類器的訓(xùn)練,采用一對一策略。

my_fitcsvm和my_fitcsvm_soft: 實(shí)現(xiàn)硬間隔和軟間隔SVM分類器的訓(xùn)練,使用二次規(guī)劃求解。

predict: 對測試集進(jìn)行預(yù)測,并返回預(yù)測的標(biāo)簽和得分。

predictOneVsAll: 使用單個SVM模型進(jìn)行預(yù)測,并返回預(yù)測結(jié)果和決策函數(shù)的值。

注意事項(xiàng)

  • 代碼中存在一些假設(shè)和簡化,例如標(biāo)簽從1開始、直接計(jì)算決策函數(shù)的值作為得分等,這些在實(shí)際應(yīng)用中可能需要根據(jù)具體情況進(jìn)行調(diào)整。

  • 在使用二次規(guī)劃求解SVM問題時,需要注意目標(biāo)函數(shù)和約束條件的設(shè)置,以確保求解的正確性。

  • 可視化部分僅繪制了前兩個主成分的散點(diǎn)圖和決策邊界,對于更高維度的數(shù)據(jù)可能需要進(jìn)行其他形式的可視化。


下面是全部代碼

load_plugin("optimization");
% 導(dǎo)入數(shù)據(jù)
data = readmatrix('heart disease.csv');
% 檢查并處理缺失值
if any(any(ismissing(data)))
    data = rmmissing(data);
end
% 分離特征和標(biāo)簽
X = data(:,1:end-1);
y = data(:,end);
% 主成分分析降維
[coeff,score,latent] = pca(X);
X_pca = score(:,1:2);
% 劃分訓(xùn)練集和測試集
cv = my_cvpartition(size(X_pca,1),'HoldOut',0.3);
idx = cv.test;
train_idx = setdiff(1: size(X_pca,1), idx);
X_train = X_pca(train_idx,:);
Y_train = y(train_idx,:);
X_test = X_pca(idx,:);
Y_test = y(idx,:);
% 訓(xùn)練SVM模型
C = 1e2; % 設(shè)置較大的C值以確保硬間隔分類(對于線性可分?jǐn)?shù)據(jù))
SVMModel = my_fitcecoc(X_train,Y_train,C);
% 預(yù)測測試集
[label,score] = predict(SVMModel,X_test);
% 計(jì)算準(zhǔn)確率
accuracy = sum(label-1 == Y_test) / length(Y_test);
% 可視化
gscatter(X_pca(:,1),X_pca(:,2),y);
hold on;
% 繪制決策邊界c
d = 0.15;
[x1Grid,x2Grid] = meshgrid(min(X_pca(:,1)):d:max(X_pca(:,1)),...
min(X_pca(:,2)):d:max(X_pca(:,2)));
xGrid = [x1Grid(:),x2Grid(:)];
[~,scores] = predict(SVMModel,xGrid);
contour(x1Grid,x2Grid,reshape(scores(:,2),size(x1Grid)),[0 0],'k');
% 輸出準(zhǔn)確率
fprintf('The accuracy of the SVM model is %.2f%%\n', accuracy * 100);
hold off;
function [coeff, score, latent] = pca(X)
    % X: 數(shù)據(jù)矩陣,每一列是一個特征,每一行是一個樣本
    % coeff: 主成分系數(shù)
    % score: 表示主成分得分
    % latent: 主成分對應(yīng)的特征值
    % 標(biāo)準(zhǔn)化數(shù)據(jù)(均值為0,方差為1)
    X = (X - mean(X)) ./ std(X);
%    X = (X - mean(X));
    % 計(jì)算協(xié)方差矩陣
    CovMat = cov(X);
    % 對協(xié)方差矩陣進(jìn)行特征值分解
    [V, D] = eig(CovMat);
    % 將特征值按降序排序,并獲取對應(yīng)的特征向量
    [latent, order] = sort(diag(D), 'descend');
    coeff = V(:, order);
    % 計(jì)算主成分得分
    score = X * coeff;
end
function cv = my_cvpartition(n, method, param)
    % n: 總樣本數(shù)
    % method: 分區(qū)方法,目前僅支持 'HoldOut'
    % param: 分區(qū)方法的參數(shù),對于 'HoldOut',該參數(shù)為留出的比例
    % 初始化輸出結(jié)構(gòu)體
    cv = struct('train', [], 'test', []);
    if strcmp(method, 'HoldOut')
        % 生成一個從 1 到 n 的整數(shù)數(shù)組
        idx = 1:n;
        % 隨機(jī)打亂 idx 數(shù)組
        idx = idx(randperm(n));
        % 計(jì)算留出樣本的數(shù)量
        numHoldOut = floor(n * param);
        % 分配訓(xùn)練和測試索引
        cv.test = idx(1:numHoldOut);
        cv.train = idx(numHoldOut+1:end);
    else
        error('Unsupported partition method.');
    end
end
function SVMModel = my_fitcecoc(X_train, Y_train, C)
    % X_train: 特征矩陣 (n x d),其中 n 是樣本數(shù),d 是特征維度
    % Y_train: 標(biāo)簽向量 (n x 1)
    % C: 正則化參數(shù),控制對錯分樣本的懲罰程度
    % 獲取類別數(shù)量
    uniqueClasses = unique(Y_train);
    numClasses = length(uniqueClasses);
    % 初始化 SVM 模型結(jié)構(gòu)體數(shù)組
    SVMModel = struct('Classifiers', cell(numClasses*(numClasses-1)/2, 1), ...
    'ClassPairs', [], 'ClassPairsIndex', [], 'UniqueClasses', uniqueClasses);
    % 訓(xùn)練一對一 SVM 分類器
    classifierIndex = 1;
    for i = 1:numClasses
        for j = (i+1):numClasses
            % 提取當(dāng)前類別對的訓(xùn)練數(shù)據(jù)
            classI = Y_train == uniqueClasses(i);
            classJ = Y_train == uniqueClasses(j);
            X_train_ij = [X_train(classI, :); X_train(classJ, :)];
            Y_train_ij = [ones(sum(classI), 1); -1*ones(sum(classJ), 1)];
            % 訓(xùn)練 SVM 分類器
            SVMModel.Classifiers{classifierIndex} = my_fitcsvm_soft(X_train_ij, Y_train_ij, C);
            % 記錄當(dāng)前分類器對應(yīng)的類別對
            SVMModel.ClassPairs(classifierIndex, :) = [uniqueClasses(i), uniqueClasses(j)];
            SVMModel.ClassPairsIndex(classifierIndex, :) = [i,j];
            classifierIndex = classifierIndex + 1;
        end
    end
end
function [wb] = my_fitcsvm(X, Y)
    % X: 特征矩陣 (n x d),其中 n 是樣本數(shù),d 是特征維度
    % Y: 標(biāo)簽向量 (n x 1),取值為 +1 或 -1
    load_plugin("optimization");
    % 假設(shè)X和Y已經(jīng)定義,如之前的示例
    N = size(X, 1); % 數(shù)據(jù)點(diǎn)的數(shù)量
    D = size(X,2); % 數(shù)據(jù)的維度
    % 將w和b組合成一個向量,以便使用quadprog
    % 注意:這里我們將w放在前面,b放在最后
    p = rand(D + 1, 1); % 初始猜測解(通常設(shè)為0)
    Aeq = []; % 沒有等式約束
    beq = [];
    % 構(gòu)造二次規(guī)劃的目標(biāo)函數(shù)和線性不等式約束
    H = eye(D+1); % Hessian矩陣(目標(biāo)函數(shù)的二次項(xiàng)系數(shù))
    f = zeros(D+1,1); % 目標(biāo)函數(shù)的一次項(xiàng)系數(shù)(對于SVM原始問題,通常為負(fù))
    % 線性不等式約束 Ax <= b
    % 對于每個數(shù)據(jù)點(diǎn) (x_i, y_i),我們有 y_i * (w' * x_i + b) >= 1
    A = [-Y.*X, -Y]; % 不等式約束的系數(shù)矩陣
    b = -ones(N, 1); % 不等式約束的右側(cè)向量
    % 使用quadprog求解二次規(guī)劃問題
    options = optimoptions('quadprog','Algorithm','interior-point');
    [w_b, fval, exitflag, output] = quadprog(H, f, A, b, Aeq, beq, [], [], p, options);
    % 分離出w和b
    w = w_b(1:D);
    b = w_b(D+1);
    wb = struct('w',w,'b',b);
end
function [wb] = my_fitcsvm_soft(X, Y, C)
    % X: 特征矩陣 (n x d),其中 n 是樣本數(shù),d 是特征維度
    % Y: 標(biāo)簽向量 (n x 1),取值為 +1 或 -1
    % C: 正則化參數(shù),控制對錯分樣本的懲罰程度
    % 假設(shè)X和Y已經(jīng)定義,如之前的示例
    N = size(X, 1); % 數(shù)據(jù)點(diǎn)的數(shù)量
    D = size(X, 2); % 數(shù)據(jù)的維度
    % 初始化松弛變量(slack variables)
    xi = zeros(N, 1);
    % 將w和b以及松弛變量組合成一個向量,以便使用quadprog
    p = zeros(D + 1 + N, 1); % 初始猜測解
    % 構(gòu)造二次規(guī)劃的目標(biāo)函數(shù)和線性不等式約束
    H = [diag( [ones(1,D),0] ), zeros(D+1, N); zeros(N, D+1), zeros(N,N)]; % Hessian矩陣
    f = [zeros(D+1, 1); C*ones(N, 1)]; % 目標(biāo)函數(shù)的一次項(xiàng)系數(shù)
    % 線性不等式約束 Ax <= b
    % 對于每個數(shù)據(jù)點(diǎn) (x_i, y_i),我們有 y_i * (w' * x_i + b) >= 1 - xi_i
    A = [-Y.*X, -Y, diag( -ones(1,N) )]; % 不等式約束的系數(shù)矩陣
    b = -ones(N, 1); % 不等式約束的右側(cè)向量
    Aeq = []; % 沒有等式約束
    beq = [];
    lb = [ -inf*ones(D+1,1); zeros(N,1)];
    ub = inf*ones(D+1+N,1);
    % 使用quadprog求解二次規(guī)劃問題
    options = optimoptions('quadprog','Algorithm','interior-point');
    [w_b_xi, fval, exitflag, output] = quadprog(H, f, A, b, Aeq, beq, lb, ub, p, options)
    % 分離出w, b和xi
    w = w_b_xi(1:D);
    b = w_b_xi(D+1);
    xi = w_b_xi(D+2:end);
    % 構(gòu)造并返回結(jié)構(gòu)體wb,包含w和b
    wb = struct('w', w, 'b', b);
end
function [label, score] = predict(SVMModel, X_test)
    % SVMModel: 訓(xùn)練好的多類SVM模型,由my_fitcecoc函數(shù)返回
    % X_test: 測試集特征數(shù)據(jù)
    % label: 預(yù)測的類別標(biāo)簽
    % score: 預(yù)測的得分(可選,這里簡化為投票得分)
    % 初始化預(yù)測標(biāo)簽和得分
    [numTest, ~] = size(X_test);
    numClasses = length(SVMModel.Classifiers);
    label = zeros(numTest, 1);
    score = zeros(numTest, numClasses);
    % 對每個測試樣本進(jìn)行預(yù)測
    for i = 1:numTest
        sample = X_test(i, :);
        votes = zeros(1, numClasses+1);
        % 使用每個SVM分類器進(jìn)行預(yù)測,并進(jìn)行投票
        for j = 1:numClasses
            svmModel = SVMModel.Classifiers{j};
            [~, ~, ~, output] = predictOneVsAll(svmModel, sample);
            if output == 1
                classIdx1 = SVMModel.ClassPairsIndex(j, 1);
                votes(classIdx1) = votes(classIdx1) + 1;
            else
                classIdx2 = SVMModel.ClassPairsIndex(j, 2);
                votes(classIdx2) = votes(classIdx2) + 1;
            end
        end
        % 找到得票最多的類別作為預(yù)測標(biāo)簽
        [~, maxVoteIdx] = max(votes);
        label(i) = SVMModel.UniqueClasses(maxVoteIdx);
        score(i, maxVoteIdx) = votes(maxVoteIdx); % 將最高票數(shù)作為得分
    end
end
function [predictedLabel, predictedScore, decisionValues, output] = predictOneVsAll(svmModel, sample)
    % 使用單個SVM模型進(jìn)行預(yù)測
    % 這里簡化為直接計(jì)算決策函數(shù)的值,實(shí)際應(yīng)用中可能需要更復(fù)雜的處理
    w = svmModel.w;
    b = svmModel.b;
    decisionValues = dot(w, sample) + b;
if decisionValues >= 0
        predictedLabel = 1; % 屬于正類
    else
        predictedLabel = -1; % 屬于負(fù)類
    end
    predictedScore = abs(decisionValues); % 決策函數(shù)的絕對值作為得分
    output = predictedLabel; % 用于投票的輸出
end


處理非連續(xù)或非標(biāo)準(zhǔn)化標(biāo)簽

處理非連續(xù)或非標(biāo)準(zhǔn)化標(biāo)簽(例如,不是從1開始的整數(shù)或不是連續(xù)整數(shù))是機(jī)器學(xué)習(xí)中的一個常見問題。在我的SVM分類器實(shí)現(xiàn)中,為了處理這種情況,我引入了SVMModel.UniqueClasses和SVMModel.ClassPairsIndex兩個字段。下面我將詳細(xì)解釋這兩個字段的作用以及如何在預(yù)測過程中使用它們。

SVMModel.UniqueClasses

SVMModel.UniqueClasses存儲了數(shù)據(jù)集中所有唯一的類別標(biāo)簽。當(dāng)訓(xùn)練數(shù)據(jù)中的標(biāo)簽不是從1開始的連續(xù)整數(shù)時,這個字段特別有用。例如,如果標(biāo)簽是[-1, 0, 2],那么UniqueClasses就會是[-1, 0, 2]。

在訓(xùn)練過程中,這個字段用于記錄所有不同的標(biāo)簽,以便在預(yù)測時能夠正確地將預(yù)測的類別索引映射回原始標(biāo)簽。

SVMModel.ClassPairsIndex

SVMModel.ClassPairsIndex存儲了訓(xùn)練一對一SVM分類器時所使用的類別對的索引。由于我們可能不能直接使用原始標(biāo)簽作為索引(尤其是當(dāng)它們不是從1開始的連續(xù)整數(shù)時),我們需要一個從1開始的連續(xù)整數(shù)索引來標(biāo)識不同的類別。這個索引在訓(xùn)練SVM分類器和投票過程中都是必要的。

例如,如果UniqueClasses是[-1, 0, 2],我們可以為這些類別分配一個從1開始的索引:-1對應(yīng)索引1,0對應(yīng)索引2,2對應(yīng)索引3。然后,ClassPairsIndex就會存儲這些索引對應(yīng)的類別對,例如[1, 2]、[1, 3]和[2, 3]。

在預(yù)測過程中使用這些字段

在預(yù)測過程中,SVMModel.UniqueClasses和SVMModel.ClassPairsIndex一起使用來確保正確的類別映射。以下是一個簡化的流程:

  • 對于測試集中的每個樣本,使用所有的一對一SVM分類器進(jìn)行預(yù)測。

  • 根據(jù)每個分類器的預(yù)測結(jié)果(正類或負(fù)類)進(jìn)行投票。但是,由于我們使用了從1開始的連續(xù)整數(shù)索引來標(biāo)識類別,因此投票結(jié)果也是基于這些索引的。

  • 找到得票最多的索引(例如,索引2)。

  • 使用SVMModel.ClassPairsIndex(如果必要的話)和SVMModel.UniqueClasses將得票最多的索引轉(zhuǎn)換回原始標(biāo)簽。在這個例子中,索引2對應(yīng)UniqueClasses中的第二個元素,即標(biāo)簽0。

  • 返回預(yù)測的原始標(biāo)簽作為預(yù)測結(jié)果。

通過這種方式,即使訓(xùn)練數(shù)據(jù)中的標(biāo)簽不是從1開始的連續(xù)整數(shù),我的SVM分類器實(shí)現(xiàn)也能夠正確地預(yù)測類別并返回原始標(biāo)簽。

軟間隔的SVM(支持向量機(jī))算法

軟間隔的SVM(支持向量機(jī))算法是為了解決線性不可分或存在噪聲數(shù)據(jù)的問題而引入的。在硬間隔SVM中,所有樣本都必須被正確地分類,這在實(shí)際應(yīng)用中往往很難滿足。軟間隔SVM則允許部分樣本被錯誤分類,通過在目標(biāo)函數(shù)中引入一個懲罰項(xiàng)(或稱為損失函數(shù))來控制這種錯誤分類的程度。

軟間隔SVM的算法可以通過二次規(guī)劃問題來描述。二次規(guī)劃問題是一個優(yōu)化問題,它涉及最小化或最大化一個二次函數(shù),同時滿足一組線性不等式約束。在軟間隔SVM中,這個二次函數(shù)通常與超平面的參數(shù)(如權(quán)重向量w和偏置項(xiàng)b)有關(guān),而約束條件則與樣本點(diǎn)到超平面的距離和分類正確性有關(guān)。


下面是軟間隔SVM二次規(guī)劃問題的標(biāo)準(zhǔn)形式:

image.png

image.png

靈感來自盧朓老師《數(shù)值方法:原理、算法及應(yīng)用》課堂 學(xué)生大作業(yè)~

學(xué)生作業(yè)的原代碼是用MATLAB寫的,以上為盧朓老師修改之后可以在北太天元上運(yùn)行的代碼分享

原視頻見下方:


回復(fù)

回復(fù)

重置 提交