如何用Python實現常見機器學習算法-1


最近在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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM