1. 程式人生 > >python實現機器學習分類演算法原始碼————上篇

python實現機器學習分類演算法原始碼————上篇

                                   python實現機器學習分類演算法原始碼

文章開始把我喜歡的這句話送個大家:這個世界上還有什麼比自己寫的程式碼執行在一億人的電腦上更酷的事情嗎,如果有那就是讓這個數字再擴大十倍

1.KNN分類演算法

KNN演算法不僅可以用於分類,還可以用於迴歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。

注意:KNN演算法不適用於樣本量不均衡的情況。

python實現程式碼:

/*normData函式來執行標準化資料集的工作,防止因不同量之間資料本身範圍不同而統一化分析的誤差保證標準化後每一個特徵值都在0~1之間*/

def normData(dataSet):
     maxVals = dataSet.max(axis=0)
     minVals = dataSet.min(axis=0)
     ranges = maxVals - minVals
     retData = (dataSet - minVals) / ranges
     return retData, ranges, minVals

//KNN演算法實現

 def kNN(dataSet, labels, testData, k):
      distSquareMat = (dataSet - testData) ** 2 # 計算差值的平方
      distSquareSums = distSquareMat.sum(axis=1) # 求每一行的差值平方和
      distances = distSquareSums ** 0.5 # 開根號,得出每個樣本到測試點的距離
      sortedIndices = distances.argsort() # 排序,得到排序後的下標
      indices = sortedIndices[:k] # 取最小的k個
      labelCount = {} # 儲存每個label的出現次數
      for i in indices:
          label = labels[i]
         labelCount[label] = labelCount.get(label, 0) + 1 # 次數加一
     sortedCount = sorted(labelCount.items(), key=opt.itemgetter(1), reverse=True) 
     # 對label出現的次數從大到小進行排序
     return sortedCount[0][0] # 返回出現次數最大的label

//測試函式

if __name__ == "__main__":
    dataSet = np.array([[2, 3], [6, 8]])
    normDataSet, ranges, minVals = normData(dataSet)
    labels = ['a', 'b']
    testData = np.array([3.9, 5.5])
    normTestData = (testData - minVals) / ranges
    result = kNN(normDataSet, labels, normTestData, 1)
    print(result)

//結果為a,正確

 

使用KNN演算法: 

import numpy as np
import matplotlib.pyplot as plt
from sklearn import neighbors,datasets,cross_validation

def test_KNeighborsRegressor(*data):
    X_train,X_test,y_train,y_test=data
    regr=neighbors.KNeighborsRegressor()
    regr.fit(X_train,y_train)
    print('Training Score:%f'%regr.score(X_train,y_train))
    print('Testing Score:%f'%regr.score(X_test,y_test))

X_train,X_test,y_train,y_test=create_regression_data(1000)
test_KNeighborsRegressor(X_train,X_test,y_train,y_test)

2.Logistic演算法

注意:邏輯迴歸演算法本質上還是一種線性模型,篩選出來的變數與結果有線性關係,但剔除的變數只是與結果大概率上無線性關係,但未必無非線性關係。 

程式碼:

#-*- coding: utf-8 -*-
#邏輯迴歸 自動建模
import pandas as pd

#引數初始化
filename = '../data/bankloan.xls'
data = pd.read_excel(filename)
x = data.iloc[:,:8].as_matrix()
y = data.iloc[:,8].as_matrix()

from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR 
rlr = RLR() #建立隨機邏輯迴歸模型,篩選變數
rlr.fit(x, y) #訓練模型
rlr.get_support() #獲取特徵篩選結果,也可以通過.scores_方法獲取各個特徵的分數
print(u'通過隨機邏輯迴歸模型篩選特徵結束。')
print(u'有效特徵為:%s' % ','.join(data.columns[rlr.get_support()]))
x = data[data.columns[rlr.get_support()]].as_matrix() #篩選好特徵

lr = LR() #建立邏輯迴歸模型
lr.fit(x, y) #用篩選後的特徵資料來訓練模型
print(u'邏輯迴歸模型訓練結束。')
print(u'模型的平均正確率為:%s' % lr.score(x, y)) 


邏輯迴歸模型訓練結束。
模型的平均正確率為:0.805714285714

(未完待續)

下篇博文介紹:

3.Bayesian Linear Regression

不能夠一次性接收到整個資料集,而是不斷接收到小的資料集,同時由於儲存的限制不能儲存已經接收到的所有資料集,每次可以處理的小的資料集。這就導致不能對所有資料做線性迴歸,但是可以通過貝葉斯線性迴歸達到同樣的效果。貝葉斯迴歸演算法可以預防過擬合

https://www.cnblogs.com/hemiy/p/6194710.html

4.決策樹

5.人工神經網路

6.SVM

加油吧,程式設計師!