Python實現(xiàn)梯度下降算法求多元線性回歸(一)

預(yù)備知識及相關(guān)文檔博客

數(shù)據(jù)介紹

  • 數(shù)據(jù)介紹: Auto-mpg 汽車性能相關(guān)參數(shù):
    共有398個樣本娘侍,以及9個變量咖刃,分別是mpg(燃料效率)憾筏、cylinders(發(fā)動機里的氣缸數(shù)量)、displacement(發(fā)動機的位移)枫浙、horsepower(發(fā)動機的馬力古拴,有缺失值)、weight(汽車的重量)黄痪、acceleration(汽車的加速性能)、model year(汽車類型的生產(chǎn)年份)焕参、car name(汽車品牌)等等

梯度下降算法及線性回歸算法介紹

  • 回歸分析:
    數(shù)學(xué)意義上來說是給定一個點集油额,能夠用一條曲線去擬合之,如果這個曲線是一條直線潦嘶,那就被稱為線性回歸,線性回歸在這里也不過多解釋掂僵,這篇文章主要是為了實現(xiàn)算法。在回歸分析中幔睬,只包括一個自變量和一個因變量芹扭,即y=θ0+θ1X稱為一元線性回歸分析。若是包含多個因變量則是多元線性回歸舱卡,即y=θ0+θ1X1+θ2X2+…+θnXn。
    簡單來說就是給你一堆數(shù)據(jù)矫钓,你從幾個不同變量中找出它們之間的函數(shù)關(guān)系,并求出這些匹配不同變量的系數(shù)新娜,如θ0,θ1等匆帚。
  • 梯度下降算法:
    梯度下降法是一種最優(yōu)化算法旁钧,它是用迭代的方法求解目標(biāo)函數(shù)得到最優(yōu)解吸重,是在cost function(成本函數(shù))的基礎(chǔ)上歪今,利用梯度迭代求出局部最優(yōu)解嚎幸。
    這里不過多解釋寄猩,下面實現(xiàn)代碼時會給出公式推導(dǎo)。

算法實現(xiàn)

  • 相關(guān)數(shù)據(jù)截圖:


    UCI的機器學(xué)習(xí)數(shù)據(jù)庫
  1. 網(wǎng)站的數(shù)據(jù)是以csv文件形式給出的替废,因此可以用pandas的read_csv()讀取泊柬,但由于這個網(wǎng)站的數(shù)據(jù)沒有表頭,所以我們在讀取時要加上表頭兽赁,下面是代碼,并且后面會針對部分代碼給出解釋
from io import StringIO
from urllib import request
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import ssl
import pandas as pd
import numpy as np
import linearRegrassion as lg

ssl._create_default_https_context = ssl._create_unverified_context

names =["mpg","cylinders","displacement","horsepower",
        "weight","acceleration","model year","origin","car name"]

url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'
s = request.urlopen(url).read().decode('utf8')

dataFile = StringIO(s)
cReader = pd.read_csv(dataFile,delim_whitespace=True,names=names) # 將流 轉(zhuǎn)換為可迭代的 reader(csv row)
  • names是加上的表頭惊科,作為read_csv()的參數(shù)傳給它
  • read_csv()還有一個參數(shù)filepath_or_buffer :
    str亮钦,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)
    可以是URL蜂莉,可用URL類型包括:http, ftp, s3和文件
  • 這里要注意一下,直接讀取url: pd.read_csv(url,delim_whitespace=True,names=names)會報urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)>的錯誤
    因此要import ssl并加上下面這幾行語句
ssl._create_default_https_context = ssl._create_unverified_context
s = request.urlopen(url).read().decode('utf8')
dataFile = StringIO(s)  # 將字符串轉(zhuǎn)換為 StringIO對象,使其具有文件屬性
  1. 觀察加載后的數(shù)據(jù)(如下圖)男公,截圖較短,你可以對照上下表或是元數(shù)據(jù)集觀察


    加上表頭后的數(shù)據(jù)

    我們可以發(fā)現(xiàn),有一定變化幅度并且比較相關(guān)聯(lián)的幾個量是mpg(燃料效率)澄阳,displacement(發(fā)動機的位移)踏拜,horsepower(發(fā)動機的馬力,有缺失值)速梗,acceleration(汽車的加速性能)
    通常情況下,我們關(guān)注汽車性能時主要看它的加速性能枕赵,所以我們選取acceleration為關(guān)鍵性能位隶,考量mpg拷窜,displacement對其的影響涧黄,以此做一個回歸分析

  • 其實horsepower與加速性能也很相關(guān),但由于有缺失值懊昨,需要額外操作挽鞠,在此我們還是要把重心放到實現(xiàn)算法本身上,所以先不予考慮
  • 我們首先將上面代碼得到的數(shù)據(jù)集繪制散點圖信认,觀察一下它的分布,代碼如下:
ax = plt.subplot(111, projection='3d')  # 創(chuàng)建一個三維的繪圖工程
ax.scatter(cReader["mpg"][:100],cReader["displacement"][:100],cReader["acceleration"][:100],c='y')      
#根據(jù)不同數(shù)據(jù)范圍散點取不同顏色以便于區(qū)分
ax.scatter(cReader["mpg"][100:250],cReader["displacement"][100:250],cReader["acceleration"][100:250],c='r')
ax.scatter(cReader["mpg"][250:],cReader["displacement"][250:],cReader["acceleration"][250:],c='b')

ax.set_zlabel('acceleration')  # 坐標(biāo)軸
ax.set_ylabel('displacement')
ax.set_xlabel('mpg')
plt.show()
# 繪制mpg和displacement的二維散點圖其掂,其實也是三維散點圖在x,y平面上的投影
plt.scatter(cReader["mpg"],cReader["displacement"])
plt.xlabel('mpg')
plt.ylabel('displacement')
plt.show()

得到的散點圖:


3d散點圖.png

mpg和displacement的二維散點圖:


Figure_2d.png
  1. 在這篇文章里我們介紹了一些準(zhǔn)備知識潦蝇,并且通過python的pandas模塊獲取了相關(guān)數(shù)據(jù)集并將其可視化,在下面的系列文章里我會介紹如何處理這些數(shù)據(jù)并且實現(xiàn)算法:
    第二篇已更新: Python實現(xiàn)梯度下降求多元線性回歸(二)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贤牛,一起剝皮案震驚了整個濱河市则酝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖武鲁,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝠检,死亡現(xiàn)場離奇詭異,居然都是意外死亡叹谁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門排拷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锅尘,“玉大人,你說我怎么就攤上這事藤违。” “怎么了议街?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵璧榄,是天一觀的道長。 經(jīng)常有香客問我骨杂,道長,這世上最難降的妖魔是什么蛤售? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任妒潭,我火速辦了婚禮,結(jié)果婚禮上雳灾,老公的妹妹穿的比我還像新娘。我一直安慰自己记靡,他們只是感情好谈竿,可當(dāng)我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚎花,像睡著了一般。 火紅的嫁衣襯著肌膚如雪紊选。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天献烦,我揣著相機與錄音卖词,去河邊找鬼。 笑死此蜈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裆赵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼页藻,長吁一口氣:“原來是場噩夢啊……” “哼植兰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钉跷,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彬坏,沒想到半個月后膝晾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡血当,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了落恼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡戴涝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出啥刻,到底是詐尸還是另有隱情咪笑,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布窗怒,位于F島的核電站,受9級特大地震影響申窘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剃法,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一路鹰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晋柱,春花似錦、人聲如沸雁竞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽进栽。三九已至德挣,卻和暖如春快毛,著一層夾襖步出監(jiān)牢的瞬間番挺,已是汗流浹背屯掖。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贴铜,地道東北人禁荸。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓阀湿,卻偏偏與公主長得像瑰妄,于是被迫代替她去往敵國和親陷嘴。 傳聞我的和親對象是個殘疾皇子间坐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容