前端基礎(chǔ)知識(shí)谷歌官方seo入門指南
線性回歸
- 一.單變量線性回歸
- 題目
- 損失函數(shù)(代價(jià)函數(shù))
- 梯度下降函數(shù)
- 代價(jià)函數(shù)可視化
- 整體代碼
- 二.多變量線性回歸
- 特征歸一化(特征縮放)
- 不同學(xué)習(xí)率比較
- 正規(guī)方程
- 正規(guī)方程與梯度下降比較
- 使用列表創(chuàng)建一維數(shù)組
- 使用嵌套列表創(chuàng)建二維數(shù)組(矩陣)
- 創(chuàng)建一個(gè)3x3的零矩陣
- 創(chuàng)建一個(gè)3x3的1矩陣
- 創(chuàng)建一個(gè)3x3的矩陣,所有元素都是42
- 使用arange生成一個(gè)一維數(shù)組
- 使用linspace在指定間隔內(nèi)生成均勻間隔的數(shù)值
- 生成一個(gè)3x3的隨機(jī)浮點(diǎn)數(shù)矩陣
- 生成一個(gè)3x3的隨機(jī)整數(shù)矩陣,元素范圍在0到10之間
一.單變量線性回歸
題目
numpy:科學(xué)計(jì)算庫(kù),處理多維數(shù)組,進(jìn)行數(shù)據(jù)分析
pandas :是基于NumPy的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的
Matplotlib:Python 的2D繪圖庫(kù)
matplotlib.pyplot:提供一個(gè)類似matlab的繪圖框架
dataframe轉(zhuǎn)數(shù)組三種方式
dataframe - > ndarray.
1.df.xalues,
2.df.as_matrix()
3.np.array(df)
繪制散點(diǎn)圖
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltdata=pd.read_csv("E:/學(xué)習(xí)/研究生階段/python-learning/吳恩達(dá)機(jī)器學(xué)習(xí)課后作業(yè)/code/ex1-linear regression/ex1data1.txt",names=["population","profit"])
#print(data.describe())
data.plot.scatter("population","profit",label="population")
plt.show()
損失函數(shù)(代價(jià)函數(shù))
def costfunction(x,y,theta):inner=np.power ( x @ theta-y,2)return np.sum(inner)/(2*len(x))
這個(gè)函數(shù) costfunction 是用來(lái)計(jì)算線性回歸中的成本(或損失)函數(shù)的,具體來(lái)說(shuō)是均方誤差(Mean Squared Error, MSE)成本函數(shù)。這個(gè)函數(shù)接受三個(gè)參數(shù):x(特征矩陣),y(目標(biāo)變量向量),和theta(參數(shù)向量,即線性模型的權(quán)重和偏置項(xiàng))。下面是該函數(shù)的詳細(xì)解釋:
參數(shù)解釋:
x:特征矩陣,其形狀通常為 (m, n),其中 m 是樣本數(shù)量,n 是特征數(shù)量(不包括偏置項(xiàng))。
y:目標(biāo)變量向量,其形狀為 (m,),即每個(gè)樣本對(duì)應(yīng)一個(gè)目標(biāo)值。
theta:參數(shù)向量,其長(zhǎng)度應(yīng)與 x 的特征數(shù)量加1相等(如果 x 不包含偏置項(xiàng)的話),因?yàn)槲覀冃枰粋€(gè)額外的偏置項(xiàng)。theta 的第一個(gè)元素通常被認(rèn)為是偏置項(xiàng)(截距),而其余元素對(duì)應(yīng)于每個(gè)特征的權(quán)重。
函數(shù)邏輯:
x @ theta:這是矩陣乘法操作,計(jì)算 x 和 theta 的點(diǎn)積。如果 theta 的第一個(gè)元素是偏置項(xiàng),那么 x 應(yīng)該包含一列全為1的列(通常作為第一列),以對(duì)應(yīng)偏置項(xiàng)。這樣,x @ theta 的結(jié)果就是一個(gè)預(yù)測(cè)值向量,其形狀與 y 相同((m,))。
np.power(x @ theta - y, 2):計(jì)算預(yù)測(cè)值與實(shí)際值之間的差的平方。這是計(jì)算誤差的一種方式,平方是為了確保所有誤差都是正的,并且能夠放大較大的誤差。
np.sum(inner):將上一步得到的誤差平方向量中的所有元素相加,得到總誤差。
return np.sum(inner)/(2len(x)):將總誤差除以 2m(其中 m 是樣本數(shù)量),得到平均誤差的平方的一半。除以2主要是為了在求導(dǎo)時(shí)簡(jiǎn)化表達(dá)式,因?yàn)樵趯?shí)際應(yīng)用中,我們經(jīng)常需要計(jì)算成本函數(shù)的梯度,而這個(gè)操作可以簡(jiǎn)化梯度的計(jì)算。
注意事項(xiàng):
在使用這個(gè)函數(shù)之前,需要確保 x 包含了偏置項(xiàng)(即一列全為1的列),除非你的 theta 已經(jīng)被相應(yīng)地調(diào)整過(guò)(例如,theta 的第一個(gè)元素不代表偏置項(xiàng))。
確保 np(NumPy庫(kù))已經(jīng)被正確導(dǎo)入,因?yàn)楹瘮?shù)中用到了 np.power 和 np.sum 等NumPy庫(kù)中的函數(shù)。
這個(gè)函數(shù)是線性回歸模型訓(xùn)練過(guò)程中的一個(gè)重要組成部分,通過(guò)最小化這個(gè)成本函數(shù),我們可以找到最佳的 theta 值,使得模型的預(yù)測(cè)值盡可能接近實(shí)際值。
[[0.] [0.]]
這個(gè)數(shù)據(jù)是一個(gè)二維的浮點(diǎn)數(shù)列表(或可以視為一個(gè)2x1的矩陣),用Python的列表表示法來(lái)表示。每個(gè)子列表都包含一個(gè)浮點(diǎn)數(shù) 0.,表示0.0(即0的浮點(diǎn)數(shù)表示)。具體來(lái)說(shuō),數(shù)據(jù)是這樣的:
python
[
[0.], # 第一個(gè)子列表,包含一個(gè)浮點(diǎn)數(shù)0.0
[0.] # 第二個(gè)子列表,也包含一個(gè)浮點(diǎn)數(shù)0.0
]
在Python中,這種數(shù)據(jù)結(jié)構(gòu)是一個(gè)嵌套的列表(list of lists),外層列表包含兩個(gè)元素,每個(gè)元素都是一個(gè)包含一個(gè)浮點(diǎn)數(shù)的內(nèi)層列表。這種數(shù)據(jù)結(jié)構(gòu)可以很方便地用numpy庫(kù)轉(zhuǎn)換成矩陣(numpy array)進(jìn)行處理。
例如,使用numpy可以這樣轉(zhuǎn)換:
python
import numpy as np
data = [[0.], [0.]]
matrix = np.array(data)
print(matrix)
這段代碼會(huì)輸出:
[[0.]
[0.]]
這就是一個(gè)2x1的浮點(diǎn)數(shù)矩陣。在數(shù)據(jù)分析、機(jī)器學(xué)習(xí)或科學(xué)計(jì)算中,這種數(shù)據(jù)結(jié)構(gòu)非常常見,特別是當(dāng)使用numpy、pandas或其他科學(xué)計(jì)算庫(kù)時(shí)。
梯度下降函數(shù)
"""
定義梯度下降函數(shù)
alpha:學(xué)習(xí)速率
inters:迭代次數(shù)
"""
def gradientDescent(x,y,theta,alpha,inters):for i in range(inters):costs=[]theta=theta-(x.T @ (x@theta-y))*alpha/len(x)cost=costfunction(x,y,theta)costs.append(cost)if i%100==0:print(cost)return theta,costs
代價(jià)函數(shù)可視化
fig是整張圖
ax是
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltfig, ax =plt.subplots()
ax.plot()
plt.show()
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltfig, ax =plt.subplots(2,2)
ax1=ax[0,1]
ax1.plot()
plt.show()
整體代碼
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt#定義代價(jià)函數(shù)
def costfunction(x,y,theta):inner=np.power ( x @ theta-y,2)return np.sum(inner)/(2*len(x))"""
定義梯度下降函數(shù)
alpha:學(xué)習(xí)速率
inters:迭代次數(shù)
"""
def gradientDescent(x,y,theta,alpha,inters):costs=[]for i in range(inters):theta=theta-(x.T @ (x@theta-y))*alpha/len(x)cost=costfunction(x,y,theta)costs.append(cost)# if i%100==0:# print(cost)return theta,coststheta=np.zeros((2,1))#theta初始值2x1零矩陣
alpha=0.02#學(xué)習(xí)速率初始化
inters=2000#迭代次數(shù)初始化
data=pd.read_csv("E:/學(xué)習(xí)/研究生階段/python-learning/吳恩達(dá)機(jī)器學(xué)習(xí)課后作業(yè)/code/ex1-linear regression/ex1data1.txt",names=["population","profit"])
#print(data.describe())
#data.plot.scatter("population","profit",label="population")
#plt.show()
data.insert(0,"ones",1)
x=data.iloc[:,0:-1]#取數(shù)據(jù)的0-倒數(shù)第二列,取所有行
#print(x)
y=data.iloc[:,-1:]
x=x.valuesy=y.values#y.shape,求矩陣大小
theta,costs=gradientDescent(x,y,theta,alpha,inters)fig,ax=plt.subplots(1,2)
ax1=ax[0]
ax1.plot(np.arange(inters),costs)
ax1.set(xlabel="inters",ylabel="costs",title="costs Vs inters")x_=np.linspace(y.min(),y.max(),100)
print(x_)
y_=theta[0,0]+theta[1,0]*x_
ax2=ax[1]
ax2.scatter(x[:,1],y,label="training data")
ax2.plot(x_,y_,"r",label="predect")
ax2.legend()
plt.show()
二.多變量線性回歸
特征歸一化(特征縮放)
1. 消除特征值之間的量綱影響,各特征值處于同一數(shù)量級(jí)提升
2. 模型的收斂速度
3. 提升模型的精度
在我們面對(duì)多維特征問題的時(shí)候,我們要保證這些特征都具有相近的尺度,這將幫助梯度下降算法更快地收斂。
不同學(xué)習(xí)率比較
#多變量線性回歸
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt#定義代價(jià)函數(shù)
def costfunction(x,y,theta):inner=np.power ( x @ theta-y,2)return np.sum(inner)/(2*len(x))"""
定義梯度下降函數(shù)
alpha:學(xué)習(xí)速率
inters:迭代次數(shù)
"""
def gradientDescent(x,y,theta,alpha,inters):costs=[]for i in range(inters):theta=theta-(x.T @ (x@theta-y))*alpha/len(x)cost=costfunction(x,y,theta)costs.append(cost)# if i%100==0:# print(cost)return theta,coststheta=np.zeros((3,1))#theta初始值2x1零矩陣
alpha=[0.0003,0.003,0.03,0.3,0.0001,0.001,0.1]#學(xué)習(xí)速率初始化
inters=2000#迭代次數(shù)初始化"""
歸一化函數(shù)
data.mean平均值
data.std標(biāo)準(zhǔn)差
"""
def normalize_feature(data):return (data-data.mean())/data.std()
data=pd.read_csv("E:/學(xué)習(xí)/研究生階段/python-learning/吳恩達(dá)機(jī)器學(xué)習(xí)課后作業(yè)/code/ex1-linear regression/ex1data2.txt",names=["size","bedrooms","price"])
data=normalize_feature(data)
# data.plot.scatter("size","price",label="price")
# plt.show()
data.insert(0,"ones",1)
x=data.iloc[:,0:-1]#取數(shù)據(jù)的0-倒數(shù)第二列,取所有行
y=data.iloc[:,-1:]
x=x.values#datafram轉(zhuǎn)數(shù)組格式
y=y.values#y.shape,求矩陣大小
fig,ax1=plt.subplots()
for _alpha in alpha:_theta, costs = gradientDescent(x, y, theta, _alpha, inters)ax1.plot(np.arange(inters),costs,label=_alpha)
ax1.legend()#顯示圖例標(biāo)簽
ax1.set(xlabel="inters",ylabel="costs",title="costs Vs inters")
plt.show()
正規(guī)方程
正規(guī)方程與梯度下降比較
"""
單變量線性回歸為例
"""
import numpy as npimport pandas as pd
import matplotlib.pyplot as plt
#定義正規(guī)方程
def normalequation(x,y):theta = np.linalg.inv(x.T @ x) @ x.T @ yreturn thetadata=pd.read_csv("E:/學(xué)習(xí)/研究生階段/python-learning/吳恩達(dá)機(jī)器學(xué)習(xí)課后作業(yè)/code/ex1-linear regression/ex1data1.txt",names=["population","profit"])
#print(data.describe())
#data.plot.scatter("population","profit",label="population")
#plt.show()
data.insert(0,"ones",1)
x=data.iloc[:,0:-1]#取數(shù)據(jù)的0-倒數(shù)第二列,取所有行
#print(x)
y=data.iloc[:,-1:]
x=x.values
y=y.values
theta=normalequation(x,y)
print(theta)
#線性回歸求得的參數(shù)
theta1=np.array([[-3.8928815],[1.19274237]])
print(theta1)
print(type(theta),type(theta1))
fig,ax=plt.subplots()
x_=np.linspace(y.min(),y.max(),100)
# print(x_)
y_1=theta1[0,0]+theta1[1,0]*x_
y_2=theta[0,0]+theta[1,0]*x_
ax.scatter(x[:,1],y,label="training data")
ax.plot(x_,y_1,"r",label="predect_xianxing")
ax.plot(x_,y_2,"b",label="predect_zhenggui")
ax.legend()
plt.show()
結(jié)果
線性回歸:theta1=[[-3.8928815],[1.19274237]]
正規(guī)方程:theta=[[-3.89578088], [ 1.19303364]]
基本差不多
在Python中,numpy.ndarray是NumPy庫(kù)提供的一個(gè)用于存儲(chǔ)和操作大型多維數(shù)組和矩陣的核心對(duì)象。NumPy是Python的一個(gè)庫(kù),它提供了大量的數(shù)學(xué)函數(shù)工具,特別是針對(duì)數(shù)組的操作。要定義一個(gè)numpy.ndarray類型的矩陣,你首先需要安裝并導(dǎo)入NumPy庫(kù),然后使用NumPy提供的函數(shù)或方法來(lái)創(chuàng)建數(shù)組。
以下是一些創(chuàng)建numpy.ndarray類型矩陣的基本方法:
- 使用numpy.array()
這是最直接的方法,你可以將Python的列表(list)或其他序列類型轉(zhuǎn)換為NumPy數(shù)組。
python
import numpy as np
使用列表創(chuàng)建一維數(shù)組
arr_1d = np.array([1, 2, 3, 4, 5])
使用嵌套列表創(chuàng)建二維數(shù)組(矩陣)
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr_1d)
print(arr_2d)
2. 使用numpy.zeros(), numpy.ones(), numpy.full()
這些函數(shù)分別用于創(chuàng)建指定形狀和類型,但所有元素分別為0、1或指定值的數(shù)組。
python
創(chuàng)建一個(gè)3x3的零矩陣
zero_matrix = np.zeros((3, 3))
創(chuàng)建一個(gè)3x3的1矩陣
ones_matrix = np.ones((3, 3))
創(chuàng)建一個(gè)3x3的矩陣,所有元素都是42
full_matrix = np.full((3, 3), 42)
print(zero_matrix)
print(ones_matrix)
print(full_matrix)
3. 使用numpy.arange(), numpy.linspace()
這些函數(shù)用于生成具有特定間隔的數(shù)值數(shù)組。
python
使用arange生成一個(gè)一維數(shù)組
arr_arange = np.arange(0, 10, 2) # 從0開始到10(不包括10),步長(zhǎng)為2
使用linspace在指定間隔內(nèi)生成均勻間隔的數(shù)值
arr_linspace = np.linspace(0, 10, 5) # 從0到10生成5個(gè)均勻間隔的數(shù)
print(arr_arange)
print(arr_linspace.reshape((2, -1))) # 將其重塑為2x2矩陣(注意:這里5個(gè)元素不能完美重塑為2x2,僅為示例)
4. 使用numpy.random模塊
NumPy的random模塊提供了多種生成隨機(jī)數(shù)組的函數(shù)。
python
生成一個(gè)3x3的隨機(jī)浮點(diǎn)數(shù)矩陣
random_matrix = np.random.rand(3, 3)
生成一個(gè)3x3的隨機(jī)整數(shù)矩陣,元素范圍在0到10之間
random_int_matrix = np.random.randint(0, 11, size=(3, 3))
print(random_matrix)
print(random_int_matrix)
以上就是在Python中使用NumPy庫(kù)定義numpy.ndarray類型矩陣的幾種基本方法。NumPy提供了豐富的函數(shù)和特性,使得數(shù)組和矩陣的操作變得既高效又方便。