欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

python線性模型函數(shù),python 廣義線性模型

萬字教你如何用 Python 實(shí)現(xiàn)線性規(guī)劃

想象一下,您有一個線性方程組和不等式系統(tǒng)。這樣的系統(tǒng)通常有許多可能的解決方案。線性規(guī)劃是一組數(shù)學(xué)和計(jì)算工具,可讓您找到該系統(tǒng)的特定解,該解對應(yīng)于某些其他線性函數(shù)的最大值或最小值。

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括江寧網(wǎng)站建設(shè)、江寧網(wǎng)站制作、江寧網(wǎng)頁制作以及江寧網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,江寧網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到江寧省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

混合整數(shù)線性規(guī)劃是 線性規(guī)劃 的擴(kuò)展。它處理至少一個變量采用離散整數(shù)而不是連續(xù)值的問題。盡管乍一看混合整數(shù)問題與連續(xù)變量問題相似,但它們在靈活性和精度方面具有顯著優(yōu)勢。

整數(shù)變量對于正確表示自然用整數(shù)表示的數(shù)量很重要,例如生產(chǎn)的飛機(jī)數(shù)量或服務(wù)的客戶數(shù)量。

一種特別重要的整數(shù)變量是 二進(jìn)制變量 。它只能取 零 或 一 的值,在做出是或否的決定時很有用,例如是否應(yīng)該建造工廠或者是否應(yīng)該打開或關(guān)閉機(jī)器。您還可以使用它們來模擬邏輯約束。

線性規(guī)劃是一種基本的優(yōu)化技術(shù),已在科學(xué)和數(shù)學(xué)密集型領(lǐng)域使用了數(shù)十年。它精確、相對快速,適用于一系列實(shí)際應(yīng)用。

混合整數(shù)線性規(guī)劃允許您克服線性規(guī)劃的許多限制。您可以使用分段線性函數(shù)近似非線性函數(shù)、使用半連續(xù)變量、模型邏輯約束等。它是一種計(jì)算密集型工具,但計(jì)算機(jī)硬件和軟件的進(jìn)步使其每天都更加適用。

通常,當(dāng)人們試圖制定和解決優(yōu)化問題時,第一個問題是他們是否可以應(yīng)用線性規(guī)劃或混合整數(shù)線性規(guī)劃。

以下文章說明了線性規(guī)劃和混合整數(shù)線性規(guī)劃的一些用例:

隨著計(jì)算機(jī)能力的增強(qiáng)、算法的改進(jìn)以及更多用戶友好的軟件解決方案的出現(xiàn),線性規(guī)劃,尤其是混合整數(shù)線性規(guī)劃的重要性隨著時間的推移而增加。

解決線性規(guī)劃問題的基本方法稱為,它有多種變體。另一種流行的方法是。

混合整數(shù)線性規(guī)劃問題可以通過更復(fù)雜且計(jì)算量更大的方法來解決,例如,它在幕后使用線性規(guī)劃。這種方法的一些變體是,它涉及使用 切割平面 ,以及。

有幾種適用于線性規(guī)劃和混合整數(shù)線性規(guī)劃的合適且眾所周知的 Python 工具。其中一些是開源的,而另一些是專有的。您是否需要免費(fèi)或付費(fèi)工具取決于問題的規(guī)模和復(fù)雜性,以及對速度和靈活性的需求。

值得一提的是,幾乎所有廣泛使用的線性規(guī)劃和混合整數(shù)線性規(guī)劃庫都是以 Fortran 或 C 或 C++ 原生和編寫的。這是因?yàn)榫€性規(guī)劃需要對(通常很大)矩陣進(jìn)行計(jì)算密集型工作。此類庫稱為求解器。Python 工具只是求解器的包裝器。

Python 適合圍繞本機(jī)庫構(gòu)建包裝器,因?yàn)樗梢院芎玫嘏c C/C++ 配合使用。對于本教程,您不需要任何 C/C++(或 Fortran),但如果您想了解有關(guān)此酷功能的更多信息,請查看以下資源:

基本上,當(dāng)您定義和求解模型時,您使用 Python 函數(shù)或方法調(diào)用低級庫,該庫執(zhí)行實(shí)際優(yōu)化工作并將解決方案返回給您的 Python 對象。

幾個免費(fèi)的 Python 庫專門用于與線性或混合整數(shù)線性規(guī)劃求解器交互:

在本教程中,您將使用SciPy和PuLP來定義和解決線性規(guī)劃問題。

在本節(jié)中,您將看到線性規(guī)劃問題的兩個示例:

您將在下一節(jié)中使用 Python 來解決這兩個問題。

考慮以下線性規(guī)劃問題:

你需要找到X和?使得紅色,藍(lán)色和黃色的不平等,以及不平等X 0和? 0,是滿意的。同時,您的解決方案必須對應(yīng)于z的最大可能值。

您需要找到的自變量(在本例中為 x 和 y )稱為 決策變量 。要最大化或最小化的決策變量的函數(shù)(在本例中為 z) 稱為 目標(biāo)函數(shù) 、 成本函數(shù) 或僅稱為 目標(biāo) 。您需要滿足的 不等式 稱為 不等式約束 。您還可以在稱為 等式約束 的約束中使用方程。

這是您如何可視化問題的方法:

紅線代表的功能2 X + Y = 20,和它上面的紅色區(qū)域示出了紅色不等式不滿足。同樣,藍(lán)線是函數(shù) 4 x + 5 y = 10,藍(lán)色區(qū)域被禁止,因?yàn)樗`反了藍(lán)色不等式。黃線是 x + 2 y = 2,其下方的黃色區(qū)域是黃色不等式無效的地方。

如果您忽略紅色、藍(lán)色和黃色區(qū)域,則僅保留灰色區(qū)域。灰色區(qū)域的每個點(diǎn)都滿足所有約束,是問題的潛在解決方案。該區(qū)域稱為 可行域 ,其點(diǎn)為 可行解 。在這種情況下,有無數(shù)可行的解決方案。

您想最大化z。對應(yīng)于最大z的可行解是 最優(yōu)解 。如果您嘗試最小化目標(biāo)函數(shù),那么最佳解決方案將對應(yīng)于其可行的最小值。

請注意,z是線性的。你可以把它想象成一個三維空間中的平面。這就是為什么最優(yōu)解必須在可行區(qū)域的 頂點(diǎn) 或角上的原因。在這種情況下,最佳解決方案是紅線和藍(lán)線相交的點(diǎn),稍后您將看到。

有時,可行區(qū)域的整個邊緣,甚至整個區(qū)域,都可以對應(yīng)相同的z值。在這種情況下,您有許多最佳解決方案。

您現(xiàn)在已準(zhǔn)備好使用綠色顯示的附加等式約束來擴(kuò)展問題:

方程式 x + 5 y = 15,以綠色書寫,是新的。這是一個等式約束。您可以通過向上一張圖像添加相應(yīng)的綠線來將其可視化:

現(xiàn)在的解決方案必須滿足綠色等式,因此可行區(qū)域不再是整個灰色區(qū)域。它是綠線從與藍(lán)線的交點(diǎn)到與紅線的交點(diǎn)穿過灰色區(qū)域的部分。后一點(diǎn)是解決方案。

如果插入x的所有值都必須是整數(shù)的要求,那么就會得到一個混合整數(shù)線性規(guī)劃問題,可行解的集合又會發(fā)生變化:

您不再有綠線,只有沿線的x值為整數(shù)的點(diǎn)。可行解是灰色背景上的綠點(diǎn),此時最優(yōu)解離紅線最近。

這三個例子說明了 可行的線性規(guī)劃問題 ,因?yàn)樗鼈兙哂杏薪缈尚袇^(qū)域和有限解。

如果沒有解,線性規(guī)劃問題是 不可行的 。當(dāng)沒有解決方案可以同時滿足所有約束時,通常會發(fā)生這種情況。

例如,考慮如果添加約束x + y 1會發(fā)生什么。那么至少有一個決策變量(x或y)必須是負(fù)數(shù)。這與給定的約束x 0 和y 0相沖突。這樣的系統(tǒng)沒有可行的解決方案,因此稱為不可行的。

另一個示例是添加與綠線平行的第二個等式約束。這兩行沒有共同點(diǎn),因此不會有滿足這兩個約束的解決方案。

一個線性規(guī)劃問題是 無界的 ,如果它的可行區(qū)域是無界,將溶液不是有限。這意味著您的變量中至少有一個不受約束,可以達(dá)到正無窮大或負(fù)無窮大,從而使目標(biāo)也無限大。

例如,假設(shè)您采用上面的初始問題并刪除紅色和黃色約束。從問題中刪除約束稱為 放松 問題。在這種情況下,x和y不會在正側(cè)有界。您可以將它們增加到正無窮大,從而產(chǎn)生無限大的z值。

在前面的部分中,您研究了一個與任何實(shí)際應(yīng)用程序無關(guān)的抽象線性規(guī)劃問題。在本小節(jié)中,您將找到與制造業(yè)資源分配相關(guān)的更具體和實(shí)用的優(yōu)化問題。

假設(shè)一家工廠生產(chǎn)四種不同的產(chǎn)品,第一種產(chǎn)品的日產(chǎn)量為x ?,第二種產(chǎn)品的產(chǎn)量為x 2,依此類推。目標(biāo)是確定每種產(chǎn)品的利潤最大化日產(chǎn)量,同時牢記以下條件:

數(shù)學(xué)模型可以這樣定義:

目標(biāo)函數(shù)(利潤)在條件 1 中定義。人力約束遵循條件 2。對原材料 A 和 B 的約束可以從條件 3 和條件 4 中通過對每種產(chǎn)品的原材料需求求和得出。

最后,產(chǎn)品數(shù)量不能為負(fù),因此所有決策變量必須大于或等于零。

與前面的示例不同,您無法方便地將其可視化,因?yàn)樗兴膫€決策變量。但是,無論問題的維度如何,原理都是相同的。

在本教程中,您將使用兩個Python 包來解決上述線性規(guī)劃問題:

SciPy 設(shè)置起來很簡單。安裝后,您將擁有開始所需的一切。它的子包 scipy.optimize 可用于線性和非線性優(yōu)化。

PuLP 允許您選擇求解器并以更自然的方式表述問題。PuLP 使用的默認(rèn)求解器是COIN-OR Branch and Cut Solver (CBC)。它連接到用于線性松弛的COIN-OR 線性規(guī)劃求解器 (CLP)和用于切割生成的COIN-OR 切割生成器庫 (CGL)。

另一個偉大的開源求解器是GNU 線性規(guī)劃工具包 (GLPK)。一些著名且非常強(qiáng)大的商業(yè)和專有解決方案是Gurobi、CPLEX和XPRESS。

除了在定義問題時提供靈活性和運(yùn)行各種求解器的能力外,PuLP 使用起來不如 Pyomo 或 CVXOPT 等替代方案復(fù)雜,后者需要更多的時間和精力來掌握。

要學(xué)習(xí)本教程,您需要安裝 SciPy 和 PuLP。下面的示例使用 SciPy 1.4.1 版和 PuLP 2.1 版。

您可以使用pip以下方法安裝兩者:

您可能需要運(yùn)行pulptest或sudo pulptest啟用 PuLP 的默認(rèn)求解器,尤其是在您使用 Linux 或 Mac 時:

或者,您可以下載、安裝和使用 GLPK。它是免費(fèi)和開源的,適用于 Windows、MacOS 和 Linux。在本教程的后面部分,您將看到如何將 GLPK(除了 CBC)與 PuLP 一起使用。

在 Windows 上,您可以下載檔案并運(yùn)行安裝文件。

在 MacOS 上,您可以使用 Homebrew:

在 Debian 和 Ubuntu 上,使用apt來安裝glpk和glpk-utils:

在Fedora,使用dnf具有g(shù)lpk-utils:

您可能還會發(fā)現(xiàn)conda對安裝 GLPK 很有用:

安裝完成后,可以查看GLPK的版本:

有關(guān)詳細(xì)信息,請參閱 GLPK 關(guān)于使用Windows 可執(zhí)行文件和Linux 軟件包進(jìn)行安裝的教程。

在本節(jié)中,您將學(xué)習(xí)如何使用 SciPy優(yōu)化和求根庫進(jìn)行線性規(guī)劃。

要使用 SciPy 定義和解決優(yōu)化問題,您需要導(dǎo)入scipy.optimize.linprog():

現(xiàn)在您已經(jīng)linprog()導(dǎo)入,您可以開始優(yōu)化。

讓我們首先解決上面的線性規(guī)劃問題:

linprog()僅解決最小化(而非最大化)問題,并且不允許具有大于或等于符號 ( ) 的不等式約束。要解決這些問題,您需要在開始優(yōu)化之前修改您的問題:

引入這些更改后,您將獲得一個新系統(tǒng):

該系統(tǒng)與原始系統(tǒng)等效,并且將具有相同的解決方案。應(yīng)用這些更改的唯一原因是克服 SciPy 與問題表述相關(guān)的局限性。

下一步是定義輸入值:

您將上述系統(tǒng)中的值放入適當(dāng)?shù)牧斜怼⒃M或NumPy 數(shù)組中:

注意:請注意行和列的順序!

約束左側(cè)和右側(cè)的行順序必須相同。每一行代表一個約束。

來自目標(biāo)函數(shù)和約束左側(cè)的系數(shù)的順序必須匹配。每列對應(yīng)一個決策變量。

下一步是以與系數(shù)相同的順序定義每個變量的界限。在這種情況下,它們都在零和正無窮大之間:

此語句是多余的,因?yàn)閘inprog()默認(rèn)情況下采用這些邊界(零到正無窮大)。

注:相反的float("inf"),你可以使用math.inf,numpy.inf或scipy.inf。

最后,是時候優(yōu)化和解決您感興趣的問題了。你可以這樣做linprog():

參數(shù)c是指來自目標(biāo)函數(shù)的系數(shù)。A_ub和b_ub分別與不等式約束左邊和右邊的系數(shù)有關(guān)。同樣,A_eq并b_eq參考等式約束。您可以使用bounds提供決策變量的下限和上限。

您可以使用該參數(shù)method來定義要使用的線性規(guī)劃方法。有以下三種選擇:

linprog() 返回具有以下屬性的數(shù)據(jù)結(jié)構(gòu):

您可以分別訪問這些值:

這就是您獲得優(yōu)化結(jié)果的方式。您還可以以圖形方式顯示它們:

如前所述,線性規(guī)劃問題的最優(yōu)解位于可行區(qū)域的頂點(diǎn)。在這種情況下,可行區(qū)域只是藍(lán)線和紅線之間的綠線部分。最優(yōu)解是代表綠線和紅線交點(diǎn)的綠色方塊。

如果要排除相等(綠色)約束,只需刪除參數(shù)A_eq并b_eq從linprog()調(diào)用中刪除:

解決方案與前一種情況不同。你可以在圖表上看到:

在這個例子中,最優(yōu)解是紅色和藍(lán)色約束相交的可行(灰色)區(qū)域的紫色頂點(diǎn)。其他頂點(diǎn),如黃色頂點(diǎn),具有更高的目標(biāo)函數(shù)值。

您可以使用 SciPy 來解決前面部分所述的資源分配問題:

和前面的例子一樣,你需要從上面的問題中提取必要的向量和矩陣,將它們作為參數(shù)傳遞給.linprog(),然后得到結(jié)果:

結(jié)果告訴您最大利潤是1900并且對應(yīng)于x ? = 5 和x ? = 45。在給定條件下生產(chǎn)第二和第四個產(chǎn)品是沒有利潤的。您可以在這里得出幾個有趣的結(jié)論:

opt.statusis0和opt.successis True,說明優(yōu)化問題成功求解,最優(yōu)可行解。

SciPy 的線性規(guī)劃功能主要用于較小的問題。對于更大和更復(fù)雜的問題,您可能會發(fā)現(xiàn)其他庫更適合,原因如下:

幸運(yùn)的是,Python 生態(tài)系統(tǒng)為線性編程提供了幾種替代解決方案,這些解決方案對于更大的問題非常有用。其中之一是 PuLP,您將在下一節(jié)中看到它的實(shí)際應(yīng)用。

PuLP 具有比 SciPy 更方便的線性編程 API。您不必在數(shù)學(xué)上修改您的問題或使用向量和矩陣。一切都更干凈,更不容易出錯。

像往常一樣,您首先導(dǎo)入您需要的內(nèi)容:

現(xiàn)在您已經(jīng)導(dǎo)入了 PuLP,您可以解決您的問題。

您現(xiàn)在將使用 PuLP 解決此系統(tǒng):

第一步是初始化一個實(shí)例LpProblem來表示你的模型:

您可以使用該sense參數(shù)來選擇是執(zhí)行最小化(LpMinimize或1,這是默認(rèn)值)還是最大化(LpMaximize或-1)。這個選擇會影響你的問題的結(jié)果。

一旦有了模型,就可以將決策變量定義為LpVariable類的實(shí)例:

您需要提供下限,lowBound=0因?yàn)槟J(rèn)值為負(fù)無窮大。該參數(shù)upBound定義了上限,但您可以在此處省略它,因?yàn)樗J(rèn)為正無窮大。

可選參數(shù)cat定義決策變量的類別。如果您使用的是連續(xù)變量,則可以使用默認(rèn)值"Continuous"。

您可以使用變量x和y創(chuàng)建表示線性表達(dá)式和約束的其他 PuLP 對象:

當(dāng)您將決策變量與標(biāo)量相乘或構(gòu)建多個決策變量的線性組合時,您會得到一個pulp.LpAffineExpression代表線性表達(dá)式的實(shí)例。

注意:您可以增加或減少變量或表達(dá)式,你可以乘他們常數(shù),因?yàn)榧垵{類實(shí)現(xiàn)一些Python的特殊方法,即模擬數(shù)字類型一樣__add__(),__sub__()和__mul__()。這些方法用于像定制運(yùn)營商的行為+,-和*。

類似地,您可以將線性表達(dá)式、變量和標(biāo)量與運(yùn)算符 ==、=以獲取表示模型線性約束的紙漿.LpConstraint實(shí)例。

注:也有可能與豐富的比較方法來構(gòu)建的約束.__eq__(),.__le__()以及.__ge__()定義了運(yùn)營商的行為==,=。

考慮到這一點(diǎn),下一步是創(chuàng)建約束和目標(biāo)函數(shù)并將它們分配給您的模型。您不需要創(chuàng)建列表或矩陣。只需編寫 Python 表達(dá)式并使用+=運(yùn)算符將它們附加到模型中:

在上面的代碼中,您定義了包含約束及其名稱的元組。LpProblem允許您通過將約束指定為元組來向模型添加約束。第一個元素是一個LpConstraint實(shí)例。第二個元素是該約束的可讀名稱。

設(shè)置目標(biāo)函數(shù)非常相似:

或者,您可以使用更短的符號:

現(xiàn)在您已經(jīng)添加了目標(biāo)函數(shù)并定義了模型。

注意:您可以使用運(yùn)算符將 約束或目標(biāo)附加到模型中,+=因?yàn)樗念怢pProblem實(shí)現(xiàn)了特殊方法.__iadd__(),該方法用于指定 的行為+=。

對于較大的問題,lpSum()與列表或其他序列一起使用通常比重復(fù)+運(yùn)算符更方便。例如,您可以使用以下語句將目標(biāo)函數(shù)添加到模型中:

它產(chǎn)生與前一條語句相同的結(jié)果。

您現(xiàn)在可以看到此模型的完整定義:

模型的字符串表示包含所有相關(guān)數(shù)據(jù):變量、約束、目標(biāo)及其名稱。

注意:字符串表示是通過定義特殊方法構(gòu)建的.__repr__()。有關(guān) 的更多詳細(xì)信息.__repr__(),請查看Pythonic OOP 字符串轉(zhuǎn)換:__repr__vs__str__ .

最后,您已準(zhǔn)備好解決問題。你可以通過調(diào)用.solve()你的模型對象來做到這一點(diǎn)。如果要使用默認(rèn)求解器 (CBC),則不需要傳遞任何參數(shù):

.solve()調(diào)用底層求解器,修改model對象,并返回解決方案的整數(shù)狀態(tài),1如果找到了最優(yōu)解。有關(guān)其余狀態(tài)代碼,請參閱LpStatus[]。

你可以得到優(yōu)化結(jié)果作為 的屬性model。該函數(shù)value()和相應(yīng)的方法.value()返回屬性的實(shí)際值:

model.objective持有目標(biāo)函數(shù)model.constraints的值,包含松弛變量的值,以及對象x和y具有決策變量的最優(yōu)值。model.variables()返回一個包含決策變量的列表:

如您所見,此列表包含使用 的構(gòu)造函數(shù)創(chuàng)建的確切對象LpVariable。

結(jié)果與您使用 SciPy 獲得的結(jié)果大致相同。

注意:注意這個方法.solve()——它會改變對象的狀態(tài),x并且y!

您可以通過調(diào)用查看使用了哪個求解器.solver:

輸出通知您求解器是 CBC。您沒有指定求解器,因此 PuLP 調(diào)用了默認(rèn)求解器。

如果要運(yùn)行不同的求解器,則可以將其指定為 的參數(shù).solve()。例如,如果您想使用 GLPK 并且已經(jīng)安裝了它,那么您可以solver=GLPK(msg=False)在最后一行使用。請記住,您還需要導(dǎo)入它:

現(xiàn)在你已經(jīng)導(dǎo)入了 GLPK,你可以在里面使用它.solve():

該msg參數(shù)用于顯示來自求解器的信息。msg=False禁用顯示此信息。如果要包含信息,則只需省略msg或設(shè)置msg=True。

您的模型已定義并求解,因此您可以按照與前一種情況相同的方式檢查結(jié)果:

使用 GLPK 得到的結(jié)果與使用 SciPy 和 CBC 得到的結(jié)果幾乎相同。

一起來看看這次用的是哪個求解器:

正如您在上面用突出顯示的語句定義的那樣model.solve(solver=GLPK(msg=False)),求解器是 GLPK。

您還可以使用 PuLP 來解決混合整數(shù)線性規(guī)劃問題。要定義整數(shù)或二進(jìn)制變量,只需傳遞cat="Integer"或cat="Binary"到LpVariable。其他一切都保持不變:

在本例中,您有一個整數(shù)變量并獲得與之前不同的結(jié)果:

Nowx是一個整數(shù),如模型中所指定。(從技術(shù)上講,它保存一個小數(shù)點(diǎn)后為零的浮點(diǎn)值。)這一事實(shí)改變了整個解決方案。讓我們在圖表上展示這一點(diǎn):

如您所見,最佳解決方案是灰色背景上最右邊的綠點(diǎn)。這是兩者的最大價(jià)值的可行的解決方案x和y,給它的最大目標(biāo)函數(shù)值。

GLPK 也能夠解決此類問題。

現(xiàn)在你可以使用 PuLP 來解決上面的資源分配問題:

定義和解決問題的方法與前面的示例相同:

在這種情況下,您使用字典 x來存儲所有決策變量。這種方法很方便,因?yàn)樽值淇梢詫Q策變量的名稱或索引存儲為鍵,將相應(yīng)的LpVariable對象存儲為值。列表或元組的LpVariable實(shí)例可以是有用的。

上面的代碼產(chǎn)生以下結(jié)果:

如您所見,該解決方案與使用 SciPy 獲得的解決方案一致。最有利可圖的解決方案是每天生產(chǎn)5.0第一件產(chǎn)品和45.0第三件產(chǎn)品。

讓我們把這個問題變得更復(fù)雜和有趣。假設(shè)由于機(jī)器問題,工廠無法同時生產(chǎn)第一種和第三種產(chǎn)品。在這種情況下,最有利可圖的解決方案是什么?

現(xiàn)在您有另一個邏輯約束:如果x ? 為正數(shù),則x ? 必須為零,反之亦然。這是二元決策變量非常有用的地方。您將使用兩個二元決策變量y ? 和y ?,它們將表示是否生成了第一個或第三個產(chǎn)品:

除了突出顯示的行之外,代碼與前面的示例非常相似。以下是差異:

這是解決方案:

事實(shí)證明,最佳方法是排除第一種產(chǎn)品而只生產(chǎn)第三種產(chǎn)品。

就像有許多資源可以幫助您學(xué)習(xí)線性規(guī)劃和混合整數(shù)線性規(guī)劃一樣,還有許多具有 Python 包裝器的求解器可用。這是部分列表:

其中一些庫,如 Gurobi,包括他們自己的 Python 包裝器。其他人使用外部包裝器。例如,您看到可以使用 PuLP 訪問 CBC 和 GLPK。

您現(xiàn)在知道什么是線性規(guī)劃以及如何使用 Python 解決線性規(guī)劃問題。您還了解到 Python 線性編程庫只是本機(jī)求解器的包裝器。當(dāng)求解器完成其工作時,包裝器返回解決方案狀態(tài)、決策變量值、松弛變量、目標(biāo)函數(shù)等。

如何用python作空間自回歸模型

基本形式

線性模型(linear model)就是試圖通過屬性的線性組合來進(jìn)行預(yù)測的函數(shù),基本形式如下:

f(x)=wTx+b

許多非線性模型可在線性模型的基礎(chǔ)上通過引入層結(jié)構(gòu)或者高維映射(比如核方法)來解決。線性模型有很好的解釋性。

線性回歸

線性回歸要求均方誤差最小:

(w?,b?)=argmin∑i=1m(f(xi)?yi)2

均方誤差有很好的幾何意義,它對應(yīng)了常用的歐式距離(Euclidean distance)。基于均方誤差最小化來進(jìn)行模型求解稱為最小二乘法(least square method),線性回歸中,最小二乘發(fā)就是試圖找到一條直線,使得所有樣本到直線的歐式距離之和最小。

我們把上式寫成矩陣的形式:

w?=argmin(y?Xw)T(y?Xw)

這里我們把b融合到w中,X中最后再加一列1。為了求最小值,我們對w求導(dǎo)并令其為0:

2XT(Xw?y)=0

當(dāng)XTX為滿秩矩陣(full-rank matrix)時是可逆的。此時:

w=(XTX)?1XTy

令xi=(xi,1),可以得到線性回歸模型:

f(xi)=xTi(XTX)?1XTy

線性模型-分類模型

線性模型也可用于分類問題。我們首先來看二分類。我們可以利用下面的公式預(yù)測:

y^=w[0]x[0]+w[1]x[1]+...+w[p]*x[p]+b0

這個公式與線性回歸的公式非常相似,但我們沒有返回特征的加權(quán)求和,而是為預(yù)測設(shè)置了閾值(0)。如果函數(shù)值小于0,我們就預(yù)測類別-1,如果函數(shù)值大于0,我們就預(yù)測類別+1。對于所有用于分類的線性模型,這個預(yù)測規(guī)則都是通用的。同樣,有很多不同的方法來找出系數(shù)(w)和截距(b)。

對于用于回歸的線性模型,輸出y^是特征的線性函數(shù),是直線、平面或超平面(對于更高維的數(shù)據(jù)集)。對于用于分類的線性模型, 決策邊界 是輸入的線性函數(shù)。換句話說,(二元)線性分類器是利用直線、平面或超平面來分開兩個類別的分類器。

學(xué)習(xí)線性模型有很多種算法。這些算法的區(qū)別在于以下兩點(diǎn):

1.系數(shù)和截距的特定組合對訓(xùn)練數(shù)據(jù)擬合好壞的度量方法;

2.是否使用正則化,以及使用哪種正則化方法。

不同的算法使用不同的方法來度量“對訓(xùn)練集擬合好壞”。由于數(shù)學(xué)上的技術(shù)原因,不可能調(diào)節(jié)w和b使得算法產(chǎn)生的誤分類數(shù)量最少。對于我們的目的,以及對于許多有用而言,上面第一點(diǎn)(稱為 損失函數(shù) )的選擇并不重要。

最常見的兩種線性分類算法是 Logistic回歸(logistic regression) 和 線性支持向量機(jī)(linear support vector machine,線性SVM) 。

Python version:3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]

pandas version:0.23.4

matplotlib version:3.0.2

Numpy version:1.15.4

Scipy version:1.1.0

IPython version:7.2.0

scikit-learn version:0.20.1

對于LogisticRegression和LinearSVC,決定正則化強(qiáng)度的權(quán)衡參數(shù)叫作C。C值越大,對應(yīng)的正則化越弱。換句話說,如果參數(shù)C值較大,那么LogisticRegression和LinearSVC將盡可能將訓(xùn)練集擬合到最好,而如果C值較小,那么模型更強(qiáng)調(diào)使系數(shù)向量(w)接近于0。

參數(shù)C的作用還有另一個有趣之處。較小的C值可以讓算法盡量適應(yīng)“大多數(shù)”數(shù)據(jù)點(diǎn),而較大的C值強(qiáng)調(diào)每個數(shù)據(jù)點(diǎn)都分類正確的重要性。

mglearn.plots.plot_linear_svc_regularization()

Training set score:0.953

Test set score:0.958

C=1的默認(rèn)值給出了相當(dāng)好的性能,在訓(xùn)練集和測試集上都達(dá)到95%的精度。但由于訓(xùn)練集和測試集的性能非常接近,所以模型很可能是欠擬合的。我們嘗試增大C來擬合一個更靈活的模型:

Training set score:0.972

Test set score:0.965

使用C=100可以得到更高的訓(xùn)練集精度,也得到了稍高的測試集精度,這也證實(shí)了我們的直覺,即更復(fù)雜的模型應(yīng)該性能更好。

Training set score:0.934

Test set score:0.930

最后,看一下正則化參數(shù)C取三個不同的值模型學(xué)到的系數(shù):

LogisticRegression模型默認(rèn)應(yīng)用L2正則化。更強(qiáng)的正則化使的系數(shù)更趨向于0,但系數(shù)永遠(yuǎn)不會正好等于0。進(jìn)一步觀察圖像,還可以第3個系數(shù)那里發(fā)現(xiàn)有趣之處,這個系數(shù)是“平均周長”(mean perimeter)。C=100和C=1時這個系數(shù)為正,其絕對值比C=1時還要大。在解釋這樣的模型時,系數(shù)可以告訴我們某個特征與哪個類別有關(guān)。例如,人們可能會認(rèn)為高“紋理錯誤”(texture error)特征與“惡性”樣本有關(guān)。但“平均周長”系數(shù)的正負(fù)號發(fā)生變化,說明較大的“平均周長”可以被當(dāng)作“良性”的指標(biāo)或“惡性”的指標(biāo),具體取決于我們考慮的是哪個模型。這也說明,對線性模型系數(shù)的解釋應(yīng)該始終持保留態(tài)度。

如果想要一個可解釋性更強(qiáng)的模型,使用L1正則化可能更好,因?yàn)樗s束模型只使用少數(shù)幾個特征:

Training accuracy of l1 logreg with C=0.001:0.91

Test accuracy of l1 logreg with C=0.001:0.92

Training accuracy of l1 logreg with C=1.000:0.96

Test accuracy of l1 logreg with C=1.000:0.96

Training accuracy of l1 logreg with C=100.000:0.99

Test accuracy of l1 logreg with C=100.000:0.98

將二分類算法推廣到多分類算法的一種常見方法是“一對多余”(one-vs.-rest)方法。在“一對多余”方法中,對每個類別都學(xué)習(xí)一個二分類模型,將這個類別與所有其他類別盡量分開,這樣就生成了與類別格式一樣多的二分類偶像。在測試點(diǎn)上運(yùn)行所有二分類器來進(jìn)行預(yù)測。在對應(yīng)類別上分?jǐn)?shù)最高的分類器“勝出”,將這個類別標(biāo)簽返回作為預(yù)測結(jié)果。

每個類別都對應(yīng)一個二類分類器,這樣每個類別都有一個系數(shù)(w)向量與一個截距(b)。

我們將“一對多余”方法應(yīng)用在一個簡單的三分類數(shù)據(jù)集上。我們用到了一個二維數(shù)據(jù)集,每個類別的數(shù)據(jù)都是從一個高斯分布中采樣得出的:

在上面的數(shù)據(jù)集上訓(xùn)練一個LinearSVC分類器:

Coefficient shape: (3, 2)

Intercept shape: (3,)

我們看到,coef_的形狀是(3,2),說明coef_每行包含三個類別之一的系數(shù)向量,每列包含某個特征(這個數(shù)據(jù)集有2個特征)對應(yīng)的系數(shù)值。現(xiàn)在intercetp_是一維數(shù)組,保存每個類別的截距,我們將這3個二分類器給出的直線可視化:

你可以看到,訓(xùn)練集中所有屬于類別0的點(diǎn)都在類別0對應(yīng)的直線上方,這說明它們位于這個二分類器屬于“類別0”的那一側(cè)。屬于類別0的點(diǎn)位于與類別2對應(yīng)的直線上方,這說明它們被類別2的二分類器劃為“其余”。屬于類別0的點(diǎn)位于與類別1對應(yīng)的直線左側(cè),這說明類別1的二元分類器將它們劃為“其余”。因此,這一區(qū)域的所有點(diǎn)都會被最終分類器劃為類別0(類別0的分類器的分類置信方程的結(jié)果大于0,其他兩個類別對應(yīng)的結(jié)果小于0)。

但圖像中間的三角形區(qū)域?qū)儆谀囊粋€類別呢,3個分類器都將這一區(qū)域內(nèi)的點(diǎn)劃為“其余”。這里的點(diǎn)應(yīng)該應(yīng)該劃歸到哪一個類別呢?答案是分類方程結(jié)果最大的那個類別,即最接近的那條線對應(yīng)的類別。

線性模型的主要參數(shù)是正則化參數(shù),在回歸模型中叫作alpha,在LinearSVC和LogisticRegression中叫作C。alpha值較大或C值較小,說明模型比較簡單。特別是對于回歸模型而言,調(diào)節(jié)這些參數(shù)非常重要。通常在對數(shù)尺度上對C和alpha進(jìn)行搜索。你還需要確定的是用L1正則化還是L2正則化。如果你假定只有幾個特征是真正重要的,那么你應(yīng)該用的是L1正則化,否則默認(rèn)使用L2正則化。如果模型的可解釋性很重要的話,使用L1也會有幫助。由于L1只用到幾個特征,所以更容易解釋哪些特征對模型時重要的,以及這些特征的作用。

線性模型的訓(xùn)練速度非常快,預(yù)測速度也很快。這種模型可以推廣到非常大的數(shù)據(jù)集,對稀疏數(shù)據(jù)也很有效。如果你的數(shù)據(jù)包含數(shù)十萬甚至上百萬個樣本,你可能需要研究使用LogisticRegression和Ridge模型的solver='sag'選項(xiàng),在處理大型數(shù)據(jù)時,這一選項(xiàng)比默認(rèn)值要更快。其他選項(xiàng)還有SGDClassifier類和SGDRegressor類,它們對線性模型實(shí)現(xiàn)了可擴(kuò)展性更強(qiáng)的版本。

線性模型的另一個優(yōu)點(diǎn)在于,利用我們之前見過的用于回歸和分類的公式,理解如何進(jìn)行預(yù)測是相對比較容易的。不幸的是,往往并不完全清楚系數(shù)為什么是這樣的。如果你的數(shù)據(jù)集中包含高度相關(guān)的特征,這一問題尤為突出。在這種情況下,可能很難對系數(shù)做出解釋。

如果特征數(shù)量大于樣本數(shù)量,線性模型的表現(xiàn)通常都很好。它也常用于非常大的數(shù)據(jù)集,只是尤為訓(xùn)練其他模型并不可行。但在更低維的空間中,其他模型的泛化性能可能更好。

python多元線性回歸怎么計(jì)算

1、什么是多元線性回歸模型?

當(dāng)y值的影響因素不唯一時,采用多元線性回歸模型。

y =y=β0+β1x1+β2x2+...+βnxn

例如商品的銷售額可能不電視廣告投入,收音機(jī)廣告投入,報(bào)紙廣告投入有關(guān)系,可以有 sales =β0+β1*TV+β2* radio+β3*newspaper.

2、使用pandas來讀取數(shù)據(jù)

pandas 是一個用于數(shù)據(jù)探索、數(shù)據(jù)分析和數(shù)據(jù)處理的python庫

[python]?view plain?copy

import?pandas?as?pd

[html]?view plain?copy

pre?name="code"?class="python"#?read?csv?file?directly?from?a?URL?and?save?the?results

data?=?pd.read_csv('/home/lulei/Advertising.csv')

#?display?the?first?5?rows

data.head()

上面代碼的運(yùn)行結(jié)果:

TV ?Radio ?Newspaper ?Sales

0 ?230.1 ? 37.8 ? ? ? 69.2 ? 22.1

1 ? 44.5 ? 39.3 ? ? ? 45.1 ? 10.4

2 ? 17.2 ? 45.9 ? ? ? 69.3 ? ?9.3

3 ?151.5 ? 41.3 ? ? ? 58.5 ? 18.5

4 ?180.8 ? 10.8 ? ? ? 58.4 ? 12.9

上面顯示的結(jié)果類似一個電子表格,這個結(jié)構(gòu)稱為Pandas的數(shù)據(jù)幀(data frame),類型全稱:pandas.core.frame.DataFrame.

pandas的兩個主要數(shù)據(jù)結(jié)構(gòu):Series和DataFrame:

Series類似于一維數(shù)組,它有一組數(shù)據(jù)以及一組與之相關(guān)的數(shù)據(jù)標(biāo)簽(即索引)組成。

DataFrame是一個表格型的數(shù)據(jù)結(jié)構(gòu),它含有一組有序的列,每列可以是不同的值類型。DataFrame既有行索引也有列索引,它可以被看做由Series組成的字典。

[python]?view plain?copy

#?display?the?last?5?rows

data.tail()

只顯示結(jié)果的末尾5行

?TV ?Radio ?Newspaper ?Sales

195 ? 38.2 ? ?3.7 ? ? ? 13.8 ? ?7.6

196 ? 94.2 ? ?4.9 ? ? ? ?8.1 ? ?9.7

197 ?177.0 ? ?9.3 ? ? ? ?6.4 ? 12.8

198 ?283.6 ? 42.0 ? ? ? 66.2 ? 25.5

199 ?232.1 ? ?8.6 ? ? ? ?8.7 ? 13.4

[html]?view plain?copy

#?check?the?shape?of?the?DataFrame(rows,?colums)

data.shape

查看DataFrame的形狀,注意第一列的叫索引,和數(shù)據(jù)庫某個表中的第一列類似。

(200,4)?

3、分析數(shù)據(jù)

特征:

TV:對于一個給定市場中單一產(chǎn)品,用于電視上的廣告費(fèi)用(以千為單位)

Radio:在廣播媒體上投資的廣告費(fèi)用

Newspaper:用于報(bào)紙媒體的廣告費(fèi)用

響應(yīng):

Sales:對應(yīng)產(chǎn)品的銷量

在這個案例中,我們通過不同的廣告投入,預(yù)測產(chǎn)品銷量。因?yàn)轫憫?yīng)變量是一個連續(xù)的值,所以這個問題是一個回歸問題。數(shù)據(jù)集一共有200個觀測值,每一組觀測對應(yīng)一個市場的情況。

注意:這里推薦使用的是seaborn包。網(wǎng)上說這個包的數(shù)據(jù)可視化效果比較好看。其實(shí)seaborn也應(yīng)該屬于matplotlib的內(nèi)部包。只是需要再次的單獨(dú)安裝。

[python]?view plain?copy

import?seaborn?as?sns

import?matplotlib.pyplot?as?plt

#?visualize?the?relationship?between?the?features?and?the?response?using?scatterplots

sns.pairplot(data,?x_vars=['TV','Radio','Newspaper'],?y_vars='Sales',?size=7,?aspect=0.8)

plt.show()#注意必須加上這一句,否則無法顯示。

[html]?view plain?copy

這里選擇TV、Radio、Newspaper?作為特征,Sales作為觀測值

[html]?view plain?copy

返回的結(jié)果:

seaborn的pairplot函數(shù)繪制X的每一維度和對應(yīng)Y的散點(diǎn)圖。通過設(shè)置size和aspect參數(shù)來調(diào)節(jié)顯示的大小和比例。可以從圖中看出,TV特征和銷量是有比較強(qiáng)的線性關(guān)系的,而Radio和Sales線性關(guān)系弱一些,Newspaper和Sales線性關(guān)系更弱。通過加入一個參數(shù)kind='reg',seaborn可以添加一條最佳擬合直線和95%的置信帶。

[python]?view plain?copy

sns.pairplot(data,?x_vars=['TV','Radio','Newspaper'],?y_vars='Sales',?size=7,?aspect=0.8,?kind='reg')

plt.show()

結(jié)果顯示如下:

4、線性回歸模型

優(yōu)點(diǎn):快速;沒有調(diào)節(jié)參數(shù);可輕易解釋;可理解。

缺點(diǎn):相比其他復(fù)雜一些的模型,其預(yù)測準(zhǔn)確率不是太高,因?yàn)樗僭O(shè)特征和響應(yīng)之間存在確定的線性關(guān)系,這種假設(shè)對于非線性的關(guān)系,線性回歸模型顯然不能很好的對這種數(shù)據(jù)建模。

線性模型表達(dá)式:?y=β0+β1x1+β2x2+...+βnxn?其中

y是響應(yīng)

β0是截距

β1是x1的系數(shù),以此類推

在這個案例中:?y=β0+β1?TV+β2?Radio+...+βn?Newspaper

(1)、使用pandas來構(gòu)建X(特征向量)和y(標(biāo)簽列)

scikit-learn要求X是一個特征矩陣,y是一個NumPy向量。

pandas構(gòu)建在NumPy之上。

因此,X可以是pandas的DataFrame,y可以是pandas的Series,scikit-learn可以理解這種結(jié)構(gòu)。

[python]?view plain?copy

#create?a?python?list?of?feature?names

feature_cols?=?['TV',?'Radio',?'Newspaper']

#?use?the?list?to?select?a?subset?of?the?original?DataFrame

X?=?data[feature_cols]

#?equivalent?command?to?do?this?in?one?line

X?=?data[['TV',?'Radio',?'Newspaper']]

#?print?the?first?5?rows

print?X.head()

#?check?the?type?and?shape?of?X

print?type(X)

print?X.shape

輸出結(jié)果如下:

TV ?Radio ?Newspaper

0 ?230.1 ? 37.8 ? ? ? 69.2

1 ? 44.5 ? 39.3 ? ? ? 45.1

2 ? 17.2 ? 45.9 ? ? ? 69.3

3 ?151.5 ? 41.3 ? ? ? 58.5

4 ?180.8 ? 10.8 ? ? ? 58.4

class 'pandas.core.frame.DataFrame'

(200, 3)

[python]?view plain?copy

#?select?a?Series?from?the?DataFrame

y?=?data['Sales']

#?equivalent?command?that?works?if?there?are?no?spaces?in?the?column?name

y?=?data.Sales

#?print?the?first?5?values

print?y.head()

輸出的結(jié)果如下:

0 ? ?22.1

1 ? ?10.4

2 ? ? 9.3

3 ? ?18.5

4 ? ?12.9

Name: Sales

(2)、構(gòu)建訓(xùn)練集與測試集

[html]?view plain?copy

pre?name="code"?class="python"span?style="font-size:14px;"##構(gòu)造訓(xùn)練集和測試集

from?sklearn.cross_validation?import?train_test_split??#這里是引用了交叉驗(yàn)證

X_train,X_test,?y_train,?y_test?=?train_test_split(X,?y,?random_state=1)

#default split is 75% for training and 25% for testing

[html]?view plain?copy

print?X_train.shape

print?y_train.shape

print?X_test.shape

print?y_test.shape

輸出結(jié)果如下:

(150, 3)

(150,)

(50, 3)

(50,)

注:上面的結(jié)果是由train_test_spilit()得到的,但是我不知道為什么我的版本的sklearn包中居然報(bào)錯:

ImportError ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Traceback (most recent call last)ipython-input-182-3eee51fcba5a in module() ? ? ?1 ###構(gòu)造訓(xùn)練集和測試集---- 2 from sklearn.cross_validation import train_test_split ? ? ?3 #import sklearn.cross_validation ? ? ?4 X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1) ? ? ?5 # default split is 75% for training and 25% for testingImportError: cannot import name train_test_split

處理方法:1、我后來重新安裝sklearn包。再一次調(diào)用時就沒有錯誤了。

2、自己寫函數(shù)來認(rèn)為的隨機(jī)構(gòu)造訓(xùn)練集和測試集。(這個代碼我會在最后附上。)

(3)sklearn的線性回歸

[html]?view plain?copy

from?sklearn.linear_model?import?LinearRegression

linreg?=?LinearRegression()

model=linreg.fit(X_train,?y_train)

print?model

print?linreg.intercept_

print?linreg.coef_

輸出的結(jié)果如下:

LinearRegression(copy_X=True, fit_intercept=True, normalize=False)

2.66816623043

[ 0.04641001 ?0.19272538 -0.00349015]

[html]?view plain?copy

#?pair?the?feature?names?with?the?coefficients

zip(feature_cols,?linreg.coef_)

輸出如下:

[('TV', 0.046410010869663267),

('Radio', 0.19272538367491721),

('Newspaper', -0.0034901506098328305)]

y=2.668+0.0464?TV+0.192?Radio-0.00349?Newspaper

如何解釋各個特征對應(yīng)的系數(shù)的意義?

對于給定了Radio和Newspaper的廣告投入,如果在TV廣告上每多投入1個單位,對應(yīng)銷量將增加0.0466個單位。就是加入其它兩個媒體投入固定,在TV廣告上每增加1000美元(因?yàn)閱挝皇?000美元),銷量將增加46.6(因?yàn)閱挝皇?000)。但是大家注意這里的newspaper的系數(shù)居然是負(fù)數(shù),所以我們可以考慮不使用newspaper這個特征。這是后話,后面會提到的。

(4)、預(yù)測

[python]?view plain?copy

y_pred?=?linreg.predict(X_test)

print?y_pred

[python]?view plain?copy

print?type(y_pred)

輸出結(jié)果如下:

[ 14.58678373 ? 7.92397999 ?16.9497993 ? 19.35791038 ? 7.36360284

7.35359269 ?16.08342325 ? 9.16533046 ?20.35507374 ?12.63160058

22.83356472 ? 9.66291461 ? 4.18055603 ?13.70368584 ?11.4533557

4.16940565 ?10.31271413 ?23.06786868 ?17.80464565 ?14.53070132

15.19656684 ?14.22969609 ? 7.54691167 ?13.47210324 ?15.00625898

19.28532444 ?20.7319878 ? 19.70408833 ?18.21640853 ? 8.50112687

9.8493781 ? ?9.51425763 ? 9.73270043 ?18.13782015 ?15.41731544

5.07416787 ?12.20575251 ?14.05507493 ?10.6699926 ? ?7.16006245

11.80728836 ?24.79748121 ?10.40809168 ?24.05228404 ?18.44737314

20.80572631 ? 9.45424805 ?17.00481708 ? 5.78634105 ? 5.10594849]

type 'numpy.ndarray'

5、回歸問題的評價(jià)測度

(1) 評價(jià)測度

對于分類問題,評價(jià)測度是準(zhǔn)確率,但這種方法不適用于回歸問題。我們使用針對連續(xù)數(shù)值的評價(jià)測度(evaluation metrics)。

這里介紹3種常用的針對線性回歸的測度。

1)平均絕對誤差(Mean Absolute Error, MAE)

(2)均方誤差(Mean Squared Error, MSE)

(3)均方根誤差(Root Mean Squared Error, RMSE)

這里我使用RMES。

[python]?view plain?copy

pre?name="code"?class="python"#計(jì)算Sales預(yù)測的RMSE

print?type(y_pred),type(y_test)

print?len(y_pred),len(y_test)

print?y_pred.shape,y_test.shape

from?sklearn?import?metrics

import?numpy?as?np

sum_mean=0

for?i?in?range(len(y_pred)):

sum_mean+=(y_pred[i]-y_test.values[i])**2

sum_erro=np.sqrt(sum_mean/50)

#?calculate?RMSE?by?hand

print?"RMSE?by?hand:",sum_erro

最后的結(jié)果如下:

type 'numpy.ndarray' class 'pandas.core.series.Series'

50 50

(50,) (50,)

RMSE by hand: 1.42998147691

(2)做ROC曲線

[python]?view plain?copy

import?matplotlib.pyplot?as?plt

plt.figure()

plt.plot(range(len(y_pred)),y_pred,'b',label="predict")

plt.plot(range(len(y_pred)),y_test,'r',label="test")

plt.legend(loc="upper?right")?#顯示圖中的標(biāo)簽

plt.xlabel("the?number?of?sales")

plt.ylabel('value?of?sales')

plt.show()

顯示結(jié)果如下:(紅色的線是真實(shí)的值曲線,藍(lán)色的是預(yù)測值曲線)

直到這里整個的一次多元線性回歸的預(yù)測就結(jié)束了。

6、改進(jìn)特征的選擇

在之前展示的數(shù)據(jù)中,我們看到Newspaper和銷量之間的線性關(guān)系竟是負(fù)關(guān)系(不用驚訝,這是隨機(jī)特征抽樣的結(jié)果。換一批抽樣的數(shù)據(jù)就可能為正了),現(xiàn)在我們移除這個特征,看看線性回歸預(yù)測的結(jié)果的RMSE如何?

依然使用我上面的代碼,但只需修改下面代碼中的一句即可:

[python]?view plain?copy

#create?a?python?list?of?feature?names

feature_cols?=?['TV',?'Radio',?'Newspaper']

#?use?the?list?to?select?a?subset?of?the?original?DataFrame

X?=?data[feature_cols]

#?equivalent?command?to?do?this?in?one?line

#X?=?data[['TV',?'Radio',?'Newspaper']]#只需修改這里即可pre?name="code"?class="python"?style="font-size:?15px;?line-height:?35px;"X?=?data[['TV',?'Radio']]??#去掉newspaper其他的代碼不變

# print the first 5 rowsprint X.head()# check the type and shape of Xprint type(X)print X.shape

最后的到的系數(shù)與測度如下:

LinearRegression(copy_X=True, fit_intercept=True, normalize=False)

2.81843904823

[ 0.04588771 ?0.18721008]

RMSE by hand: 1.28208957507

然后再次使用ROC曲線來觀測曲線的整體情況。我們在將Newspaper這個特征移除之后,得到RMSE變小了,說明Newspaper特征可能不適合作為預(yù)測銷量的特征,于是,我們得到了新的模型。我們還可以通過不同的特征組合得到新的模型,看看最終的誤差是如何的。

備注:

之前我提到了這種錯誤:

注:上面的結(jié)果是由train_test_spilit()得到的,但是我不知道為什么我的版本的sklearn包中居然報(bào)錯:

ImportError ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Traceback (most recent call last)ipython-input-182-3eee51fcba5a in module() ? ? ?1 ###構(gòu)造訓(xùn)練集和測試集---- 2 from sklearn.cross_validation import train_test_split ? ? ?3 #import sklearn.cross_validation ? ? ?4 X_train,X_test, y_train, y_test = train_test_split(X, y, random_state=1) ? ? ?5 # default split is 75% for training and 25% for testingImportError: cannot import name train_test_split

處理方法:1、我后來重新安裝sklearn包。再一次調(diào)用時就沒有錯誤了。

2、自己寫函數(shù)來認(rèn)為的隨機(jī)構(gòu)造訓(xùn)練集和測試集。(這個代碼我會在最后附上。)

這里我給出我自己寫的函數(shù):

當(dāng)前名稱:python線性模型函數(shù),python 廣義線性模型
URL分享:http://chinadenli.net/article31/dsgsdsd.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化品牌網(wǎng)站設(shè)計(jì)企業(yè)網(wǎng)站制作微信小程序網(wǎng)站制作定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管