Python 使用cvxpy求解線性回歸問題

2021-10-06 17:49:22 字數 2934 閱讀 2015

優化分體為殘差平方和最小,這是乙個凸優化問題,使用cvxpy,過程過於簡單。

##------資料生成部分----------##

seed = 101

x = np.random.uniform(low=1.0,high=10.0,size=300)

y = x * 20 + 10 + np.random.normal(loc=0.0,scale=10.0,size=300)

##--------凸優化部分-------------##

w = cvx.variable()

b = cvx.variable()

objective = cvx.minimize(cvx.sum_squares((w * x + b) - y))

constrant =

prob = cvx.problem(objective,)

prob.solve()

##------結果視覺化部分----------##

print(w.value)

print(b.value)

show_data(x,y,w.value,b.value)

plt.show()

print("loss=",np.mean(((w.value * x + b.value) - y)**2))

依賴cvxpy你就廢了!你啥都學不到!

配上梯度下降方法計算出的對比。

'''

一元線性回歸

**可以正確執行,執行結果良好

'''import numpy as np

import pandas as pd

import cvxpy as cvx

import matplotlib.pyplot as plt

import os

class linearregression(object):

def __init__(self,learning_rate=0.01,max_iter=100,seed=101):

self.w = np.random.randn(1)[0]

self.b = np.random.randn(1)[0]

self.lr = learning_rate

self.max_iter = max_iter

self.loss_arr =

def fit(self,x,y):

self.x = x

self.y = y

for i in range(self.max_iter):

self.grandient_descent()

def model(self,x):

return self.w * x + self.b

def loss(self,y_true=none,y_pred=none):

if y_true is none or y_pred is none:

y_true = self.y

y_pred = self.model(self.x)

return np.sum((y_true - y_pred) ** 2)

def cal_gradient(self):

d_w = np.sum(2 * (self.model(self.x) - self.y) * self.x)/len(self.x) #不理解為什麼要取平均

d_b = np.sum(2 * (self.model(self.x) - self.y))/len(self.x) #不理解為什麼要取平均

return d_w, d_b

def grandient_descent(self):

d_w,d_b = self.cal_gradient()

self.w -= self.lr * d_w

self.b -= self.lr * d_b

def show_data(x,y,w=none,b=none):

plt.scatter(x,y,marker='.')

if w is not none and b is not none:

plt.plot(x, x*w + b, c='r')

if __name__ == '__main__':

seed = 101

x = np.random.uniform(low=1.0,high=10.0,size=300)

y = x * 20 + 10 + np.random.normal(loc=0.0,scale=10.0,size=300)

regr = linearregression(learning_rate=0.01, max_iter=100, seed=101)

regr.fit(x,y)

# plt.plot(np.arange(len(regr.loss_arr)),regr.loss_arr,marker='o',c='green')

w = cvx.variable()

b = cvx.variable()

objective = cvx.minimize(cvx.sum_squares((w * x + b) - y))

constrant =

prob = cvx.problem(objective, )

prob.solve()

show_data(x, y, w.value, b.value)

show_data(x, y, regr.w, regr.b)

plt.show()

print("loss=", np.mean(((w.value * x + b.value) - y) ** 2))

print(regr.loss_arr[-1]/len(x))

手動調整梯度下降迭代次數

max_iter=100

迭代次數越大,梯度下降的計算結果越貼近cvxpy的優化結果。

CVXPY使用指南

近期工作中遇到了求解最優化問題的業務場景,所以學習了下cvxpy,專門用來求解最優化問題的工具。個人覺得cvxpy還是很強大的,極大的減少了coding的 呼叫也方便,非常實用。cvxpy導航手冊 第一步,先安裝cvxpy。我的電腦是mac,安裝是按照install from source引導的從g...

使用MATLAB和Python迭代求解黃金分割

雖說可能使用python寫幾段小 測試一下演算法,但是我現在學習的確實是matlab的教程。是mooler老爺子的書籍,matlab程式設計體驗。第乙個話題是迭代,這在學習python的時候也是乙個比較重要的話題。書中的例子是用matlab來實現 分割的求解。用python實現了一下如下 看一下,稍...

使用Python求解水仙花問題

題目 輸出所有的水仙花數。所謂水仙花數是指乙個3位數,其各位數字的立方和等於該數本身。例如,153是乙個水仙花數,因為153 1立方 5立方 3立方。解決方法 方法一 使用列表推導式 1 data i for i in range 100,1000 if pow i 100,3 pow i 10 1...