初學線性回歸

2021-08-19 03:50:50 字數 3365 閱讀 9841

線性回歸是機器學習中的乙個非常重要的演算法,一般用來進行資料的擬合或者**,同時還可以用來特徵重要性評估。

線性回歸一般分為一元線性回歸(乙個x,乙個y)、多元線性回歸(多個x,乙個y):

例如    :y=a*x+b,這就是一元函式

y=a*x1+b*x2+c ,這就是多元線性回歸

在這裡我只講述一元的線性回歸,多元的型別,我會在後面提及

首先,我們這裡有一堆資料

所謂一元線性回歸要做的事情,實際上是去找一條最優直線,能夠以最小的誤差去擬合這些點。

第一種方法中,所確定的引數使得最大誤差達到最小,因而稱為最大最小問題,也稱為最優一致逼近問題。這類問題在求解上存在一定的困難

第二種方法中,由於函式關於引數不可微,因此不能用一般的極值方法求最優解

這個下不就是往梯度方向走嗎,那我們沿著梯度一點一點滑下去唄,反正計算機不嫌累。梯度不就是上面那兩個公式唄。現在梯度有了,那每次滑多遠呢,一滑劃過頭了不久白算半天了嗎,所以還得定義步長,用來表示每次滑多長。這樣我們就能每次向下走一點點,再定義乙個迭代值用來表示滑多少次,這樣我們就能慢慢的一點點的靠近最小值了,不出意外還是能距離最優值很近的。

我這裡用了加號,很多人會誤以為梯度下降就要減,但是其實梯度本身是有方向的,所以這裡直接加就可以。

import numpy

import pylab

import math

#生成資料集

def createdata():

dataset=numpy.loadtxt('dataset/data.txt') #讀取data.txt檔案

dataset=dataset.astype(dtype=float) #轉化成float型別

return dataset

def line_regression(dataset): #目標函式設為 y=ax+b

learn_rate=0.001 #學習速率

init_a=0 #a初始化為0

init_b=0 #b初始化為0

iter_count=1000 #迭代次數

a,b=optimization(dataset,init_a,init_b,learn_rate,iter_count) #尋找最優的引數a、b,使得擬合效果最佳

print(a,b)

plot_data(dataset, a, b)

def plot_data(data,a,b):

#plottting

x = data[:,0]

y = data[:,1]

y_predict = a*x+b

pylab.plot(x,y,'o')

#pylab.plot(x,y_predict,'k-')

pylab.show()

def optimization(dataset,init_a,init_b,learn_rate,iter_count):

a=init_a

b=init_b

for i in numpy.arange(0,iter_count): #迭代次數

a,b=compute_gradient(a,b,dataset,learn_rate)

if(i%100==0):

print('iter :error='.format(i, compute_error(a, b, dataset)))

return (a,b)

def compute_error(a,b,dataset):

sum=0

for i in numpy.arange(len(dataset)):

x=dataset[i,0]

y=dataset[i,1]

y_predict=a*x+b

sum+=math.pow(y-y_predict,2)

return sum/len(dataset)

def compute_gradient(a,b,dataset,learn_rata):

a_gradient = 0 #a的偏導數

b_gradient = 0 #b的偏導數

n = float(len(dataset))

# two ways to implement this

# first way

for i in range(0,len(dataset)): #迴圈每一對資料,求a,b的偏導數

x = dataset[i,0]

y = dataset[i,1]

#computing partial derivations of our error function

#b_gradient = -(2/n)*sum((y-(m*x+b))^2)

#m_gradient = -(2/n)*sum(x*(y-(m*x+b))^2)

a_gradient += -(2 / n) * x * (y - ((a * x) + b))

b_gradient += -(2/n)*(y-((a*x)+b))

# vectorization implementation

# x = dataset[:, 0]

# y = dataset[:, 1]

# b_gradient = -(2 / n) * (y - m_current * x - b_current)

# b_gradient = np.sum(b_gradient, axis=0)

# m_gradient = -(2 / n) * x * (y - m_current * x - b_current)

# m_gradient = np.sum(m_gradient, axis=0)

# update our b and m values using out partial derivations

#print(a_gradient,b_gradient)

new_a = a - (learn_rata * a_gradient) #如果a_gradient>0,說明在a點是遞增的,所以按照梯度下降原理,我們要往相反方向走,所以要減

#如果a_gradient<0,說明在a點是遞減的,所以按照梯度下降原理,要按照這個方向走下去,所以減去乙個

#負值,相當於加上乙個正值

new_b = b - (learn_rata * b_gradient) #原理同上

return [new_a, new_b]

if __name__=="__main__":

dataset=createdata()

line_regression(dataset)

python機器學習之初學線性回歸

線性回歸 線性回歸包括一元線性回歸和多元線性回歸,一元的是只有乙個x和乙個y。多元的是指有多個x和乙個y。下面我只講下一元的,多元只是將y mx b 變成了y 一元線性回歸其實就是去找到一條直線,這條直線能以最小的誤差 loss 來擬合資料。怎麼來表示誤差呢?如上圖所示,橫座標表示x,縱座標表示y。...

線性回歸模型 線性回歸模型

回歸的思想和分類有所不一樣,分類輸出的結果為離散的值,回歸輸出的是乙個連續型的值。線性回歸的思想就是試圖找到乙個多元的線性函式 當輸入一組特徵 也就是變數x 的時候,模型輸出乙個 值y h x 我們要求這個 值盡可能的準確,那麼怎麼樣才能做到盡可能準確呢?其中 表示實際值,表示 值 其中 表示實際值...

線性回歸(標準回歸)

今天我們來討論機器學習的另乙個領域 首先我們來討論利用線性回歸來 數值型資料。利用線性回歸進行 的過程就是求解回歸係數的過程,求出回歸係數後進行係數與特徵值乘積求和即可,這裡我們使用最小二乘法進行求解 ex0.txt 提取碼 dbe2 def loaddataset filename numfeat...