第三章 數學建模
阿新 • • 發佈:2018-12-18
一、數學建模概述 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))