1、什么是線性回歸糊探?
回歸分析(Regression analysis)是一種統(tǒng)計分析方法挎狸,研究自變量和因變量之間的定量關(guān)系《峡回歸分析不僅包括建立數(shù)學(xué)模型并估計模型參數(shù)锨匆,檢驗數(shù)學(xué)模型的可信度,也包括利用建立的模型和估計的模型參數(shù)進(jìn)行預(yù)測或控制冬筒。按照輸入輸出變量關(guān)系的類型恐锣,回歸分析可以分為線性回歸和非線性回歸。
線性回歸(Linear regression) 假設(shè)樣本數(shù)據(jù)集中的輸出變量(y)與輸入變量(X)存在線性關(guān)系舞痰,即輸出變量是輸入變量的線性組合土榴。線性模型是最簡單的模型,也是非常重要和應(yīng)用廣泛的模型响牛。
如果模型只有一個輸入變量和一個輸出變量玷禽,稱為一元線性模型赫段,可以用一條直線來描述輸出與輸入的關(guān)系,其表達(dá)式是一元一次方程:
y = w0 + w1*x1 + e
如果模型包括兩個或多個輸入變量矢赁,則稱為多元線性模型糯笙,可以用一個平面或超平面來描述輸出與輸入的關(guān)系,其表達(dá)式是多元一次方程:
Y = w0 + w1*x1 + w2*x2+...+ wm*xm + e
采用最小二乘法(Least square method)可以通過樣本數(shù)據(jù)來估計回歸模型的參數(shù)撩银,使模型的輸出與樣本數(shù)據(jù)之間的誤差平方和最小给涕。
回歸分析還要進(jìn)一步分析究竟能不能采用線性回歸模型,或者說線性關(guān)系的假設(shè)是否合理额获、線性模型是否具有良好的穩(wěn)定性够庙?這就需要使用統(tǒng)計分析進(jìn)行顯著性檢驗,檢驗輸入與輸出變量之間的線性關(guān)系是否顯著抄邀,用線性模型來描述它們之間的關(guān)系是否恰當(dāng)耘眨。
2、SKlearn 中的線性回歸方法(sklearn.linear_model)
以機(jī)器學(xué)習(xí)的角度來看撤摸,回歸是廣泛應(yīng)用的預(yù)測建模方法毅桃,線性回歸是機(jī)器學(xué)習(xí)中重要的基礎(chǔ)算法。SKlearn 機(jī)器學(xué)習(xí)工具包提供了豐富的線性模型學(xué)習(xí)方法准夷,最重要和應(yīng)用最廣泛的無疑是普通最小二乘法(Ordinary least squares钥飞,OLS),此外多項式回歸(Polynomial regression)衫嵌、邏輯回歸(Logistic Regression)和嶺回歸(Ridge regression)也較為常用读宙,將在本文及后續(xù)文中介紹。其它方法相對比較特殊楔绞,以下根據(jù)官網(wǎng)介紹給出簡要說明结闸,普通讀者可以略過。
- 普通最小二乘法(Ordinary least squares):
以模型預(yù)測值與樣本觀測值的殘差平方和最小作為優(yōu)化目標(biāo)酒朵。 - 嶺回歸(Ridge regression)
在普通最小二乘法的基礎(chǔ)上增加懲罰因子以減少共線性的影響桦锄,以帶懲罰項(L2正則化)的殘差平方和最小作為優(yōu)化目標(biāo)。在指標(biāo)中同時考慮了較好的學(xué)習(xí)能力以及較小的慣性能量蔫耽,以避免過擬合而導(dǎo)致模型泛化能力差结耀。 - Lasso 回歸(Least absolute shrinkage and selection operator)
在普通最小二乘法的基礎(chǔ)上增加絕對值偏差作為懲罰項(L1正則化)以減少共線性的影響,在擬合廣義線性模型的同時進(jìn)行變量篩選和復(fù)雜度調(diào)整匙铡,適用于稀疏系數(shù)模型图甜。 - 多元 Lasso 回歸(Multi-task Lasso)
用于估計多元回歸稀疏系數(shù)的線性模型。注意不是指多線程或多任務(wù)鳖眼,而是指對多個輸出變量篩選出相同的特征變量(也即回歸系數(shù)整列為 0黑毅,因此該列對應(yīng)的輸入變量可以被刪除)。 - 彈性網(wǎng)絡(luò)回歸(Elastic-Net)
引入L1和L2范數(shù)正則化而構(gòu)成帶有兩種懲罰項的模型钦讳,相當(dāng)于嶺回歸和 Lasso 回歸的組合矿瘦。 - Multi-task Elastic-Net
用于估計多元回歸稀疏系數(shù)線性模型的彈性網(wǎng)絡(luò)回歸方法枕面。 - 最小角回歸算法(Least Angle Regression)
結(jié)合前向梯度算法和前向選擇算法,在保留前向梯度算法的精確性的同時簡化迭代過程匪凡。每次選擇都加入一個與相關(guān)度最高的自變量膊畴,最多 m步就可以完成求解。特別適合于特征維度遠(yuǎn)高于樣本數(shù)的情況病游。 - LARS Lasso
使用最小角回歸算法求解 Lasso模型唇跨。 - 正交匹配追蹤法(Orthogonal Matching Pursuit)
用于具有非零系數(shù)變量數(shù)約束的近似線性模型。在分解的每一步進(jìn)行正交化處理衬衬,選擇刪除與當(dāng)前殘差最大相關(guān)的列买猖,反復(fù)迭代達(dá)到所需的稀疏程度。 - 貝葉斯回歸(Bayesian Regression)
用貝葉斯推斷方法求解的線性回歸模型滋尉,具有貝葉斯統(tǒng)計模型的基本性質(zhì)玉控,可以求解權(quán)重系數(shù)的概率密度函數(shù)∈ㄏВ可以被用于觀測數(shù)據(jù)較少但要求提供后驗分布的問題高诺,例如對物理常數(shù)的精確估計;也可以用于變量篩選和降維碾篡。 - 邏輯回歸(Logistic Regression)
邏輯回歸是一種廣義線性模型虱而,研究順序變量或?qū)傩宰兞孔鳛檩敵龅膯栴},實際是一種分類方法开泽。通過線性模型加Sigmoid映射函數(shù)牡拇,將線性模型連續(xù)型輸出變換為離散值。常用于估計某種事物的可能性穆律,如尋找危險因素惠呼、預(yù)測發(fā)病概率、判斷患病概率峦耘,是流行病學(xué)和醫(yī)學(xué)中最常用的分析方法剔蹋。 - 廣義線性回歸(Generalized Linear Regression)
廣義線性回歸是線性回歸模型的推廣,實際上是非線性模型辅髓。通過單調(diào)可微的聯(lián)結(jié)函數(shù)泣崩,建立輸出變量與輸入變量的線性關(guān)系,將問題簡潔直接地轉(zhuǎn)化為線性模型來處理利朵。 - 隨機(jī)梯度下降(Stochastic Gradient Descent)
梯度下降是一種基于搜索的最優(yōu)化方法,用梯度下降法來求損失函數(shù)最小時的參數(shù)估計值猎莲,適用樣本數(shù)(和特征數(shù))非常非常大的情況绍弟。隨機(jī)梯度下降法在計算下降方向時,隨機(jī)選一個數(shù)據(jù)進(jìn)行計算著洼,而不是掃描全部訓(xùn)練數(shù)據(jù)集樟遣,加快了迭代速度而叼。 - 感知機(jī)(Perceptron)
感知機(jī)是一種適合大規(guī)模學(xué)習(xí)的簡單分類算法。訓(xùn)練速度比SGD稍快豹悬,并且產(chǎn)生的模型更稀疏葵陵。 - 被動攻擊算法(Passive Aggressive Algorithms)
被動攻擊算法是一類用于大規(guī)模學(xué)習(xí)的算法。 - 魯棒性回歸(Robustness regression)
魯棒性回歸的目的是在存在損壞數(shù)據(jù)的情況下擬合回歸模型瞻佛,如存在異常值或錯誤的情況脱篙。 - 多項式回歸(Polynomial regression)
多項式回歸通過構(gòu)造特征變量的多項式來擴(kuò)展簡單的線性回歸模型。例如將特征變量組合成二階多項式伤柄,可以將拋物面擬合到數(shù)據(jù)中绊困,從而具有更廣泛的靈活性和適應(yīng)性。
3适刀、SKlearn 中的最小二乘線性回歸方法
3.1 最小二乘線性回歸類(LinearRegression )
SKlearn 包中的 LinearRegression() 方法秤朗,不宜從字面理解為線性回歸方法, LinearRegression() 僅指基于普通最小二乘法(OLS)的線性回歸方法笔喉。
sklearn.linear_model.LinearRegression 類是 OLS 線性回歸算法的具體實現(xiàn)取视,官網(wǎng)介紹詳見:https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html#sklearn.linear_model.LinearRegression
sklearn.linear_model.LinearRegression()
class sklearn.linear_model.LinearRegression(*, fit_intercept=True, normalize=False, copy_X=True, n_jobs=None, positive=False)
LinearRegression() 類的參數(shù)不多,通常幾乎不需要設(shè)置常挚。
- fit_intercept:bool, default=True 是否計算截距作谭。默認(rèn)值 True,計算截距待侵。
- normalize:bool, default=False 是否進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化丢早,該參數(shù)僅在 fit_intercept = True 時有效。
- n_jobs:int, default=None 計算時設(shè)置的任務(wù)數(shù)秧倾,為 n>1和大規(guī)模問題提供加速怨酝。默認(rèn)值 任務(wù)數(shù)為 1。
LinearRegression() 類的主要屬性:
- coef_: 線性系數(shù)那先,即模型參數(shù) w1... 的估計值
- intercept_: 截距农猬,即模型參數(shù) w0 的估計值
LinearRegression() 類的主要方法:
- fit(X,y[,sample_weight]) 用樣本集(X, y)訓(xùn)練模型。sample_weight 為每個樣本設(shè)權(quán)重售淡,默認(rèn)None斤葱。
- get_params([deep]) 獲取模型參數(shù)。注意不是指模型回歸系數(shù)揖闸,而是指fit_intercept,normalize等參數(shù)揍堕。
- predict(X) 用訓(xùn)練的模型預(yù)測數(shù)據(jù)集 X 的輸出。即可以對訓(xùn)練樣本給出模型輸出結(jié)果汤纸,也可以對測試樣本給出預(yù)測結(jié)果衩茸。
- score(X,y[,sample_weight]) R2 判定系數(shù),是常用的模型評價指標(biāo)贮泞。
3.2 一元線性回歸
LinearRegression 使用例程:
# skl_LinearR_v1a.py
# Demo of linear regression by scikit-learn
# Copyright 2021 YouCans, XUPT
# Crated:2021-05-12
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, median_absolute_error
# 生成測試數(shù)據(jù):
nSample = 100
x = np.linspace(0, 10, nSample) # 起點為 0楞慈,終點為 10幔烛,均分為 nSample個點
e = np.random.normal(size=len(x)) # 正態(tài)分布隨機(jī)數(shù)
y = 2.36 + 1.58 * x + e # y = b0 + b1*x1
# 按照模型要求進(jìn)行數(shù)據(jù)轉(zhuǎn)換:輸入是 array類型的 n*m 矩陣,輸出是 array類型的 n*1 數(shù)組
x = x.reshape(-1, 1) # 輸入轉(zhuǎn)換為 n行 1列(多元回歸則為多列)的二維數(shù)組
y = y.reshape(-1, 1) # 輸出轉(zhuǎn)換為 n行1列的二維數(shù)組
# print(x.shape,y.shape)
# 一元線性回歸:最小二乘法(OLS)
modelRegL = LinearRegression() # 創(chuàng)建線性回歸模型
modelRegL.fit(x, y) # 模型訓(xùn)練:數(shù)據(jù)擬合
yFit = modelRegL.predict(x) # 用回歸模型來預(yù)測輸出
# 輸出回歸結(jié)果 # YouCans
print('回歸截距: w0={}'.format(modelRegL.intercept_)) # w0: 截距
print('回歸系數(shù): w1={}'.format(modelRegL.coef_)) # w1,..wm: 回歸系數(shù)
# 回歸模型的評價指標(biāo) # XUPT
print('R2 確定系數(shù):{:.4f}'.format(modelRegL.score(x, y))) # R2 判定系數(shù)
print('均方誤差:{:.4f}'.format(mean_squared_error(y, yFit))) # MSE 均方誤差
print('平均絕對值誤差:{:.4f}'.format(mean_absolute_error(y, yFit))) # MAE 平均絕對誤差
print('中位絕對值誤差:{:.4f}'.format(median_absolute_error(y, yFit))) # 中值絕對誤差
# 繪圖:原始數(shù)據(jù)點囊蓝,擬合曲線
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(x, y, 'o', label="data") # 原始數(shù)據(jù)
ax.plot(x, yFit, 'r-', label="OLS") # 擬合數(shù)據(jù)
ax.legend(loc='best') # 顯示圖例
plt.title('Linear regression by SKlearn (Youcans)')
plt.show() # YouCans, XUPT
程序說明:
- 線性回歸模型 LinearRegression() 類在模型訓(xùn)練 modelRegL.fit(x, y) 時饿悬,要求輸入 x 和輸出 y 數(shù)據(jù)格式為 array類型的 n*m 矩陣。一元回歸模型 m=1聚霜,也要轉(zhuǎn)換為 n*1 的 array類型:
x = x.reshape(-1, 1) # 輸入轉(zhuǎn)換為 n行 1列(多元回歸則為多列)的二維數(shù)組
y = y.reshape(-1, 1) # 輸出轉(zhuǎn)換為 n行1列的二維數(shù)組
- LinearRegression() 類提供的模型評價指標(biāo)只有 R2指標(biāo)狡恬,但在 sklearn.metrics 包中提供了均方誤差、平均絕對值誤差和中位絕對值誤差俯萎,例程中給出了其使用方法傲宜。
程序運行結(jié)果:
回歸截距: w0=[2.45152704]
回歸系數(shù): w1=[[1.57077698]]
R2 確定系數(shù):0.9562
均方誤差:0.9620
平均絕對值誤差:0.7905
中位絕對值誤差:0.6732
3.2 多元線性回歸
用 LinearRegression() 解決多元線性回歸問題與一元線性回歸的步驟、參數(shù)和屬性都是相同的夫啊,只是要注意樣本數(shù)據(jù)的格式要求:輸入數(shù)據(jù) X 是 array 類型的 n*m 二維數(shù)組函卒,輸出數(shù)據(jù) y 是 array類型的 n*1 數(shù)組(也可以用 n*k 表示多變量輸出)。
問題描述:
數(shù)據(jù)文件 toothpaste.csv 中收集了 30個月牙膏銷售量撇眯、價格报嵌、廣告費用及同期的市場均價。
⌒荛弧(1)分析牙膏銷售量與價格锚国、廣告投入之間的關(guān)系,建立數(shù)學(xué)模型玄坦;
⊙(2)估計所建立數(shù)學(xué)模型的參數(shù),進(jìn)行統(tǒng)計分析煎楣;
〔蜃堋(3)利用擬合模型,預(yù)測在不同價格和廣告費用下的牙膏銷售量择懂。
需要說明的是喻喳,本文例程并不是問題最佳的求解方法和結(jié)果,只是使用該問題及數(shù)據(jù)示范讀取數(shù)據(jù)文件和數(shù)據(jù)處理的方法困曙。
LinearRegression 使用例程:
# skl_LinearR_v1b.py
# Demo of linear regression by scikit-learn
# v1.0d: 線性回歸模型(SKlearn)求解
# Copyright 2021 YouCans, XUPT
# Crated:2021-05-12
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, median_absolute_error
# 主程序
def main(): # 主程序
# 讀取數(shù)據(jù)文件
readPath = "../data/toothpaste.csv" # 數(shù)據(jù)文件的地址和文件名
dfOpenFile = pd.read_csv(readPath, header=0, sep=",") # 間隔符為逗號表伦,首行為標(biāo)題行
dfData = dfOpenFile.dropna() # 刪除含有缺失值的數(shù)據(jù)
print(dfData.head())
# Model 1:Y = b0 + b1*X1 + b2*X2 + e
# 線性回歸:分析因變量 Y(sales) 與 自變量 x1(diffrence)、x2(advertise) 的關(guān)系
# 按照模型要求進(jìn)行數(shù)據(jù)轉(zhuǎn)換:輸入是 array類型的 n*m 矩陣慷丽,輸出是 array類型的 n*1 數(shù)組
feature_cols = ['difference', 'advertise'] # 創(chuàng)建特征列表
X = dfData[feature_cols] # 使用列表選擇樣本數(shù)據(jù)的特征子集
y = dfData['sales'] # 選擇樣本數(shù)據(jù)的輸出變量
# print(type(X),type(y))
# print(X.shape, y.shape)
# 一元線性回歸:最小二乘法(OLS)
modelRegL = LinearRegression() # 創(chuàng)建線性回歸模型
modelRegL.fit(X, y) # 模型訓(xùn)練:數(shù)據(jù)擬合
yFit = modelRegL.predict(X) # 用回歸模型來預(yù)測輸出
# 輸出回歸結(jié)果
print("\nModel1: Y = b0 + b1*x1 + b2*x2")
print('回歸截距: w0={}'.format(modelRegL.intercept_)) # w0: 截距
print('回歸系數(shù): w1={}'.format(modelRegL.coef_)) # w1,..wm: 回歸系數(shù)
# 回歸模型的評價指標(biāo)
print('R2 確定系數(shù):{:.4f}'.format(modelRegL.score(X, y))) # R2 判定系數(shù)
print('均方誤差:{:.4f}'.format(mean_squared_error(y, yFit))) # MSE 均方誤差
print('平均絕對值誤差:{:.4f}'.format(mean_absolute_error(y, yFit))) # MAE 平均絕對誤差
print('中位絕對值誤差:{:.4f}'.format(median_absolute_error(y, yFit))) # 中值絕對誤差
# Model 3:Y = b0 + b1*X1 + b2*X2 + b3*X2**2 + e
# 線性回歸:分析因變量 Y(sales) 與 自變量 x1蹦哼、x2 及 x2平方的關(guān)系
x1 = dfData['difference'] # 價格差,x4 = x1 - x2
x2 = dfData['advertise'] # 廣告費
x5 = x2**2 # 廣告費的二次元
X = np.column_stack((x1,x2,x5)) # [x1,x2,x2**2]
# 多元線性回歸:最小二乘法(OLS)
modelRegM = LinearRegression() # 創(chuàng)建線性回歸模型
modelRegM.fit(X, y) # 模型訓(xùn)練:數(shù)據(jù)擬合
yFit = modelRegM.predict(X) # 用回歸模型來預(yù)測輸出
# 輸出回歸結(jié)果 # YouCans
print("\nModel3: Y = b0 + b1*x1 + b2*x2 + b3*x2**2")
print('回歸截距: w0={}'.format(modelRegM.intercept_)) # w0: 截距, YouCans
print('回歸系數(shù): w1={}'.format(modelRegM.coef_)) # w1,..wm: 回歸系數(shù), XUPT
# 回歸模型的評價指標(biāo)
print('R2 確定系數(shù):{:.4f}'.format(modelRegM.score(X, y))) # R2 判定系數(shù)
print('均方誤差:{:.4f}'.format(mean_squared_error(y, yFit))) # MSE 均方誤差
print('平均絕對值誤差:{:.4f}'.format(mean_absolute_error(y, yFit))) # MAE 平均絕對誤差
print('中位絕對值誤差:{:.4f}'.format(median_absolute_error(y, yFit))) # 中值絕對誤差
# 計算 F統(tǒng)計量 和 F檢驗的 P值
m = X.shape[1]
n = X.shape[0]
yMean = np.mean(y)
SST = sum((y-yMean)**2) # SST: 總平方和
SSR = sum((yFit-yMean)**2) # SSR: 回歸平方和
SSE = sum((y-yFit)**2) # SSE: 殘差平方和
Fstats = (SSR/m) / (SSE/(n-m-1)) # F 統(tǒng)計量
probFstats = stats.f.sf(Fstats, m, n-m-1) # F檢驗的 P值
print('F統(tǒng)計量:{:.4f}'.format(Fstats))
print('FF檢驗的P值:{:.4e}'.format(probFstats))
# 繪圖:原始數(shù)據(jù)點要糊,擬合曲線 #XUPT
fig, ax = plt.subplots(figsize=(8, 6)) # YouCans, XUPT
ax.plot(range(len(y)), y, 'b-.', label='Sample') # 樣本數(shù)據(jù)
ax.plot(range(len(y)), yFit, 'r-', label='Fitting') # 擬合數(shù)據(jù)
ax.legend(loc='best') # 顯示圖例
plt.title('Regression analysis with sales of toothpaste by SKlearn')
plt.xlabel('period')
plt.ylabel('sales')
plt.show()
return
if __name__ == '__main__':
main()
程序運行結(jié)果:
Model1: Y = b0 + b1*x1 + b2*x2
回歸截距: w0=4.4074933246887875
回歸系數(shù): w1=[1.58828573 0.56348229]
R2 確定系數(shù):0.8860
均方誤差:0.0511
平均絕對值誤差:0.1676
中位絕對值誤差:0.1187
Model3: Y = b0 + b1*x1 + b2*x2 + b3*x2**2
回歸截距: w0=17.324368548878198
回歸系數(shù): w1=[ 1.30698873 -3.69558671 0.34861167]
R2 確定系數(shù):0.9054
均方誤差:0.0424
平均絕對值誤差:0.1733
中位絕對值誤差:0.1570
F統(tǒng)計量:82.9409
F檢驗的P值:1.9438e-13
程序說明:
- 用 LinearRegression() 類處理多元線性回歸問題纲熏,模型對訓(xùn)練樣本數(shù)據(jù)的格式要求為:輸入數(shù)據(jù) X 是 array 類型的 n*m 二維數(shù)組,輸出數(shù)據(jù) y 是 array類型的 n*1 數(shù)組(也可以用 n*k 表示多變量輸出)。例程中給出了兩種數(shù)據(jù)轉(zhuǎn)換的方式:Model 1 從 Pandas 的 dataframe 數(shù)據(jù)轉(zhuǎn)換得到模型要求的 array 類型二維數(shù)組赤套,這在 Pandas 讀取數(shù)據(jù)文件時非常方便;Model3 則用 Numpy 的 np.column_stack 數(shù)組拼接獲得 array 類型二維數(shù)組珊膜。
- 本例程的問題和數(shù)據(jù)《Python學(xué)習(xí)筆記-StatsModels 統(tǒng)計回歸(3)模型數(shù)據(jù)的準(zhǔn)備》中相同容握,來自:姜啟源、謝金星《數(shù)學(xué)模型(第 3版)》车柠,高等教育出版社剔氏。
- 為了便于與 StatsModels 統(tǒng)計回歸結(jié)果進(jìn)行比較,例程所采用的模型也與該文一致:Model1 中使用特征變量 'difference', 'advertise' 建立線性回歸模型竹祷,Model3 中使用特征變量 'difference', 'advertise' 及 'advertise' 的二次項( x2**2)建立線性回歸模型谈跛。SKlearn 與 StatsModels 對這兩個模型的參數(shù)估計結(jié)果、預(yù)測結(jié)果和 R2確定系數(shù)都完全相同塑陵,表明用 SKlearn 與 StatsModels 工具包都可以實現(xiàn)線性回歸感憾。
- StatsModels 工具包提供的模型檢驗的指標(biāo)非常全面、詳細(xì)令花,對模型檢驗和統(tǒng)計分析非常重要阻桅。而 SKlearn 包所提供的統(tǒng)計檢驗指標(biāo)很少,F(xiàn)檢驗兼都、T 檢驗嫂沉、相關(guān)系數(shù)的顯著性檢驗指標(biāo)都沒有谍咆,根本原因在于 SKlearn 是機(jī)器學(xué)習(xí)庫而非統(tǒng)計工具箱庙曙,關(guān)注點是模型精度和預(yù)測性能,而不在于模型的顯著性玫芦。
- 為了解決缺少模型顯著性檢驗指標(biāo)的問題慎王,例程中增加了一段 計算 F統(tǒng)計量 和 F檢驗P值 的程序可供參考蚓土。
版權(quán)說明:
本文內(nèi)容及例程為作者原創(chuàng),并非轉(zhuǎn)載書籍或網(wǎng)絡(luò)內(nèi)容柬祠。
YouCans 原創(chuàng)作品
Copyright 2021 YouCans, XUPT
Crated:2021-05-12