Python實現線性回歸2,梯度下降算法

接上篇

4.梯度下降算法

《斯坦福大學公開課 :機器學習課程》吳恩達講解第二課時,是直接從梯度下降開始講解,最后采用向量和矩陣的方式推導了解析解,國內很多培訓視頻是先講解析解后講梯度下降,個人認為梯度下降算法更為重要,它是很多算法(邏輯回歸、神經網絡)都可以共用的,線性回歸僅僅是湊巧有全局最小值的解法,有解析解,其他大部分算法都需要遍歷數據尋找全局(其實本質上是局部最優)最優解的過程。
解析解直接向量運算存在的問題:(1)矩陣必須是滿秩的,如果不是,python也能模糊處理。(2)運算性能,矩陣擴大化后,量級增大對性能影響明顯。
梯度下降不僅限于線性回歸,非線性和神經網絡同樣適用。

在線性回歸中,θ通過α學習速率在每個J( θ) 減小的維度上進行一個 不定式 θ參數的遞減,不斷更新 θ{i} 的值直到 J(θ) 收斂,達到最小值。類比于下山,每次嘗試找比這個位置低的位置,一步一步到達山底(即我們求的最小值,詳細請看參考資料8)

4.1批量梯度下降算法

老師常常教導我們梯度下降算法這么經典的算法,一定要自己動手推導公式,自己用程序來實現以下,我一直嗤之以鼻,線性回歸這么簡單的算法還需要自己敲代碼實現一下嗎?最近工作閑暇時,我自己用Python實現了下該算法,不敲不知道,一敲嚇一大跳,太多坑在里面了,整整坑在里面2天時間,檢查多遍代碼最后發現是數據問題,學習率α需要取非常非常小的值才能收斂,否則程序一直處于震蕩狀態無法找到近似最小值。說了那么多廢話,下面直接貼代碼,代碼里備注說明很完善,很明了,很清晰了,大家應該能看懂吧o( ̄︶ ̄)o
在這里插入圖片描述
在這里插入圖片描述

def linearRegBgd2(x,y,alpha=0.005,lamba=0.005,loop_max=1000):#alpha = 0.0000001      #學習率步長,learning rate#lamba=0.005     #懲罰系數 '''參考鏈接:https://blog.csdn.net/mango_badnot/article/details/52328740 已將原作者計算過程進行了大量修改,就相當于是我原創了吧,將原計算的三重for循環重寫為一重for循環,將運算修改為了矩陣運算原作者構造的X特征是按行存儲的,與常見數據不太一致,X中第一行為特征1,第二行為特征2此函數將使用正常數據,X特征按列存儲,每行是一條記錄批量梯度下降算法公式:theta=theta + alpha * sum( (y-y_hat) * x)'''np.set_printoptions(precision=4) # 設置numpy輸出4位小數n=len(x[0]) # 取第一行數據,查看數據列數theta=np.zeros(n)      # 初始化theta數組,默認全為0for times in range(loop_max):y_hat=np.dot(x,theta.T).reshape((-1,1))loss= (y_hat-y)  #此處是y_hat-y,對應的theta求解處增加了一個負號loss_n=np.array([]) # 為方便直接用矩陣實現sum( (y-y_hat) * x),產生多列loss乘以loss后求和if n==1: # 判斷x矩陣有幾列,列為1的時候單獨處理loss_n=losselse:for i in range(1,n):# 判斷x矩陣有幾列,列為大于2的時候,產生n列loss#print(i)if i==1:loss_n = np.column_stack((loss, loss))elif i>1:loss_n = np.column_stack((loss_n, loss))theta_old=theta # 記錄迭代前的theta#tmp=alpha*(loss_n*x).sum(axis=0)theta=theta - (alpha*(x*loss_n)).sum(axis=0) #+lamba*theta   #使用矩陣求解theta,注意此處的負號,loss*x后按特征列求和作為theta,注意上方本來想實現懲罰項的,但沒有想明白怎么實現if (theta-theta_old).all()<0.001: # 判斷前后兩次theta變換情況,當變化率很小時跳出循環break#print('x:',x,'y:',y,'loss:',loss)#print('y_hat:',y_hat.T)#print('times:',times,'theta:',theta)#print('')return theta

4.2隨機梯度下降算法

隨機梯度下降就是每一個樣本更新一次權值,超過樣本范圍就循環從第一個樣本再循環,同等數據量情況下(數據量不是特別巨大時)訓練速度與批量梯度下降要慢一些,但是適合在線學習,來一條數據迭代訓練一次。
在這里插入圖片描述

def linearRegSgd(x,y,alpha=0.005,lamba=0.005,loop_max=10000):#alpha = 0.0000001      #學習率步長,learning rate#lamba=0.005     #懲罰系數 '''隨機梯度下降算法公式:theta=theta + alpha * (y-y_hat) * xalpha=0.01lamba=0.005'''np.set_printoptions(precision=4) # 設置numpy輸出4位小數n=len(x[0]) # 取第一行數據,查看數據列數theta=np.zeros(n)      # 初始化theta數組,默認全為0for times in range(loop_max):for i  in range(0,len(x)): # 取其中一條數據進行梯度下降# i=0y_hat=np.dot(x[i],theta.T).reshape((-1,1))loss= (y_hat-y[i])  #此處是y_hat-y,對應的theta求解處增加了一個負號theta_old=theta # 記錄迭代前的thetatheta=theta - alpha*x[i]*loss[0] #+lamba*theta#求解theta,注意此處的負號,注意上方本來想實現懲罰項的,但沒有想明白怎么實現if (theta-theta_old).all()<0.001: # 判斷前后兩次theta變換情況,當變化率很小時跳出循環break
#            print('x:',x,'y:',y,'loss:',loss)
#            print('y_hat:',y_hat.T)
#            print('times:',times,'theta:',theta)
#            print('')return theta

4.3 mini-batch梯度下降算法

如果不是每拿到一個樣本即更改梯度,而是用若干個樣本的平均梯度作為更新方向,這就是Mini-batch梯度下降算法。

def linearRegMgd(x,y,alpha=0.005,lamba=0.005,loop_max=1000,batch_size=9):#alpha = 0.0000001      #學習率步長,learning rate#lamba=0.005     #懲罰系數 '''mini-batch梯度下降算法公式:每次使用batch_size個數據進行計算for i=1 to m: theta=theta + alpha * (y-y_hat) * x'''np.set_printoptions(precision=4) # 設置numpy輸出4位小數n=len(x[0]) # 取第一行數據,查看數據列數theta=np.zeros(n)      # 初始化theta數組,默認全為0for times in range(loop_max):for i in range(0,int(len(x)/batch_size)+1):#print('i:',i,x[i*batch_size:(i+1)*batch_size])x_mini=x[i*batch_size:(i+1)*batch_size]y_mini=y[i*batch_size:(i+1)*batch_size]y_hat=np.dot(x_mini,theta.T).reshape((-1,1))loss= (y_hat-y_mini)  #此處是y_hat-y,對應的theta求解處增加了一個負號loss_n=np.array([]) # 為方便直接用矩陣實現sum( (y-y_hat) * x),產生多列loss乘以loss后求和if n==1: # 判斷x矩陣有幾列,列為1的時候單獨處理loss_n=losselse:for i in range(1,n):# 判斷x矩陣有幾列,列為大于2的時候,產生n列loss#print(i)if i==1:loss_n = np.column_stack((loss, loss))elif i>1:loss_n = np.column_stack((loss_n, loss))theta_old=theta # 記錄迭代前的theta#tmp=alpha*(loss_n*x).sum(axis=0)theta=theta - (alpha*(x_mini*loss_n)).sum(axis=0) #+lamba*theta   #使用矩陣求解theta,注意此處的負號,loss*x后按特征列求和作為theta,注意上方本來想實現懲罰項的,但沒有想明白怎么實現if (theta-theta_old).all()<0.001: # 判斷前后兩次theta變換情況,當變化率很小時跳出循環break#print('x:',x,'y:',y,'loss:',loss)#print('y_hat:',y_hat.T)#print('times:',times,'theta:',theta)#print('')return theta

以上梯度下降算法完整代碼如下

# -*- coding: utf-8 -*-
"""@Time    : 2018/10/22 17:23@Author  : hanzi5@Email   : **@163.com@File    : linear_regression_bgd.py@Software: PyCharm
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegressiondef load_dataset(n): # 原作者產生數據的函數noise = np.random.rand(n)X = [[x, 1.] for x in range(n)]y = [(0.5 * X[i][0]  + 1. + noise[i]) for i in range(n)]return np.array(X).T, np.array(y).T # 注意X,W,y的維數def linearRegLsq(x,y):# 最小二乘法直接求解thetaxtx = np.dot(x.T, x)if np.linalg.det(xtx) == 0.0: # 判斷xtx行列式是否等于0,奇異矩陣不能求逆print('Can not resolve the problem')returntheta_lsq = np.dot(np.dot(np.linalg.inv(np.dot(x.T, x)), x.T), y)return theta_lsqdef linearRegBgd1(x,y,alpha=0.005,lamba=0.005,loop_max=1000):#alpha = 0.0000001      #學習率步長,learning rate#lamba=0.005     #懲罰系數 '''已將原作者計算過程進行了大量修改,已將原作者計算過程進行了大量修改,就相當于是我原創了吧,將原計算的三重for循環重寫為一重for循環參考鏈接:https://blog.csdn.net/mango_badnot/article/details/52328740 原作者構造的X特征是按行存儲的,與常見數據不太一致,X中第一行為特征1,第二行為特征2批量梯度下降算法公式:theta=theta + alpha * sum( (y-y_hat) * x)2018-10-22 17:18 測試通過,此函數不做多的備注了,詳細備注放在了linearRegBgd2里'''np.set_printoptions(precision=4) # 設置numpy輸出4位小數n=len(x) # 取第一行數據,查看數據列數theta=np.zeros(n)      # 初始化theta數組,默認全為0for times in range(loop_max):y_hat=np.dot(x.T,theta)loss= y-y_hatfor i in range(1,n):if i==1:loss_n = np.row_stack((loss, loss))elif i>1:loss_n = np.row_stack((loss_n, loss))theta_old=thetatheta=theta+(alpha*x.T*loss_n.T).sum(axis=0) #+lamba*thetaif (theta-theta_old).all()<0.001:break#print('x:',x,'y:',y,'loss:',loss)#print('times:',times,'theta:',theta)#print('')return thetadef linearRegBgd2(x,y,alpha=0.005,lamba=0.005,loop_max=1000):#alpha = 0.0000001      #學習率步長,learning rate#lamba=0.005     #懲罰系數 '''參考鏈接:https://blog.csdn.net/mango_badnot/article/details/52328740 已將原作者計算過程進行了大量修改,就相當于是我原創了吧,將原計算的三重for循環重寫為一重for循環,將運算修改為了矩陣運算原作者構造的X特征是按行存儲的,與常見數據不太一致,X中第一行為特征1,第二行為特征2此函數將使用正常數據,X特征按列存儲,每行是一條記錄批量梯度下降算法公式:theta=theta + alpha * sum( (y-y_hat) * x)'''np.set_printoptions(precision=4) # 設置numpy輸出4位小數n=len(x[0]) # 取第一行數據,查看數據列數theta=np.zeros(n)      # 初始化theta數組,默認全為0for times in range(loop_max):y_hat=np.dot(x,theta.T).reshape((-1,1))loss= (y_hat-y)  #此處是y_hat-y,對應的theta求解處增加了一個負號loss_n=np.array([]) # 為方便直接用矩陣實現sum( (y-y_hat) * x),產生多列loss乘以loss后求和if n==1: # 判斷x矩陣有幾列,列為1的時候單獨處理loss_n=losselse:for i in range(1,n):# 判斷x矩陣有幾列,列為大于2的時候,產生n列loss#print(i)if i==1:loss_n = np.column_stack((loss, loss))elif i>1:loss_n = np.column_stack((loss_n, loss))theta_old=theta # 記錄迭代前的theta#tmp=alpha*(loss_n*x).sum(axis=0)theta=theta - (alpha*(x*loss_n)).sum(axis=0) #+lamba*theta   #使用矩陣求解theta,注意此處的負號,loss*x后按特征列求和作為theta,注意上方本來想實現懲罰項的,但沒有想明白怎么實現if (theta-theta_old).all()<0.001: # 判斷前后兩次theta變換情況,當變化率很小時跳出循環break#print('x:',x,'y:',y,'loss:',loss)#print('y_hat:',y_hat.T)#print('times:',times,'theta:',theta)#print('')return thetadef linearRegSgd(x,y,alpha=0.005,lamba=0.005,loop_max=10000):#alpha = 0.0000001      #學習率步長,learning rate#lamba=0.005     #懲罰系數 '''隨機梯度下降算法公式:for i=1 to m: theta=theta + alpha * (y-y_hat) * xalpha=0.01lamba=0.005'''np.set_printoptions(precision=4) # 設置numpy輸出4位小數n=len(x[0]) # 取第一行數據,查看數據列數theta=np.zeros(n)      # 初始化theta數組,默認全為0for times in range(loop_max):for i  in range(0,len(x)): # 取其中一條數據進行梯度下降# i=0y_hat=np.dot(x[i],theta.T).reshape((-1,1))loss= (y_hat-y[i])  #此處是y_hat-y,對應的theta求解處增加了一個負號theta_old=theta # 記錄迭代前的thetatheta=theta - alpha*x[i]*loss[0] #+lamba*theta#求解theta,注意此處的負號,注意上方本來想實現懲罰項的,但沒有想明白怎么實現if (theta-theta_old).all()<0.001: # 判斷前后兩次theta變換情況,當變化率很小時跳出循環break
#            print('x:',x,'y:',y,'loss:',loss)
#            print('y_hat:',y_hat.T)
#            print('times:',times,'theta:',theta)
#            print('')return thetadef linearRegMgd(x,y,alpha=0.005,lamba=0.005,loop_max=1000,batch_size=9):#alpha = 0.0000001      #學習率步長,learning rate#lamba=0.005     #懲罰系數 '''mini-batch梯度下降算法公式:每次使用batch_size個數據進行計算for i=1 to m: theta=theta + alpha * (y-y_hat) * x'''np.set_printoptions(precision=4) # 設置numpy輸出4位小數n=len(x[0]) # 取第一行數據,查看數據列數theta=np.zeros(n)      # 初始化theta數組,默認全為0for times in range(loop_max):for i in range(0,int(len(x)/batch_size)+1):#print('i:',i,x[i*batch_size:(i+1)*batch_size])x_mini=x[i*batch_size:(i+1)*batch_size]y_mini=y[i*batch_size:(i+1)*batch_size]y_hat=np.dot(x_mini,theta.T).reshape((-1,1))loss= (y_hat-y_mini)  #此處是y_hat-y,對應的theta求解處增加了一個負號loss_n=np.array([]) # 為方便直接用矩陣實現sum( (y-y_hat) * x),產生多列loss乘以loss后求和if n==1: # 判斷x矩陣有幾列,列為1的時候單獨處理loss_n=losselse:for i in range(1,n):# 判斷x矩陣有幾列,列為大于2的時候,產生n列loss#print(i)if i==1:loss_n = np.column_stack((loss, loss))elif i>1:loss_n = np.column_stack((loss_n, loss))theta_old=theta # 記錄迭代前的theta#tmp=alpha*(loss_n*x).sum(axis=0)theta=theta - (alpha*(x_mini*loss_n)).sum(axis=0) #+lamba*theta   #使用矩陣求解theta,注意此處的負號,loss*x后按特征列求和作為theta,注意上方本來想實現懲罰項的,但沒有想明白怎么實現if (theta-theta_old).all()<0.001: # 判斷前后兩次theta變換情況,當變化率很小時跳出循環break#print('x:',x,'y:',y,'loss:',loss)#print('y_hat:',y_hat.T)#print('times:',times,'theta:',theta)#print('')return thetaif __name__ == "__main__":path = 'D:/python_data/8.Advertising.csv'data = pd.read_csv(path)  # TV、Radio、Newspaper、Sales#data_matrix = data.as_matrix(columns=['TV', 'Radio', 'Newspaper', 'Sales'])  # 轉換數據類型data_array = data.values[:,1:]  # 轉換數據類型,去除第一列序號列x = data_array[:, :-1] #去除y對應列的數據,其他列作為xy = data_array[:, -1].reshape((-1,1))# 0、繪制圖像,查看數據分布情況plt.plot(data['TV'], y, 'ro', label='TV')plt.plot(data['Radio'], y, 'g^', label='Radio')plt.plot(data['Newspaper'], y, 'mv', label='Newspaer')plt.legend(loc='lower right')plt.grid()plt.show()# 1、使用sklearn LinearRegression包求解θlinreg = LinearRegression()model = linreg.fit(x, y)print('')print('1、sklearn LinearRegression包求解θ:','coef:', linreg.coef_[0],',intercept:', linreg.intercept_)# 2、最小二乘法,直接求解析解θtheta_lsq = linearRegLsq(x,y)print('')print('2、最小二乘法,theta解析解:',theta_lsq.reshape(1,3)[0])# 3、批量梯度下降求解theta# 注意下面兩個函數alpha都是非常小的值,取過大的值時,不收斂#x1, y1 = load_dataset(10)#theta1=linearRegBgd1(x1, y1)theta1=linearRegBgd1(x.T, y.T,alpha = 0.0000001)print('')print('3.1、批量梯度下降,linearRegBgd1函數,theta:',theta1)theta2=linearRegBgd2(x, y,alpha = 0.0000001)print('')print('3.2、批量梯度下降,linearRegBgd2函數,theta:',theta2)theta3=linearRegSgd(x, y,alpha = 0.000001,loop_max=10000)print('')print('3.3、隨機梯度下降,linearRegSgd函數,theta:',theta3)theta4=linearRegMgd(x, y,alpha = 0.000001,loop_max=10000,batch_size=11)print('')print('3.4、mini-batch梯度下降,linearRegMgd函數,theta:',theta4)

程序運行計算結果:
在這里插入圖片描述

數據見以下鏈接,復制到txt文檔中,另存為CSV格式即可。
數據

參考資料:
1、python實現線性回歸
2、機器學習:線性回歸與Python代碼實現
3、python實現簡單線性回歸
4、Machine-Learning-With-Python
5、《機器學習》西瓜書,周志華
6、機器學習視頻,鄒博
7、 斯坦福大學公開課 :機器學習課程
8、馬同學高等數學 如何直觀形象的理解方向導數與梯度以及它們之間的關系?
9、【機器學習】線性回歸的梯度下降法

轉載于:https://www.cnblogs.com/hanzi5/p/10105622.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249161.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249161.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249161.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在centos和redhat上安裝docker

前置條件 64-bit 系統kernel 3.101.檢查內核版本&#xff0c;返回的值大于3.10即可。$ uname -r 2.使用 sudo 或 root 權限的用戶登入終端。 3.卸載舊版本(如果安裝過舊版本的話) $ yum remove docker \docker-common \docker-selinux \docker-engine 4.安裝需要的軟件包 #yum-…

mac 下用 brew 安裝mongodb

mac 下安裝mongoDB一般倆種方法. (1)下載源碼,解壓,編譯,配置,啟動 比較艱難的一種模式. (2)brew install mongodb ,然后就可以悠閑的品一口茶,順便瞄一眼網易新聞,這是一種傻瓜模式. 但傻瓜模式也有人為干預的時候,粗略說一下使用brew 安裝mongodb 1 zhangzhimoke:~/code$…

比較python類的兩個instance(對象) 是否相等

http://www.yihaomen.com/article/python/281.htm 比較python類的兩個instance(對象) 是否相等 作者:輕舞肥羊 日期:2012-10-25 字體大小: 小 中 大對于同一個Class,可以創建不同的實例(instance), 如何比較這兩個 instance 是否相等呢&#xff1f;我們知道&#xff0c;對于計算…

Mybaits插入記錄返回主鍵值

某些情況進行insert時不知道主鍵值&#xff08;主鍵為自增&#xff09;&#xff0c;例如系統新增用戶時&#xff0c;有用戶序號&#xff08;主鍵 自增&#xff09;&#xff0c;用戶名&#xff0c;密碼。插入時只需插入用戶名和密碼&#xff0c;之后取得mysql自增的序號。 如下為…

Mac 解決brew一直卡在Updating Homebrew

運行命令brew install node&#xff0c;結果界面一直卡在Updating Homebrew...上&#xff0c;有兩種解決辦法 方法一&#xff1a;直接關閉brew每次執行命令時的自動更新&#xff08;推薦&#xff09; vim ~/.bash_profile# 新增一行 export HOMEBREW_NO_AUTO_UPDATEtrue方法二…

CAS單點登錄原理簡單介紹

1. SSO簡介 1.1 單點登錄定義 單點登錄(Single sign on)&#xff0c;英文名稱縮寫SSO&#xff0c;SSO的意思就是在多系統的環境中&#xff0c;登錄單方系統&#xff0c;就可以在不用再次登錄的情況下訪問相關受信任的系統。也就是說只要登錄一次單體系統就可以。計劃在項目中加…

前端跨域通信的幾種方式

前言 前端通信類的問題&#xff0c;主要包括以下內容&#xff1a; 1、什么是同源策略及限制 同源策略是一個概念&#xff0c;就一句話。有什么限制&#xff0c;就三句話。能說出來即可。 2、前后端如何通信 如果你不準備&#xff0c;估計也就只能說出ajax。 3、如何創建Aja…

T4((Text Template Transformation Toolkit))模版引擎之基礎入門 C#中文本模板(.tt)的應用...

1 關于C#中文本模板(.tt)的簡單應用https://blog.csdn.net/zunguitiancheng/article/details/78011145 任何一個傻瓜都能寫出計算機能理解的程序&#xff0c;而優秀的程序員卻能寫出別人能讀得懂的程序。—— Martin Fowler 2 T4模版引擎之生成數據庫實體類 http://www.cnblogs…

LeetCode412Fizz Buzz

寫一個程序&#xff0c;輸出從 1 到 n 數字的字符串表示。 1. 如果 n 是3的倍數&#xff0c;輸出“Fizz”&#xff1b; 2. 如果 n 是5的倍數&#xff0c;輸出“Buzz”&#xff1b; 3.如果 n 同時是3和5的倍數&#xff0c;輸出 “FizzBuzz”。 示例&#xff1a; n 15, 返回: [ …

vue+node實現中間層同步調用接口

為了應對業務的復雜性&#xff0c;提高前端的渲染能力&#xff0c;故在項目中引入nodejs做中間層&#xff0c;前端承接vue&#xff0c;后端對接Java。 至于為什么這么搞&#xff0c;網上有好多文章都在討論&#xff0c;可以說仁者見仁智者見智&#xff0c;這里我們不在深究。 …

ES6學習筆記(二十二)ArrayBuffer

ArrayBuffer ArrayBuffer對象、TypedArray視圖和DataView視圖是 JavaScript 操作二進制數據的一個接口。它們都是以數組的語法處理二進制數據&#xff0c;所以統稱為二進制數組。 二進制數組由三類對象組成。 &#xff08;1&#xff09;ArrayBuffer對象&#xff1a; 代表內存之…

如何正確地使用Java的@deprecated標注

沒有什么事情比看到一個沒有任何說明的deprecated標注更讓人憤怒的事情了。這種做法只能讓人困惑&#xff0c;我到底還要不要用這個已經‘廢棄’的方法&#xff1f;如果開發者不希望某個方法再被人用的話&#xff0c;就要好好地為deprecated標注寫說明。這篇文章就討論了正確地…

實現div里的img圖片水平垂直居中

body結構 <body><div><img src"1.jpg" alt"haha"></div> </body>方法一&#xff1a; 將display設置成table-cell&#xff0c;然后水平居中設置text-align為center&#xff0c;垂直居中設置vertical-align為middle。 <…

[ 懶人神器 ] —— OO一鍵build:.zip - .jar

懶人神器 更新 大家注意一下&#xff0c;由于在寫入MANIFEST的時候&#xff0c;Class-Path路徑給的是 ../lib &#xff0c;即上級目錄的lib。 所以在對拍時如果手動移動了 jar包的位置&#xff0c;需要保證 lib/ 文件夾在存放jar包的上一級目錄下&#xff0c;否則在運行時會報錯…

實現Datagrid分頁

Html頁面&#xff1a; <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title></title><meta charset"utf-8" /><!-- 引入相關CSS --><…

Luogu 3698 [CQOI2017]小Q的棋盤

BZOJ 4813 雖然數據范圍很迷人&#xff0c;但是想樹形$dp$沒有前途。 先發現一個事情&#xff0c;就是我們可以先選擇一條鏈&#xff0c;最后要走到這一條鏈上不回來&#xff0c;走到鏈上的點每一個只需要一步&#xff0c;而如果要走這條鏈之外的點&#xff0c;一個點需要走兩步…

h5-plus.webview

這里是鏈接轉載于:https://www.cnblogs.com/yuners/p/10721163.html

解決vue打包后靜態資源路徑錯誤的問題

vue項目完成的最后一步就是打包部署上線&#xff0c;但是打包部署的過程往往不是那么一帆風順的&#xff0c;現將遇到問題和解決方案記錄如下。 圖片路徑問題 起因&#xff1a; 頁面中引入資源的方式往往有如下幾種 * HTML標簽中直接引入圖片&#xff0c; 如 <img src&qu…

SQL語句01

SQL(Structured Query Language)&#xff1a;結構化查詢語言SQL分類&#xff1a; 數據操縱語言DML&#xff08;Data Manipulation Language&#xff09; SELECT INSERT UPDATE DELETE 數據定義語言DDL&#xff08;Data definition language&#xff09; …

mongoose 筆記

快速啟動 首先需要安裝MongoDB和Node.js。 然后使用npm下載mongoose&#xff1a; npm install mongoose 接著我們直接在項目中引入mongoose&#xff0c;并且連接數據庫就會在本地運行 MongoDB了&#xff1a; // index.js var mongoose require(mongoose); mongoose.connect(…