最近在GitHub上學習了有關python實現常見機器學習算法
目錄
- 一、線性回歸
1、代價函數
2、梯度下降算法
3、均值歸一化
4、最終運行結果
5、使用scikit-learn庫中的線性模型實現
- 二、邏輯回歸
1、代價函數
2、梯度
3、正則化
4、S型函數
5、映射為多項式
6、使用的優化方法
7、運行結果
8、使用scikit-learn庫中的邏輯回歸模型實現
- 邏輯回歸_手寫數字識別_OneVsAll
1、隨機顯示100個數字
2、OneVsAll
3、手寫數字識別
4、預測
5、運行結果
6、使用scikit-learn庫中的邏輯回歸模型實現
- 三、BP神經網絡
1、神經網絡model
2、代價函數
3、正則化
4、反向傳播BP
5、BP可以求梯度的原因
6、梯度檢查
7、權重的隨機初始化
8、預測
9、輸出結果
- 四、SVM支持向量機
1、代價函數
2、Large Margin
3、SVM Kernel
4、使用中的模型代碼
5、運行結果
- 五、K-Mearns聚類算法
1、聚類過程
2、目標函數
3、聚類中心的選擇
4、聚類個數K的選擇
5、應用——圖片壓縮
6、使用scikit-learn庫中的線性模型實現聚類
7、運行結果
- 六、PCA主成分分析(降維)
1、用處
2、2D-->1D,nD-->kD
3、主成分分析PCA與線性回歸的區別
4、PCA降維過程
5、數據恢復
6、主成分個數的選擇(即要降的維度)
7、使用建議
8、運行結果
9、使用scikit-learn庫中的PCA實現降維
- 七、異常檢測Anomaly Detection
1、高斯分布(正態分布)
2、異常檢測算法
3、評價的好壞,以及的選取
4、選擇使用什么樣的feature(單位高斯分布)
5、多元高斯分布
6、單元和多元高斯分布特點
7、程序運行結果
一、線性回歸
1、代價函數
其中。
下面就是求出theta,使代價最小,即代表我們擬合出來的方程距離真實值最近共有m條數據,其中代表我們擬合出來的方程到真實值距離的平方,平方的原因是因為可能有負值,系數2的原因是下面求梯度是對每個變量求偏導,2可以消去。
代碼實現:
1 # 計算代價函數 2 def computerCost(X,y,theta): 3 m = len(y) 4 J = 0 5 J = (np.transpose(X*theta-y))*(X*theta-y)/(2*m) #計算代價J 6 return J
注意這里的X是真實數據前加了一列1,因為有theta(0)
2、梯度下降算法
代價函數對求偏導得到:
所以對theta的更新可以寫成:
其中為學習速率,控制梯度下降的速度,一般取0.01,0.03,0.1,0.3......
為什么梯度下降可以逐步減小代價函數?
假設函數f(x)的泰勒展開:f(x+△x)=f(x)+f'(x)*△x+o(△x),令:△x=-α*f'(x),即負梯度方向乘以一個很小的步長α,將△x帶入泰勒展開式中:
f(x+x)=f(x)-α*[f'(x)]²+o(△x)
可以看出,α是取得很小的正數,[f'(x)]²也是正數,所以可以得出f(x+△x)<=f(x),所以沿着負梯度放下,函數在減小,多維情況一樣。
1 # 梯度下降算法 2 def gradientDescent(X,y,theta,alpha,num_iters): 3 m = len(y) 4 n = len(theta) 5 temp = np.matrix(np.zeros((n,num_iters))) # 暫存每次迭代計算的theta,轉化為矩陣形式 6 J_history = np.zeros((num_iters,1)) #記錄每次迭代計算的代價值 7 8 for i in range(num_iters): # 遍歷迭代次數 9 h = np.dot(X,theta) # 計算內積,matrix可以直接乘 10 temp[:,i] = theta - ((alpha/m)*(np.dot(np.transpose(X),h-y))) #梯度的計算 11 theta = temp[:,i] 12 J_history[i] = computerCost(X,y,theta) #調用計算代價函數 13 print '.', 14 return theta,J_history
3、均值歸一化
均值歸一化的目的是使數據都縮放到一個范圍內,便於使用梯度下降算法
其中為所有此feature數據的平均值,
可以為此feature的最大值減去最小值,也可以為這個feature對應的數據的標准差。
代碼實現:
1 # 歸一化feature 2 def featureNormaliza(X): 3 X_norm = np.array(X) #將X轉化為numpy數組對象,才可以進行矩陣的運算 4 #定義所需變量 5 mu = np.zeros((1,X.shape[1])) 6 sigma = np.zeros((1,X.shape[1])) 7 8 mu = np.mean(X_norm,0) # 求每一列的平均值(0指定為列,1代表行) 9 sigma = np.std(X_norm,0) # 求每一列的標准差 10 for i in range(X.shape[1]): # 遍歷列 11 X_norm[:,i] = (X_norm[:,i]-mu[i])/sigma[i] # 歸一化 12 13 return X_norm,mu,sigma
注意預測的時候也需要均值歸一化數據
4、最終運行結果
代價隨迭代次數的變化
5、使用scikit-learn庫中的線性模型實現
1 #-*- coding: utf-8 -*- 2 import numpy as np 3 from sklearn import linear_model 4 from sklearn.preprocessing import StandardScaler #引入歸一化的包 5 6 def linearRegression(): 7 print u"加載數據...\n" 8 data = loadtxtAndcsv_data("data.txt",",",np.float64) #讀取數據 9 X = np.array(data[:,0:-1],dtype=np.float64) # X對應0到倒數第2列 10 y = np.array(data[:,-1],dtype=np.float64) # y對應最后一列 11 12 # 歸一化操作 13 scaler = StandardScaler() 14 scaler.fit(X) 15 x_train = scaler.transform(X) 16 x_test = scaler.transform(np.array([1650,3])) 17 18 # 線性模型擬合 19 model = linear_model.LinearRegression() 20 model.fit(x_train, y) 21 22 #預測結果 23 result = model.predict(x_test) 24 print model.coef_ # Coefficient of the features 決策函數中的特征系數 25 print model.intercept_ # 又名bias偏置,若設置為False,則為0 26 print result # 預測結果 27 28 29 # 加載txt和csv文件 30 def loadtxtAndcsv_data(fileName,split,dataType): 31 return np.loadtxt(fileName,delimiter=split,dtype=dataType) 32 33 # 加載npy文件 34 def loadnpy_data(fileName): 35 return np.load(fileName) 36 37 38 if __name__ == "__main__": 39 linearRegression()