優化分體為殘差平方和最小,這是乙個凸優化問題,使用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...