cs229學習問題html
notes3 Support Vector Machines算法
2一、如何用機器學習對單個股票下一個交易日漲跌進行預測?app
解答:若是用日數據,找到三個因子,學習一個model,用前一個交易日的三個因子數據預測下一個漲跌,數據標準化後都變爲0,該怎麼辦?dom
20、策略回測時用指數來對衝,實際交易過程當中用指數期貨來交易,這樣是否可行?是否應該用指數期貨來回測?機器學習
解答:函數
1九、數據預處理和PCA(主成分分析)誰應該先進行?爲何?學習
解答:多是先數據預處理,再進行主成分分析。測試
1八、上面寫法(註釋掉的)和下面寫法區別是什麼?應該採用哪一個更好?優化
from sklearn import preprocessing # scaler = preprocessing.StandardScaler().fit(X_train) # X_train = scaler.transform(X_train) # X_cv = scaler.transform(X_cv) x_train=preprocessing.scale(X_train) X_cv=preprocessing.scale(X_cv)
解答:lua
1七、爲何下面兩行代碼結果不一致?會不會是DataFrame的一個bug,分母多除了,原本應該除以2,錯誤地除以4了。
import pandas as pd import numpy as np y=np.array([[1,2,1,2],[3,4,3,4]]) #scale_fun = lambda x: x.min(axis=0)-x.max(axis=0) scale_fun = lambda x: (x - x.mean(axis=0)) / x.std(axis=0) print(scale_fun(y)) print(pd.DataFrame(y).apply(scale_fun,axis=0)) [[-1. -1. -1. -1.] [ 1. 1. 1. 1.]] 0 1 2 3 0 -0.707107 -0.707107 -0.707107 -0.707107 1 0.707107 0.707107 0.707107 0.707107
這是由計算標準差的差別形成的:
pandas中計算標準差用的是極大釋然估計量,分母爲N,即爲2,標準差計算爲(((1-2)**2+(3-2)**2)/(2))**0.5=1**0.5=1
np中計算標準差用的是無偏估計量,分母爲N-1,即爲2-1,標準差計算爲(((1-2)**2+(3-2)**2)/(2-1))**0.5=2**0.5
1六、機器學習模型太多了,(1)、該如何使用各個模型?(2)、該如何用sklearn模塊寫代碼?
對應:sklearn.linear_model.LinearRegression sklearn.linear_model.Ridge sklearn.linear_model.Lasso sklearn.linear_model.ElasticNet
sklearn.linear_model.LogistickRegression sklearn.linear_model.SGDClassifier sklearn.linear_model.SGDClassifier
根據 sklearn algorithm cheat-sheet 流程圖可知,主要模型以下:
regression 迴歸
SGD Regression sklearn.linear_model.SGDRegressor
dimensionality reduction 降維
Randomized PCA--->(not working)--->kernel approximation 核近似 sklearn.decomposition.PCA() sklearn.decomposition.KernelPCA()
sklearn.decomposition.RandomizedPCA() to be removed in 0.20
classification 分類
SGD Classifier--->(not working)--->kernel approximation sklearn.linear_model.SGDClassifier ???kernel???
clustering 聚合
number of categories known--->MiniBatch KMeans
我的見解:若是對股票聚合,前提是知道將股票分爲幾類,但通常不可知,聚合可能不適合。
1五、如何衡量學習結果如何?
svm:metrics.accuracy_score(y_curr_month,y_pred_curr_month) metrics.roc_auc_score(y_curr_month,y_score_curr_month))
linear:
1四、sklearn中linear_model.SGDClassifier中y_train是用的標籤仍是直接用的選取後的return?
http://scikit-learn.org/stable/auto_examples/linear_model/plot_sgd_separating_hyperplane.html#sphx-glr-auto-examples-linear-model-plot-sgd-separating-hyperplane-py
解答:經過上面例子,應該是標籤。分類預測的是標籤。
1三、機器學習中一個model在測試集中沒有更新,直觀來講,應該時刻更新,用到最新的數據作預測,如何作到這一點呢?
十二、SVM機器學習中,分類測試結果時好時壞,該怎麼處理?
十一、如何理解:w*x+b=0,對於特徵空間R中的一個超平面S,其中w是超平面的法向量,b是超平面的截距,這個超平面將特徵空間劃分爲兩個部分,位於兩部分的點(特徵向量)分別被分爲正負兩類。所以,超平面S稱爲分離超平面。
解答:超平面的法向量爲超平面方程前面係數,位於超平面下方的點與超平面相乘後加上截距項必然爲負,由於x往下移動過,同理位於超平面上方的點。
十、監督學習假設輸入與輸出的隨機變量X和Y遵循聯合機率分佈P(X,Y)。P(X,Y)表示分佈函數,或分佈密度函數。統計學習假設數據存在必定的統計規律,X和Y具備聯合機率分佈的假設就是監督學習關於數據的基本假設?爲何是這樣的?
解答:
九、統計學習三要素:模型、策略和算法。策略、算法分別是什麼含義?
數學模型:一個或一組代數方程、微分方程、差分方程、積分方程或統計學方程,經過這些方程定量或定性地描述各變量之間的相互關係或因果關係。
數學模型描述的是系統的行爲和特徵,而不是系統的實際結構。
解答,策略:即考慮按照什麼樣的準則學習或選擇最優的模型,統計學習目的在於從假設空間中選取最優模型。引入損失函數、風險函數、經驗風險最小化與結構風險最小化。
監督學習的問題就變成了經驗風險或結構風險函數的最優化問題,這時經驗或結構風險函數是最優化的目標函數。
算法:學習模型的具體計算方法。統計學習基於訓練數據集,根據學習策略,從假設空間中選擇最優模型,最後須要考慮用什麼樣的計算方法求解最優模型。
算法(Algorithm):解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法表明着用系統的方法描述解決問題的策略機制。也就是說,可以對必定規範的輸入,在有限時間內得到所要求的輸出。不一樣的算法可能用不一樣的時間、空間或效率來完成一樣的任務。一個算法的優劣能夠用空間複雜度與時間複雜度來衡量。
一個算法應該具備五個重要特性:有窮性、確切性、輸入項、輸出項、可行性。
算法評定標準:時間複雜度、空間複雜度、正確性、可讀性、健壯性。
算法的方法:遞推法、遞歸法、窮舉法(暴力破解法)、貪心算法、分治法、動態規劃法、迭代法、分支界限法、回溯法。
統計學習關於數據的基本假設是同類數據具備必定的統計規律性。統計學習的方法是基於數據構建統計模型從而對數據進行預測與分析。
統計學習的方法能夠歸納以下:從給定的、有限的、用於學習的訓練數據(training data)集合出發,假設數據是獨立同分布產生的;而且假設要學習的模型屬於某個函數的集合,稱爲假設空間(hypothesis space);應用某個評價準則(evaluation criterion),從假設空間中選取一個最優的模型,使它對已知訓練數據及未知測試數據(test data)在給定的評價準則下有最優的預測;
八、若是給定的樣本數據充足,進行模型選擇的一種簡單方法是隨機地將數據集切分爲三部分,分別爲訓練集、驗證集和測試集。訓練集用來訓練模型,驗證集用於模型的選擇,而測試集用於最終對學習方法的評估。在學習到的不一樣複雜度的模型中,選擇對驗證集有最小預測偏差的模型。因爲驗證集有足夠多的數據,用它對模型進行選擇也是有效的。
問題:一、通常的機器學習好像沒有這麼複雜,劃分這麼多。一個訓練,再用訓練的模型進行預測?
二、如何進行驗證,如何進行單獨的驗證,即剝離訓練集後的驗證?如何比較不一樣模型之間好壞,即評價不一樣驗證結果的標準?
三、驗證集和交叉驗證是一個概念嗎?
hutai流程爲:訓練+驗證 ----> 測試
七、約束最優化問題如何求解?
解答:scipy庫感受不太好用,太複雜了,能夠算出部分問題,可是算出的結果有問題。
統計學習方法(李航)
例子7.1
import numpy as np from scipy.optimize import minimize,Bounds,rosen,rosen_der,rosen_hess from scipy.optimize import LinearConstraint def func(x): return .5*(x[0]**2+x[1]**2) linear_constraint=LinearConstraint([[3,3,1],[4,3,1],[-1,-1,-1]],[1,1,1],[np.inf,np.inf,np.inf]) x0=np.array([0,0,0]) res=minimize(func,x0,method='trust-constr',jac=rosen_der,hess=rosen_hess, constraints=[linear_constraint],options={'verbose':1}) print(res.x) #x: array([ 0.76741137, 0.23306446, -2.00048511]) 不是全局最優解 print('\n--------------------') from scipy.optimize import SR1 res=minimize(func,x0,method='trust-constr',jac='2-point',hess=SR1(), constraints=[linear_constraint],options={'verbose':1}) print(res)
運行結果: `xtol` termination condition is satisfied. Number of iterations: 343, function evaluations: 666, CG iterations: 416, optimality: 2.73e+00, constraint violation: 0.00e+00, execution time: 0.43 s. [ 0.76741137 0.23306446 -2.00048511] -------------------- `gtol` termination condition is satisfied. Number of iterations: 18, function evaluations: 48, CG iterations: 25, optimality: 1.35e-09, constraint violation: 0.00e+00, execution time: 0.033 s. [ 0.50002438 0.50001157 -2.0000518 ]
例子7.2
import numpy as np from scipy.optimize import minimize,Bounds,rosen,rosen_der,rosen_hess from scipy.optimize import LinearConstraint,NonlinearConstraint def func(x): return .5*(18*x[0]**2+25*x[1]**2+2*x[2]**2+42*x[0]*x[1]-12*x[0]*x[2]-14*x[1]*x[2])-x[0]-x[1]-x[2] from scipy.optimize import Bounds bounds=Bounds([0,0,0],[np.inf,np.inf,np.inf]) linear_constraint=LinearConstraint([[1,1,-1]],[0,0,0],[0,0,0]) eq_cons={'type':'eq', 'fun':lambda x:np.array([x[0]+x[1]-x[2]]), 'jac':lambda x:np.array([1.0,1.0,-1.0])} x0=np.array([1,1,2]) res=minimize(func,x0,method='SLSQP',jac=rosen_der,bounds=bounds,constraints=[eq_cons], options={'ftol': 1e-9, 'disp': True}) print(res.x) print('-------------------------') res=minimize(func,x0,method='SLSQP',bounds=bounds,constraints=[eq_cons],) print(res.x)
運行結果: Iteration limit exceeded (Exit mode 9) Current function value: 20.842654044864997 Iterations: 101 Function evaluations: 1101 Gradient evaluations: 101 [1.01452196 1.1839437 2.19846565] ------------------------- [0.24999998 0. 0.24999998]
六、爲啥距離是垂直的垂線,而不是對應的y值?
解答:數據點離劃分的超平面距離越遠時,越肯定劃分準確。距離非y值,而是垂線。
五、爲啥超平面是惟一的呢?超平面可能不惟一吧?若是人爲製造平行的樣本點。
解答:由4可知,超平面是惟一的。
四、爲啥函數間隔轉化爲:定義超平面(w,b)關於訓練數據集T的函數間隔爲超平面(w,b)關於T中全部樣本點(x(i),y(i))的函數間隔之最小值?
解答:注意這只是一個定義,沒有說明別的問題。定義的是函數間隔,選取的是全部距離中最小的,沒問題。
三、若是在2維平面上,數據量比較大,從xoy的座標上能夠看到兩條直線,分別爲y=1和y=-1,那該怎麼劃分呢?
解答:當數據點變爲兩條直線後,劃分的超平面爲通過y=0直線的平面(非xoy平面),只有當這個平面的垂線爲x=0時,數據到這個平面的距離最大,想象一下。
二、歐式空間和希爾伯特空間是什麼意思?
歐式空間可基本理解咱們認識的空間。
一、分類式子 h(x)=g(wTx+b),x和w、b分別是什麼形式和維度?
解答:x爲維度,好比2維平面 h(x)=2*x+1 3維平面 h(x)=2*x(1)+3*x(2)+3,其中x=[x(1),x(2)],w=[2,3],b=3