1. 程式人生 > >第三章 數學建模

第三章 數學建模

一、數學建模概述 1.數學建模演算法內容 這裡寫圖片描述 2.線性迴歸 這裡寫圖片描述 3.KNN最鄰近分類 這裡寫圖片描述 4.PCA主成分分析 這裡寫圖片描述 5.K-means聚類 這裡寫圖片描述 6.蒙塔卡羅模擬 這裡寫圖片描述

二、線性迴歸 1.線性迴歸理論概述 這裡寫圖片描述這裡寫圖片描述 這裡寫圖片描述這裡寫圖片描述 這裡寫圖片描述 2.線性迴歸的python實現方法 線性迴歸通常是人們在學習預測模型時首選的技術之一。在這種技術中,因變數是連續的,自變數可以是連續的也可以是離散的,迴歸線的性質是線性的。 線性迴歸使用最佳的擬合直線(也就是迴歸線)在因變數(Y)和一個或多個自變數(X)之間建立一種關係 ① 資料示例

from sklearn.linear_model import LinearRegression   # 匯入線性迴歸模組
rng = np.random.RandomState(1)   # np.random.RandomState → 隨機數種子,對於一個隨機數發生器,只要該種子(seed)相同,產生的隨機數序列就是相同的
xtrain = 10 * rng.rand(30)
ytrain = 8 + 4 * xtrain + rng.rand(30)   # 樣本關係:y = 8 + 4*x
xtest = np.linspace(0,10,1000)   # 建立測試資料xtest,並根據擬合曲線求出ytest
ytest = model.predict(xtest[:,np.newaxis])   # model.predict → 預測

② 誤差

ytest2 = model.predict(xtrain[:,np.newaxis])  # 樣本資料x在擬合直線上的y值
plt.plot([xtrain,xtrain],[ytrain,ytest2],color = 'gray')  # 誤差線

③ 求解a(斜率)、b(截距)

model = LinearRegression()   # LinearRegression → 線性迴歸評估器,用於擬合數據得到擬合直線
model.fit(xtrain[:,np.newaxis],ytrain)   # 迴歸擬合 # model.fit(x,y) → 擬合直線,引數分別為x與y   # x[:,np.newaxis] → 將陣列變成(n,1)形狀
print('斜率a為:%.4f' % model.coef_[0])
print('截距b為:%.4f' % model.intercept_)
print('線性迴歸函式為:\ny = %.4fx + %.4f' % (model.coef_[0],model.intercept_))   # 引數輸出

④ 多元線性迴歸

df = pd.DataFrame(xtrain, columns = ['b1','b2','b3','b4'])
df['y'] = ytrain
model = LinearRegression()
model.fit(df[['b1','b2','b3','b4']],df['y'])   # 多元迴歸擬合
print('斜率a為:' ,model.coef_)
print('截距b為:%.4f' % model.intercept_)
print('線性迴歸函式為:\ny = %.1fx1 + %.1fx2 + %.1fx3 + %.1fx4 + %.1f' 
      % (model.coef_[0],model.coef_[1],model.coef_[2],model.coef_[3],model.intercept_))

3.線性迴歸模型評估 通過幾個引數驗證迴歸模型 SSE(和方差、誤差平方和):The sum of squares due to error MSE(均方差、方差):Mean squared error RMSE(均方根、標準差):Root mean squared error R-square(確定係數) Coefficient of determination 這裡寫圖片描述這裡寫圖片描述這裡寫圖片描述

ytest = model.predict(xtrain[:,np.newaxis])  # 求出預測資料
mse = metrics.mean_squared_error(ytrain,ytest)  # 求出均方差
rmse = np.sqrt(mse)  # 求出均方根

ssr = ((ytest - ytrain.mean())**2).sum()  # 求出預測資料與原始資料均值之差的平方和
sst = ((ytrain - ytrain.mean())**2).sum()  # 求出原始資料和均值之差的平方和
r2 = ssr / sst # 求出確定係數

r2 = model.score(xtrain[:,np.newaxis],ytrain)  # 求出確定係數
# 確定係數R-square非常接近於1,線性迴歸模型擬合較好

三、KNN最鄰近分類 這裡寫圖片描述這裡寫圖片描述

from sklearn import neighbors   # 匯入KNN分類模組
import warnings
from sklearn import datasets
warnings.filterwarnings('ignore')    # 不發出警告
knn = neighbors.KNeighborsClassifier()   # 取得knn分類器
knn.fit(data[['fight','kiss']], data['type'])
print('預測電影型別為:', knn.predict([18, 90]))
# 載入資料,構建KNN分類模型
# 預測未知資料

四、PCA主成分分析 這裡寫圖片描述這裡寫圖片描述這裡寫圖片描述這裡寫圖片描述這裡寫圖片描述這裡寫圖片描述

from sklearn.decomposition import PCA    # 載入主成分分析模組PCA # sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False)  
pca = PCA(n_components = 1)    # n_components = 1 → 降為1維 # n_components:  PCA演算法中所要保留的主成分個數n,也即保留下來的特徵個數n
pca.fit(df)     # 構建模型 # fit(X,y=None) → 呼叫fit方法的物件本身。比如pca.fit(X),表示用X對pca這個物件進行訓練
print(pca.explained_variance_)    # 輸出特徵值 # explained_variance_ratio_:返回 所保留的n個成分各自的方差百分比。
print(pca.components_)   # 輸出特徵向量 # components_:返回具有最大方差的成分
x_pca = pca.fit_transform(df)   # 資料轉換 # fit_transform(X) → 用X來訓練PCA模型,同時返回降維後的資料,這裡x_pca就是降維後的資料
x_new = pca.inverse_transform(x_pca)   #inverse_transform() → 將降維後的資料轉換成原始資料 # 主成分分析,生成新的向量x_pca

from sklearn.datasets import load_digits  # 多維資料降維
digits = load_digits()

五、K_means聚類 這裡寫圖片描述這裡寫圖片描述這裡寫圖片描述

# 建立資料
from sklearn.datasets.samples_generator import make_blobs   # make_blobs聚類資料生成器
x,y_true = make_blobs(n_samples = 300,   # 生成300條資料,n_samples → 待生成的樣本的總數。
                     centers = 4,        # 四類資料,centers → 類別數
                     cluster_std = 0.5,  # 方差一致,cluster_std → 每個類別的方差,如多類資料不同方差,可設定為[1.0,3.0](這裡針對2類資料)
                     random_state = 0)   # random_state → 隨機數種子
# 構建K均值模型
from sklearn.cluster import KMeans   # 匯入模組
kmeans = KMeans(n_clusters = 4)  # 這裡為4簇
kmeans.fit(x)
y_kmeans = kmeans.predict(x)   # 構建模型,並預測出樣本的類別y_kmeans
centroids = kmeans.cluster_centers_   # kmeans.cluster_centers_:得到不同簇的中心點

六、蒙塔卡羅模擬 基本原理 ① π的計算

from matplotlib.patches import Circle
# numpy.random.uniform(low,high,size) → 從一個均勻分佈[low,high)中隨機取樣,均勻分佈
d = np.sqrt((x-a)**2 + (y-b)**2)   # 計算點到圓心的距離
res = sum(np.where(d < r, 1, 0))   # 統計落在圓內的點的數目
pi = 4 * res / n   # 計算 pi (π)的近似值 → Monte Carlo方法:用統計值去近似真實值
plt.plot(x,y,'ro',markersize = 1)   #繪製正方形
circle = Circle(xy = (a,b),radius = r, alpha = 0.5 ,color = 'gray')
axes.add_patch(circle)   #繪製圓

② 計算積分 y = x**2

def f(x):
    return x**2   # 建立函式 y = x**2
res = sum(np.where(y < f(x), 1, 0))   # 統計 落在函式 y=x^2影象下方的點的數目
integral = res / n   # 計算定積分的近似值,落在下方的概率  # n:投點次數

③ 排隊上廁所問題

startingtime[0] = arrivingtime[0]  # 第一個人之前沒有人,所以開始時間 = 到達時間
finishtime[0] = startingtime[0] + workingtime[0]   # 第一個人完成時間 = 開始時間 + “工作”時間
waitingtime[0] = startingtime[0]-arrivingtime[0]   # 第一個人不用等待
for i in range(1,len(arrivingtime)):
    if finishtime[i-1] > arrivingtime[i]:
        startingtime[i] = finishtime[i-1]
    else:
        startingtime[i] = arrivingtime[i]
        emptytime[i] = arrivingtime[i] - finishtime[i-1]
    finishtime[i] = startingtime[i] + workingtime[i]
    waitingtime[i] = startingtime[i] - arrivingtime[i]
    print('第%d個人:到達時間 開始時間 “工作”時間 完成時間 等待時間\n' %i,
          arrivingtime[i],startingtime[i],workingtime[i],finishtime[i],waitingtime[i],
         '\n')
print('arerage waiting time is %f' %np.mean(waitingtime))