們在講機器學習模型之前,首先要了解兩個最簡單的機器學習或統計學習模型,那就是線性模型和邏輯回歸。其中最小二乘法是解決線性模型擬合的一種思想,最小二乘法(又稱最小平方法)是一種數學優化技術。它通過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便地求得未知的數據,並使得這些求得的數據與實際數據之間誤差的平方和為最小。最小二乘法還可用於曲線擬合。
基本原理
設(x,y)是一對觀測量,且 滿足以下的理論函數
為了尋找最優估計值,求解目標函數
1.線性模型python 程序實現:
'''
1.線性模型
@date: 2021-10-14
@author: Alan
'''
import numpy as np
def forward(x,w):
return w*x
def loss(x,y,w):
y_pred = forward(x, w)
error = (y_pred - y)**2
return error
def gradient_desent(x_train,y_train):
i = 0 # 訓練次數
w = 0.0 # 初始化權重參數
error = 1e-4
list_w = []
list_mse = []
while True:
loss_sum = 0.0
k=0
while (k<len(x_train)): # for x, y in zip(x_train, y_train):
x = x_train[k]
y = y_train[k]
loss_val = loss(x,y,w)
loss_sum += loss_val
k = k + 1
mse = loss_sum/len(x_train) # 均方根誤差
print('第'+str(i)+'次訓練更新後均方根誤差mse:', mse)
if mse<error: # 收斂準則
print('達到收斂準則,退出訓練!')
break
w = w + 0.1 #更新權重
i = i + 1 #更新迭代次數
list_w.append(w)
list_mse.append(mse)
print('最優權重w為:',w)
return w, list_w, list_mse
x_train = [1,2,3,4,5]
y_train = [2,4,6,8,10]
w, list_w, list_mse = gradient_desent(x_train,y_train)
import matplotlib.pyplot as plt
plt.plot(list_w,list_mse,color='#F92672')
plt.xlabel('w')
plt.ylabel('MSE')
plt.show()
日誌輸出:
第0次訓練更新後均方根誤差mse: 44.0
第1次訓練更新後均方根誤差mse: 39.71
第2次訓練更新後均方根誤差mse: 35.64
第3次訓練更新後均方根誤差mse: 31.79
第4次訓練更新後均方根誤差mse: 28.160000000000004
第5次訓練更新後均方根誤差mse: 24.75
第6次訓練更新後均方根誤差mse: 21.56
第7次訓練更新後均方根誤差mse: 18.59
第8次訓練更新後均方根誤差mse: 15.840000000000003
第9次訓練更新後均方根誤差mse: 13.310000000000002
第10次訓練更新後均方根誤差mse: 11.000000000000004
第11次訓練更新後均方根誤差mse: 8.910000000000002
第12次訓練更新後均方根誤差mse: 7.040000000000001
第13次訓練更新後均方根誤差mse: 5.389999999999999
第14次訓練更新後均方根誤差mse: 3.959999999999998
第15次訓練更新後均方根誤差mse: 2.749999999999998
第16次訓練更新後均方根誤差mse: 1.7599999999999973
第17次訓練更新後均方根誤差mse: 0.9899999999999973
第18次訓練更新後均方根誤差mse: 0.43999999999999817
第19次訓練更新後均方根誤差mse: 0.10999999999999857
第20次訓練更新後均方根誤差mse: 2.0904813988356812e-30
達到收斂準則,退出訓練!
最優權重w為: 2.0000000000000004
logistic回歸是一種廣義的線性回歸分析模型,其實是分類模型,常用於數據挖掘,疾病自動診斷,經濟預測等領域。例如,探討臨床試驗過程中引發疾病的危險因素,並根據危險因素預測疾病發生的概率等。
背景:Sigmoid函數是一個在生物學中常見的S型的函數,也稱為S型生長曲線。Sigmoid函數常被用作神經網絡的閾值函數,將變量映射到0,1之間。
計算的概率用於預測邏輯回歸模型中的目標分類,我們經常聽到的兩個主要函數是Softmax和Sigmoid函數。深度學習和其他領域的功能使用中起著至關重要的作用。Logistic分布函數
2.邏輯回歸模型 python 程序實現:
import time
import math
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#(1)np.dot()對於這兩種數據格式均為矩陣乘法;
#(2)np.multiply()對於這兩種數據格式均為按元素相乘;
#(3)符號「*」對於array類型是矩陣乘法,
#對於mat類型是按元素類型相乘,
#而當一個array類型乘上一個mat類型時,則為矩陣乘法;
# sigmoid函數
def sigmoid(x):
return 1.0 / (1 + math.exp(-x))
def loadData(dataset):
# dataset = "./excel/testSet.xlsx"
df = pd.read_excel(dataset, sheet_name='Sheet1')
x_train = np.mat(df.iloc[:, 0:3])
y_train = np.mat(df.iloc[:, [3]])
return x_train, y_train
def logRegression(x_train, y_train):
# 循環變量
k = 0
# 最大迭代次數
maxiter = 100
# 迭代步長
alpha = 0.01
# 獲取訓練樣本數與特徵數
numSamples, numFeatures = np.shape(x_train)
# 梯度初始化參數為1x3數組向量
gradient = np.zeros((numFeatures, 1))
while (k < maxiter):
k = k + 1 # k指代的是迭代更新之後的k
alpha = 4.0 / (1.0 + k) + 0.01 # 步長的更新
i = np.random.randint(0, numSamples) # 隨機取一個樣本
x_vector = x_train[i, :] # 隨機的一個樣本向量
y_vector = y_train[i, 0] # 隨機的一個樣本標籤(0或1)
# sigmoid函數 S形曲線作為打分函數,值域為(0,1)
y_score = sigmoid(np.dot(x_vector, gradient)) # 矩陣輸入: 矩陣乘以數組(Gradient vector)
error = y_vector - y_score # 損失函數:真是y值 - 預測的y值
# 梯度 gradient = gradient + 步長*誤差
gradient = gradient + alpha * error * x_vector.T
print('*' + 100 * "-")
print("步長: ", alpha)
print("第{0}個樣本: ".format(i))
print("第{0}個樣本X特徵: {1}".format(i, x_vector))
print("第{0}個樣本y值: {1}".format(i, y_vector))
print("第{0}個樣本矩陣:{1} 乘以\n數組:{2}".format(i,x_vector, gradient))
print("第{0}個樣本點乘積{1}".format(i, x_vector*gradient))
print("第{0}個樣本sigmoid值: {1}".format(i, y_score))
print("第{0}次誤差: {1}".format(k, error))
print("第{0}次梯度: \n {1}".format(k, gradient))
print('*' + 100 * "-")
#time.sleep(5)
print()
return gradient
# return (TP + TN)
def TPTN(x_train, y_train, delta, cutoff=0.5):
TP = 0 # 記錄劃分真陽性的樣本=TP
TN = 0 # 記錄劃分真陰性的樣本=TN
# TPTN = TP + TN # 記錄劃分正確的樣本=TP+TN
numSamples, numFeatures = np.shape(x_train) # 獲取訓練樣本的規模
for i in range(numSamples):
p = sigmoid(x_train[i, :] * delta)
if p >= cutoff and int(y_train[i, 0]) == 1:
TP = TP + 1
elif p < cutoff and y_train[i, 0] == 0:
TN = TN + 1
return TP + TN
def showGraph(x_train, y_train, delta):
numSamples, numFeatures = np.shape(x_train) # 獲取訓練樣本的規模
# 創建畫布
plt.figure(figsize=(12, 8)) # 設置繪製尺寸
# 樣本點
for i in range(numSamples):
if int(y_train[i, 0]) == 0:
plt.plot(x_train[i, 1], x_train[i, 2], 'or')
elif int(y_train[i, 0]) == 1:
plt.plot(x_train[i, 1], x_train[i, 2], 'ob')
# 繪製分割線
min_x = min(x_train[:, 1])[0, 0] - 1
max_x = max(x_train[:, 1])[0, 0] + 1
y_min_x = float(-delta[0, 0] - delta[1, 0] * min_x) / delta[2, 0]
y_max_x = float(-delta[0, 0] - delta[1, 0] * max_x) / delta[2, 0]
plt.plot([min_x, max_x], [y_min_x, y_max_x], color='r')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
def testingLogR(dataset):
global gra
# 返回的X特徵,Y標籤,存在矩陣裡面
x_train, y_train = loadData(dataset)
max_TPTN = 0.0
numBegin = 20 # 起點數量
for i in range(numBegin):
gradient = logRegression(x_train, y_train)
TPTN_count = TPTN(x_train, y_train, gradient)
if TPTN_count > max_TPTN:
max_TPTN = TPTN_count
gra = gradient
numSamples, numFeatures = np.shape(x_train)
print("樣本準確率為Accuracy=(TP+TN)/N:", (max_TPTN/numSamples)*100, "%")
showGraph(x_train, y_train, gra)
testingLogR(dataset="./excel/testSet.xlsx")