基于numpy實現(xiàn)邏輯回歸
本文實例為大家分享了基于numpy實現(xiàn)邏輯回歸的具體代碼,供大家參考,具體內(nèi)容如下
交叉熵?fù)p失函數(shù);sigmoid激勵函數(shù)
基于numpy的邏輯回歸的程序如下:
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_classification class logistic_regression(): ? ? def __init__(self): ? ? ? ? pass ? ? def sigmoid(self, x): ? ? ? ? z = 1 /(1 + np.exp(-x)) ? ? ? ? return z ? ? def initialize_params(self, dims): ? ? ? ? W = np.zeros((dims, 1)) ? ? ? ? b = 0 ? ? ? ? return W, b ? ? def logistic(self, X, y, W, b): ? ? ? ? num_train = X.shape[0] ? ? ? ? num_feature = X.shape[1] ? ? ? ? a = self.sigmoid(np.dot(X, W) + b) ? ? ? ? cost = -1 / num_train * np.sum(y * np.log(a) + (1 - y) * np.log(1 - a)) ? ? ? ? dW = np.dot(X.T, (a - y)) / num_train ? ? ? ? db = np.sum(a - y) / num_train ? ? ? ? cost = np.squeeze(cost)#[]列向量,易于plot ? ? ? ? return a, cost, dW, db ? ? def logistic_train(self, X, y, learning_rate, epochs): ? ? ? ? W, b = self.initialize_params(X.shape[1]) ? ? ? ? cost_list = [] ? ? ? ? for i in range(epochs): ? ? ? ? ? ? a, cost, dW, db = self.logistic(X, y, W, b) ? ? ? ? ? ? W = W - learning_rate * dW ? ? ? ? ? ? b = b - learning_rate * db ? ? ? ? ? ? if i % 100 == 0: ? ? ? ? ? ? ? ? cost_list.append(cost) ? ? ? ? ? ? if i % 100 == 0: ? ? ? ? ? ? ? ? print('epoch %d cost %f' % (i, cost)) ? ? ? ? params = { ? ? ? ? ? ? 'W': W, ? ? ? ? ? ? 'b': b ? ? ? ? } ? ? ? ? grads = { ? ? ? ? ? ? 'dW': dW, ? ? ? ? ? ? 'db': db ? ? ? ? } ? ? ? ? return cost_list, params, grads ? ? def predict(self, X, params): ? ? ? ? y_prediction = self.sigmoid(np.dot(X, params['W']) + params['b']) ? ? ? ? #二分類 ? ? ? ? for i in range(len(y_prediction)): ? ? ? ? ? ? if y_prediction[i] > 0.5: ? ? ? ? ? ? ? ? y_prediction[i] = 1 ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? y_prediction[i] = 0 ? ? ? ? return y_prediction ? ? #精確度計算 ? ? def accuracy(self, y_test, y_pred): ? ? ? ? correct_count = 0 ? ? ? ? for i in range(len(y_test)): ? ? ? ? ? ? for j in range(len(y_pred)): ? ? ? ? ? ? ? ? if y_test[i] == y_pred[j] and i == j: ? ? ? ? ? ? ? ? ? ? correct_count += 1 ? ? ? ? accuracy_score = correct_count / len(y_test) ? ? ? ? return accuracy_score ? ? #創(chuàng)建數(shù)據(jù) ? ? def create_data(self): ? ? ? ? X, labels = make_classification(n_samples=100, n_features=2, n_redundant=0, n_informative=2) ? ? ? ? labels = labels.reshape((-1, 1)) ? ? ? ? offset = int(X.shape[0] * 0.9) ? ? ? ? #訓(xùn)練集與測試集的劃分 ? ? ? ? X_train, y_train = X[:offset], labels[:offset] ? ? ? ? X_test, y_test = X[offset:], labels[offset:] ? ? ? ? return X_train, y_train, X_test, y_test ? ? #畫圖函數(shù) ? ? def plot_logistic(self, X_train, y_train, params): ? ? ? ? n = X_train.shape[0] ? ? ? ? xcord1 = [] ? ? ? ? ycord1 = [] ? ? ? ? xcord2 = [] ? ? ? ? ycord2 = [] ? ? ? ? for i in range(n): ? ? ? ? ? ? if y_train[i] == 1:#1類 ? ? ? ? ? ? ? ? xcord1.append(X_train[i][0]) ? ? ? ? ? ? ? ? ycord1.append(X_train[i][1]) ? ? ? ? ? ? else:#0類 ? ? ? ? ? ? ? ? xcord2.append(X_train[i][0]) ? ? ? ? ? ? ? ? ycord2.append(X_train[i][1]) ? ? ? ? fig = plt.figure() ? ? ? ? ax = fig.add_subplot(111) ? ? ? ? ax.scatter(xcord1, ycord1, s=32, c='red') ? ? ? ? ax.scatter(xcord2, ycord2, s=32, c='green')#畫點 ? ? ? ? x = np.arange(-1.5, 3, 0.1) ? ? ? ? y = (-params['b'] - params['W'][0] * x) / params['W'][1]#畫二分類直線 ? ? ? ? ax.plot(x, y) ? ? ? ? plt.xlabel('X1') ? ? ? ? plt.ylabel('X2') ? ? ? ? plt.show() if __name__ == "__main__": ? ? model = logistic_regression() ? ? X_train, y_train, X_test, y_test = model.create_data() ? ? print(X_train.shape, y_train.shape, X_test.shape, y_test.shape) ? ? # (90, 2)(90, 1)(10, 2)(10, 1) ? ? #訓(xùn)練模型 ? ? cost_list, params, grads = model.logistic_train(X_train, y_train, 0.01, 1000) ? ? print(params) ? ? #計算精確度 ? ? y_train_pred = model.predict(X_train, params) ? ? accuracy_score_train = model.accuracy(y_train, y_train_pred) ? ? print('train accuracy is:', accuracy_score_train) ? ? y_test_pred = model.predict(X_test, params) ? ? accuracy_score_test = model.accuracy(y_test, y_test_pred) ? ? print('test accuracy is:', accuracy_score_test) ? ? model.plot_logistic(X_train, y_train, params)
結(jié)果如下所示:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python sklearn庫實現(xiàn)簡單邏輯回歸的實例代碼
- python實現(xiàn)邏輯回歸的方法示例
- python編寫Logistic邏輯回歸
- python代碼實現(xiàn)邏輯回歸logistic原理
- Python利用邏輯回歸模型解決MNIST手寫數(shù)字識別問題詳解
- Python實現(xiàn)的邏輯回歸算法示例【附測試csv文件下載】
- python 牛頓法實現(xiàn)邏輯回歸(Logistic Regression)
- Python利用邏輯回歸分類實現(xiàn)模板
- python機器學(xué)習(xí)理論與實戰(zhàn)(四)邏輯回歸
- python 實現(xiàn)邏輯回歸
相關(guān)文章
python簡單實現(xiàn)整數(shù)反轉(zhuǎn)的畫解算法
這篇文章主要介紹了python簡單實現(xiàn)整數(shù)反轉(zhuǎn)采用了一個有趣的畫解算法,通過示例的題目描述來對問題分析進行方案的解決,有需要的朋友可以參考下2021-08-08python3實現(xiàn)163郵箱SMTP發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了Python3實現(xiàn)163郵箱SMTP發(fā)送郵件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05python進行數(shù)據(jù)預(yù)處理的4個重要步驟
在數(shù)據(jù)科學(xué)項目中,數(shù)據(jù)預(yù)處理是最重要的事情之一,本文詳細(xì)給大家介紹python進行數(shù)據(jù)預(yù)處理的4個重要步驟:拆分訓(xùn)練集和測試集,處理缺失值,處理分類特征和進行標(biāo)準(zhǔn)化處理,需要的朋友可以參考下2023-06-06python使用numpy按一定格式讀取bin文件的實現(xiàn)
這篇文章主要介紹了python使用numpy按一定格式讀取bin文件的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05python數(shù)學(xué)建模之三大模型與十大常用算法詳情
這篇文章主要介紹了python數(shù)學(xué)建模之三大模型與十大常用算法詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感想取得小伙伴可以參考一下2022-07-07Python 實現(xiàn)list,tuple,str和dict之間的相互轉(zhuǎn)換
這篇文章主要介紹了Python 實現(xiàn)list,tuple,str和dict之間的相互轉(zhuǎn)換,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03