scikit-learn學習之迴歸分析
阿新 • • 發佈:2019-01-04
======================================================================
本系列部落格主要參考 Scikit-Learn 官方網站上的每一個演算法進行,並進行部分翻譯,如有錯誤,請大家指正
3.1:皮爾遜相關度
衡量兩個相關強度的量,取值範圍是[-1,1],計算公式為:
R平方也有侷限性,會隨著自變數的增大而增大
結果顯示為:
首先將分型別變數進行轉化為如下形式(第四五六列表示0,1,2,為1表示使用該型號車)
呼叫的程式碼其實和上邊的是一樣的:
本系列部落格主要參考 Scikit-Learn 官方網站上的每一個演算法進行,並進行部分翻譯,如有錯誤,請大家指正
======================================================================
另外一篇基於《機器學習實戰》的Logistic迴歸分析的部落格請參考:點選閱讀,其主要是採用Python程式碼實現迴歸模型
目錄:
1、概念
2、簡單線性迴歸(Simple Liner Regession)
3、多元性迴歸(Mutiple Regession)
4、非線性迴歸(Logistic Regession)
一:概念
1:集中趨勢衡量 1.1均值(平均值,平均數)(mean) 1.2中位數(median):將資料中的所有數按大小排列順序,位於中間的拿個書就是中位數 個數為奇數,取中間值 個數為偶數,取中間兩個數的平均值 1.3眾數:資料中出現最多的數2:離散程度的衡量
2.1方差(variance) 2.2標準差(standard deviation)
3:迴歸中的相關度
3.1:皮爾遜相關度
衡量兩個相關強度的量,取值範圍是[-1,1],計算公式為:
4:R平方值
決定係數(可決係數,擬合優度),反應因變數的全部變異能通過迴歸關係被自變數解釋的比例,取值範圍[0,1],可決係數越大,說明在總變差中由模型作出瞭解釋的部分佔的比重越大,模型擬合優度越好。反之可決係數小,說明模型對樣本觀測值的擬合程度越差。 描述:如R平方為0.8,則表示迴歸關係可以解釋因變數80%的變異,換句話說,如果我們能控制自變數不變,則因變數變異程度將會減少80% 對於 簡單線性迴歸來說,R^2= r * r 對於多元線性迴歸來說, SSR表示由模型引起的誤差平方和,SST表示由實際值引起的差值平方和5:皮爾遜相關係數和R平方值計算示例
#coding:utf-8
'''
Created on 2015年11月8日
@author: Administrator
'''
import numpy as np
import math
#求解皮爾遜相關係數
def computeCorrelation(X, Y):
xBar = np.mean(X)
yBar = np.mean(Y)
SSR = 0
varX = 0
varY = 0
for i in range(0, len(X)):
#對應分子部分
diffXXBar = X[i] - xBar
diffYYBar = Y[i] - yBar
SSR +=(diffXXBar * diffYYBar)
#對應分母求和部分
varX += diffXXBar**2
varY += diffYYBar**2
SST = math.sqrt(varX * varY)
return SSR/SST
def polyfit(x, y, degree):
results = {}
#coeffs 為相關係數,x自變數,y因變數,degree為最高冪
coeffs = np.polyfit(x, y, degree)
#定義一個字典存放值,值為相關係數list
results['polynomial'] = coeffs.tolist()
#p相當於直線方程
p = np.poly1d(coeffs)
yhat = p(x) #傳入x,計算預測值為yhat
ybar = np.sum(y)/len(y) #計算均值
#對應公式
ssreg = np.sum((yhat - ybar) ** 2)
sstot = np.sum((y - ybar) ** 2)
results['determination'] = ssreg / sstot
print" results :",results
return results
testX = [1, 3, 8, 7, 9]
testY = [10, 12, 24, 21, 34]
#輸出的是簡單線性迴歸的皮爾遜相關度和R平方值
print "r : ",computeCorrelation(testX, testY)
print "r^2 : ",str(computeCorrelation(testX, testY)**2)
#
print polyfit(testX, testY, 1)["determination"]
結果顯示為:
二:簡單線性迴歸
1:迴歸與分類的區別
迴歸(regession):Y變數為連續型數值,如房價,人數,降雨量 分類(classification):Y變數為類別型,如顏色類別,電腦品牌,有無信譽2:簡單線性迴歸介紹
迴歸分析:是指建立方程模擬兩個或者多個變數之間如何關聯 迴歸模型:是指被用來描述因變數(y)和自變數(x)以及偏差(error)之間的關係的方程,函式表示為: 簡單線性迴歸方程:模型轉變為即為迴歸方程(類似於一條直線,引數為斜率和y軸的交點) 線性關係包含:正相關,負相關,無關 估計線性方程: 關於偏差:3:簡單線性迴歸示例
<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf8
'''
Created on 2016年4月24日
@author: Gamer Think
'''
#Simple Regession
import numpy as np
#周廣告播放數量
x = [1,3,2,1,3]
#周汽車銷售資料
y = [14,24,18,17,27]
#使用最小二乘法
def fitSLR(x,y):
n = len(x)
denominator = 0
numerator = 0
for i in range(0,n):
numerator += (x[i]-np.mean(x)* (y[i]-np.mean(y)) )
denominator += (x[i]-np.mean(x))**2
print "denominator:",denominator
print "numerator:",numerator
b1 = numerator/float(denominator)
# b0 = np.mean(y)/float(np.mean(x))
b0 = np.mean(y)-b1*np.mean(x)
return b0,b1
def predict(b0,b1,x):
return b0+b1*x
b0,b1 = fitSLR(x,y)
x_test = 6
print "y_test:",predict(b0,b1,x_test)</span></span>
三:多元性迴歸
1:多元迴歸簡介 與簡單線性迴歸的區別:有多個變數x 多元迴歸模型: 多元迴歸方程: 估計多元迴歸方程:(y變成y_hat,即求得是估計值) 估計方法: 2:多元線性迴歸示例 我們需要的資料是第二,三,四列的資料<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf-8
'''
Created on 2016年4月24日
@author: Gamer Think
'''
from sklearn import linear_model
import numpy as np
from numpy import genfromtxt #可以將非array格式的list轉化為array
datapath = "data.csv"
deliverData = genfromtxt(datapath,delimiter=",") #將csv檔案轉化為numpy.array格式
print "data:",deliverData
X= deliverData[:,:-1]
Y = deliverData[:,-1]
print "X:",X
print "Y:",Y
regr = linear_model.LinearRegression()
regr.fit(X,Y)
print "coefficients:",regr.coef_ #與X結合的值
print "intercept:",regr.intercept_ #類似於截距
x_pre = [102,6]
y_pre = regr.predict(x_pre)
print "Y-Predict:",y_pre
</span></span>
3:如果自變數中有分型別變數(categorical data),如何處理?
e g:
首先將分型別變數進行轉化為如下形式(第四五六列表示0,1,2,為1表示使用該型號車)
呼叫的程式碼其實和上邊的是一樣的:
<span style="font-family:Microsoft YaHei;"><span style="font-family:Microsoft YaHei;font-size:18px;">#coding:utf-8
'''
Created on 2016年4月24日
@author: Gamer Think
'''
from numpy import genfromtxt
import numpy as np
from sklearn import datasets, linear_model
dataPath = "dataDumpy.csv"
deleveryData = genfromtxt(dataPath, delimiter=',')
print "data:\n",deleveryData
X = deleveryData[:, :-1]
Y = deleveryData[:, -1]
print "X: ",X
print "Y: ",Y
regr = linear_model.LinearRegression()
regr.fit(X, Y)
print "Coefficients:",regr.coef_ #與X結合的值
print "Intercept:",regr.intercept_ #類似於截距
#
xPred = [102,6,0,0,1]
yPred = regr.predict(xPred)
print "predict y : ",yPred</span></span>
4:關於誤差
四:非線性迴歸
非線性迴歸又稱為邏輯迴歸
1:概率 對一件事情發生可能性的衡量,取值範圍是0~1,計算方法包括,個人置信,歷史資料,模擬資料 條件概率:非線性迴歸例項:
<span style="font-family:Microsoft YaHei;"><span style="font-size:18px;">#coding:utf-8
'''
Created on 2016年4月24日
@author: Gamer Think
'''
import numpy as np
import random
'''
梯度下降演算法
引數說明:X,Y
theta:一組向量和x相乘的一組值
alpha:梯度下降時的引數,即每一步下降多少
m:例項的個數
numIteration:迭代計算的次數,可以理解為梯度下降多少步
'''
def gradientDescent(X,Y,theta,alpha,m,numIteration):
x_trains = X.transpose() #X的轉置矩陣
for i in range(0,numIteration):
hypothesis = np.dot(X,theta) #內積形式,X與theta的乘積 ,求出y的估計值
loss = hypothesis - Y #估計值與真實值之間的差
#通用的梯度下降演算法,和logistic Regession中所描述的cost函式不一致
cos = np.sum(loss**2)/(2*m)
print "Iteration %d | Cost:%f" % (i,cos)
gradient = np.dot(x_trains,loss)/m
theta = theta - alpha*gradient
return theta
'''
numPoints : 點的個數
bias :偏好ֵ
variance : 統計學概念, 偏差和
產生樣本點和對應的標籤
'''
def genData(numPoints,bias,variance):
X = np.zeros(shape=(numPoints,2)) #歸類的資料
Y = np.zeros(shape=numPoints) #歸類的標籤
for i in range(0,numPoints): #從0~len(numPoints)-1執行如下
X[i][0] = 1
X[i][1] = i
#製造target資料
Y[i] = (i+bias) + random.uniform(0,1)*variance
return X,Y
X,Y = genData(100, 25, 10)
# print "X:",X
# print "Y:",Y
m, n = np.shape(X)
n_y = np.shape(Y)
# print "x shape :", m, " ", n
# print "y length :",n_y
numIterations =100000
alpha = 0.0005
theta = np.ones(n)
theta = gradientDescent(X, Y, theta, alpha, m, numIterations)
print "theta: " ,theta
</span></span>
點選 進入個人在有道雲筆記的迴歸分析相關,感興趣的可以看一下