根據現有資料對分類邊界線(decision boundary)建立回歸公式,以此進行分類。
①準備資料
②資料處理def
loaddataset
(file_name):
datamat =
labelmat =
fr = open(file_name)
for line in fr.readlines():
linearr = line.strip().split()//將資料提取出來
return datamat,labelmat
//準備好函式
defsigmoid
(inx):
#將輸入的值轉化為0-1之間的值,且當輸入值越大時,輸出值越接近1,輸入值越小越接近0.使用該函式來歸一化處理。
#例如:(負數同理)
#>>> sigmoid(1)
#0.7615941559557646
#>>> sigmoid(2)
#0.9640275800758169
#>>> sigmoid(3)
#0.9950547536867307
#>>> sigmoid(10)
#0.9999999958776926
#>>> sigmoid(100)
#1.0
return
2 * 1.0/(1+exp(-2*inx)) - 1
③畫圖(將資料在座標軸上標點,並將擬合直線也畫出來。)def
gradascent
(datamatin,classlabels):(遍歷整個資料集進行計算)
datamatrix = mat(datamatin) //將資料矩陣化
labelmat = mat(classlabels).transpose() //矩陣化的同時進行轉置.
m,n = shape(datamatrix)// m->資料量,樣本數 n->特徵數
alpha = 0.001 //步長(過大可能會導致不斷偏離最值,過小會導致遞進次數需要耗費很多)
maxcycles = 500 //次數
weights = ones((n,1))
for k in range(maxcycles):
h = sigmoid(datamatrix*weights)//同一化處理
error = (labelmat - h) //誤差情況
//根據誤差情況,對權值進行調整,就相當於往乙個方向走了一步後根據走偏的方向進行一定程度的調整,調整幅度與步長關係大,調整程度與迴圈次數有一定關係。
weights = weights + alpha * datamatrix.transpose() * error
//weights的公式的後面部分是由公式推導而來,即alpha * datamatrix.transpose() * error為我們所求的梯度。關於這一步為梯度的理解:f(w) = w的轉置 × x 計算梯度,對f(w)關於w求導,再根據矩陣求導法則。即線性回歸中的求導數。(導數決定了變化的方向是正還是負。)
return array(weights)
④分析結果與改進def
plotbestfit
(dataarr,labelmat,weights):
n = shape(dataarr)[0]
xcord1 =
ycord1 =
xcord2 =
ycord2 =
for i in range(n):
if int(labelmat[i]) == 1:
else:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1,ycord1,s=30,c='red',marker = 's')
ax.scatter(xcord2,ycord2,s=30,c='green')
x = arange(-3.0,3.0,0.1)
//此處計算y的公式的一些說明:
y = (-weights[0]-weights[1]*x)/weights[2]
ax.plot(x,y)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
關於運算過程的改進的想法:(可能只是一些瞎想def
testlr
(): datamat,labelmat = loaddataset("testset.txt")
dataarr = array(datamat)
weights = gradascent(dataarr,labelmat)
plotbestfit(dataarr,labelmat,weights)
#儘管將步長和次數盡可能調大,發現其輸出圖形擬合度很差。說明需要進一步的優化改進演算法本身。
1.歩長動態變化。(就類似於,下坡遇到不太確定的方向就算要走也走的慢一點,確定的時候就大步走過去。)
看到的資料中提到的關於改進的兩種實現方法:
隨機梯度上公升演算法:(只用乙個樣本點來更新回歸係數)
隨機梯度上公升演算法(隨機化)def
stocgradascent0
(datamatrix,classlabels):
m,n = shape(datamatrix)
alpha = 0.000001
weights = ones(n)
for i in range(m):
h = sigmoid(sum(datamatrix[i]*weights))
error = classlabels[i] - h
weights = weights + alpha * error * datamatrix[i]
return weights
cost functiondef
stocgradascent1
(datamatrix,classlabels,numiter=150):
m,n = shape(datamatrix)
weights = ones(n)
for j in range(numiter):
dataindex = range(m)
for i in range(m):
alpha = 4/(1.0+j+i)+0.000001 //此處步長為動態變化
randindex = int(random.uniform(0,len(dataindex)))
h = sigmoid(sum(datamatrix[dataindex[randindex]]*weights))
error = classlabels[dataindex[randindex]] - h
weights = weights + alpha * error * datamatrix[dataindex[randindex]]
del(dataindex[randindex])
return weights
gradient-descent
機器學習 邏輯回歸 Python實現邏輯回歸
coding utf 8 author 蔚藍的天空tom import numpy as np import os import matplotlib.pyplot as plt from sklearn.datasets import make blobs global variable path...
邏輯回歸模型 SAS邏輯回歸模型訓練
邏輯回歸模型是金融信貸行業製作各類評分卡模型的核心,幾乎80 的機器學習 統計學習模型演算法都是邏輯回歸模型,按照邏輯美國金融公司總結的sas建模過程,大致總結如下 一般通用模型訓練過程 a 按照指定需求和模型要求製作driver資料集,包含欄位有user id,dep b 其中,空值賦預設值即 c...
線性回歸與邏輯回歸
cost functionj 12m i 1m h x i y i hypothesish x tx 梯度下降求解 為了最小化j j j 1m i 1m h x i y i x i j 每一次迭代更新 j j 1m i 1m h x i y i x i j 正規方程求解 最小二乘法 xtx 1x t...