电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

如何用Python徒手寫線性回歸

瀏覽:2日期:2022-06-29 11:11:28

對于大多數數據科學家而言,線性回歸方法是他們進行統計學建模和預測分析任務的起點。這種方法已經存在了 200 多年,并得到了廣泛研究,但仍然是一個積極的研究領域。由于良好的可解釋性,線性回歸在商業數據上的用途十分廣泛。當然,在生物數據、工業數據等領域也不乏關于回歸分析的應用。

另一方面,Python 已成為數據科學家首選的編程語言,能夠應用多種方法利用線性模型擬合大型數據集顯得尤為重要。

如果你剛剛邁入機器學習的大門,那么使用 Python 從零開始對整個線性回歸算法進行編碼是一次很有意義的嘗試,讓我們來看看怎么做吧。

數據

機器學習問題的第一步是獲取數據,沒有可以學習的數據就沒有機器學習。本文將使用非常常規的線性回歸數據集——房價預測數據集。

這是一個包含俄勒岡州波特蘭市房價的簡單數據集。該數據集中第一列是房屋面積(以平方英尺為單位),第二列是臥室的數量,第三列是房屋價格。該數據集中有多個特征(例如,house_size 和房間數),因此我們將研究多元線性回歸,標簽 (y) 是我們將要預測的房價。

首先定義用于加載數據集的函數:

def load_data(filename): df = pd.read_csv(filename, sep=',', index_col=False) df.columns = ['housesize', 'rooms', 'price'] data = np.array(df, dtype=float) plot_data(data[:,:2], data[:, -1]) normalize(data) return data[:,:2], data[:, -1]

我們稍后將調用上述函數來加載數據集。此函數返回 x 和 y。

歸一化數據

上述代碼不僅加載數據,還對數據執行歸一化處理并繪制數據點。在查看數據圖之前,我們首先了解上述代碼中的 normalize(data)。

查看原始數據集后,你會發現第二列數據的值(房間數量)比第一列(即房屋面積)小得多。該模型不會將此數據評估為房間數量或房屋面積,對于模型來說,它們只是一些數字。機器學習模型中某些列(或特征)的數值比其他列高可能會造成不想要的偏差,還可能導致方差和數學均值的不平衡。出于這些原因,也為了簡化工作,我們建議先對特征進行縮放或歸一化,使其位于同一范圍內(例如 [-1,1] 或 [0,1]),這會讓訓練容易許多。因此我們將使用特征歸一化,其數學表達如下:

Z = (x — μ) / σ μ : mean σ : standard deviation

其中 z 是歸一化特征,x 是非歸一化特征。有了歸一化公式,我們就可以為歸一化創建一個函數:

def normalize(data): for i in range(0,data.shape[1]-1):data[:,i] = ((data[:,i] - np.mean(data[:,i]))/np.std(data[:, i]))

上述代碼遍歷每一列,并使用每一列中所有數據元素的均值和標準差對其執行歸一化。

繪制數據

在對線性回歸模型進行編碼之前,我們需要先問「為什么」。

為什么要使用線性回歸解決這個問題?這是一個非常有用的問題,在寫任何具體代碼之前,你都應該非常清楚要使用哪種算法,以及在給定數據集和待解決問題的情況下,這是否真的是最佳選擇。

我們可以通過繪制圖像來證明對當前數據集使用線性回歸有效的原因。為此,我們在上面的 load_data 中調用了 plot_data 函數,現在我們來定義一下 plot_data 函數:

def plot_data(x, y): plt.xlabel(’house size’) plt.ylabel(’price’) plt.plot(x[:,0], y, ’bo’) plt.show()

調用該函數,將生成下圖:

如何用Python徒手寫線性回歸

房屋面積與房屋價格關系圖。

如上圖所示,我們可以粗略地擬合一條線。這意味著使用線性近似能夠做出較為準確的預測,因此可以采用線性回歸。

準備好數據之后就要進行下一步,給算法編寫代碼。

假設

首先我們需要定義假設函數,稍后我們將使用它來計算代價。對于線性回歸,假設是:

如何用Python徒手寫線性回歸

但數據集中只有 2 個特征,因此對于當前問題,假設是:

如何用Python徒手寫線性回歸

其中 x1 和 x2 是兩個特征(即房屋面積和房間數量)。然后編寫一個返回該假設的簡單 Python 函數:

def h(x,theta): return np.matmul(x, theta)

接下來我們來看代價函數。

代價函數

使用代價函數的目的是評估模型質量。

代價函數的等式為:

如何用Python徒手寫線性回歸

代價函數的代碼如下:

def cost_function(x, y, theta): return ((h(x, theta)-y).T@(h(x, theta)-y))/(2*y.shape[0])

到目前為止,我們定義的所有 Python 函數都與上述線性回歸的數學意義完全相同。接下來我們需要將代價最小化,這就要用到梯度下降。

梯度下降

梯度下降是一種優化算法,旨在調整參數以最小化代價函數。

梯度下降的主要更新步是:

如何用Python徒手寫線性回歸

因此,我們將代價函數的導數乘以學習率(α),然后用參數(θ)的當前值減去它,獲得新的更新參數(θ)。

def gradient_descent(x, y, theta, learning_rate=0.1, num_epochs=10): m = x.shape[0] J_all = [] for _ in range(num_epochs): h_x = h(x, theta) cost_ = (1/m)*(x.T@(h_x - y)) theta = theta - (learning_rate)*cost_ J_all.append(cost_function(x, y, theta)) return theta, J_all

gradient_descent 函數返回 theta 和 J_all。theta 顯然是參數向量,其中包含假設的θs 值,J_all 是一個列表,包含每個 epoch 后的代價函數。J_all 變量并非必不可少,但它有助于更好地分析模型。

整合到一起

接下來要做的就是以正確的順序調用函數

x,y = load_data('house_price_data.txt')y = np.reshape(y, (46,1))x = np.hstack((np.ones((x.shape[0],1)), x))theta = np.zeros((x.shape[1], 1))learning_rate = 0.1num_epochs = 50theta, J_all = gradient_descent(x, y, theta, learning_rate, num_epochs)J = cost_function(x, y, theta)print('Cost: ', J)print('Parameters: ', theta)#for testing and plotting cost n_epochs = []jplot = []count = 0for i in J_all: jplot.append(i[0][0]) n_epochs.append(count) count += 1jplot = np.array(jplot)n_epochs = np.array(n_epochs)plot_cost(jplot, n_epochs)test(theta, [1600, 2])

首先調用 load_data 函數載入 x 和 y 值。x 值包含訓練樣本,y 值包含標簽(在這里就是房屋的價格)。

你肯定注意到了,在整個代碼中,我們一直使用矩陣乘法的方式來表達所需。例如為了得到假設,我們必須將每個參數(θ)與每個特征向量(x)相乘。我們可以使用 for 循環,遍歷每個樣本,每次都執行一次乘法,但如果訓練的樣本過多,這可能不是最高效的方法。

在這里更有效的方式是使用矩陣乘法。本文所用的數據集具備兩個特征:房屋面積和房間數,即我們有(2+1)三個參數。將假設看作圖形意義上的一條線,用這種方式來思考額外參數θ0,最終額外的θ0 也要使這條線符合要求。

如何用Python徒手寫線性回歸

有利的假設函數圖示。

現在我們有了三個參數和兩個特征。這意味著θ或參數向量(1 維矩陣)的維數是 (3,1),但特征向量的維度是 (46,2)。你肯定會注意到將這樣兩個矩陣相乘在數學上是不可能的。再看一遍我們的假設:

如何用Python徒手寫線性回歸

如果你仔細觀察的話,實際上這很直觀:如果在特征向量 (x) {維度為 (46, 3)} 的開頭添加額外的一列,并且對 x 和 theta 執行矩陣乘法,將得出 hθ(x) 的方程。

記住,在實際運行代碼來實現此功能時,不會像 hθ(x) 那樣返回表達式,而是返回該表達式求得的數學值。在上面的代碼中,x = np.hstack((np.ones((x.shape[0],1)), x)) 這一行在 x 開頭加入了額外一列,以備矩陣乘法需要。

在這之后,我們用零初始化 theta 向量,當然你也可以用一些小隨機值來進行初始化。我們還指定了訓練學習率和 epoch 數。

定義完所有超參數之后,我們就可以調用梯度下降函數,以返回所有代價函數的歷史記錄以及參數 theta 的最終向量。在這里 theta 向量定義了最終的假設。你可能注意到,由梯度下降函數返回的 theta 向量的維度為 (3,1)。

還記得函數的假設嗎?

如何用Python徒手寫線性回歸

所以我們需要三個θ,theta 向量的維度為 (3,1),因此 theta [0]、theta [1] 和 theta [2] 實際上分別為θ0、θ1 和 θ2。J_all 變量是所有代價函數的歷史記錄。你可以打印出 J_all 數組,來查看代價函數在梯度下降的每個 epoch 中逐漸減小的過程。

如何用Python徒手寫線性回歸

代價和 epoch 數量的關系圖。

我們可以通過定義和調用 plot_cost 函數來繪制此圖,如下所示:

def plot_cost(J_all, num_epochs): plt.xlabel(’Epochs’) plt.ylabel(’Cost’) plt.plot(num_epochs, J_all, ’m’, linewidth = '5') plt.show()

現在我們可以使用這些參數來找到標簽,例如給定房屋面積和房間數量時的房屋價格。

測試

現在你可以測試調用測試函數的代碼,該函數會將房屋面積、房間數量和 logistic 回歸模型返回的最終 theta 向量作為輸入,并輸出房屋價格。

def test(theta, x): x[0] = (x[0] - mu[0])/std[0] x[1] = (x[1] - mu[1])/std[1] y = theta[0] + theta[1]*x[0] + theta[2]*x[1] print('Price of house: ', y)完整代碼

import numpy as npimport matplotlib.pyplot as pltimport pandas as pd#variables to store mean and standard deviation for each featuremu = []std = []def load_data(filename): df = pd.read_csv(filename, sep=',', index_col=False) df.columns = ['housesize', 'rooms', 'price'] data = np.array(df, dtype=float) plot_data(data[:,:2], data[:, -1]) normalize(data) return data[:,:2], data[:, -1]def plot_data(x, y): plt.xlabel(’house size’) plt.ylabel(’price’) plt.plot(x[:,0], y, ’bo’) plt.show()def normalize(data): for i in range(0,data.shape[1]-1): data[:,i] = ((data[:,i] - np.mean(data[:,i]))/np.std(data[:, i])) mu.append(np.mean(data[:,i])) std.append(np.std(data[:, i]))def h(x,theta): return np.matmul(x, theta)def cost_function(x, y, theta): return ((h(x, theta)-y).T@(h(x, theta)-y))/(2*y.shape[0])def gradient_descent(x, y, theta, learning_rate=0.1, num_epochs=10): m = x.shape[0] J_all = [] for _ in range(num_epochs): h_x = h(x, theta) cost_ = (1/m)*(x.T@(h_x - y)) theta = theta - (learning_rate)*cost_ J_all.append(cost_function(x, y, theta)) return theta, J_all def plot_cost(J_all, num_epochs): plt.xlabel(’Epochs’) plt.ylabel(’Cost’) plt.plot(num_epochs, J_all, ’m’, linewidth = '5') plt.show()def test(theta, x): x[0] = (x[0] - mu[0])/std[0] x[1] = (x[1] - mu[1])/std[1] y = theta[0] + theta[1]*x[0] + theta[2]*x[1] print('Price of house: ', y)x,y = load_data('house_price_data.txt')y = np.reshape(y, (46,1))x = np.hstack((np.ones((x.shape[0],1)), x))theta = np.zeros((x.shape[1], 1))learning_rate = 0.1num_epochs = 50theta, J_all = gradient_descent(x, y, theta, learning_rate, num_epochs)J = cost_function(x, y, theta)print('Cost: ', J)print('Parameters: ', theta)#for testing and plotting cost n_epochs = []jplot = []count = 0for i in J_all: jplot.append(i[0][0]) n_epochs.append(count) count += 1jplot = np.array(jplot)n_epochs = np.array(n_epochs)plot_cost(jplot, n_epochs)test(theta, [1600, 3])總結

這就是線性回歸的全部代碼了。

現在你已經學會了從零開始成功編寫線性回歸模型。能夠理解和編寫整個算法并不是一件容易的事,你或許需要時不時地回看才能完全理解。但這些努力是值得的,線性回歸通常是人們學習機器學習算法的第一步,在這之后你可以選擇另一個適用于線性回歸處理的數據集,并嘗試剛寫好的算法。

原文鏈接:

https://towardsdatascience.com/coding-linear-regression-from-scratch-c42ec079902

以上就是如何用Python徒手寫線性回歸的詳細內容,更多關于python 手寫線性回歸的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 深圳活动策划公司|庆典策划|专业公关活动策划|深圳艺典文化传媒 重庆中专|职高|技校招生-重庆中专招生网 | 上海律师事务所_上海刑事律师免费咨询平台-煊宏律师事务所 | 立式壁挂广告机厂家-红外电容触摸一体机价格-华邦瀛 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 开锐教育-学历提升-职称评定-职业资格培训-积分入户 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 新疆乌鲁木齐网站建设-乌鲁木齐网站制作设计-新疆远璨网络 | 山东集装箱活动房|济南集装箱活动房-济南利森集装箱有限公司 | 原色会计-合肥注册公司_合肥代理记账公司_营业执照代办 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 起好名字_取个好名字_好名网免费取好名在线打分 | TTCMS自助建站_网站建设_自助建站_免费网站_免费建站_天天向上旗下品牌 | 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 北京翻译公司_同传翻译_字幕翻译_合同翻译_英语陪同翻译_影视翻译_翻译盖章-译铭信息 | 万濠投影仪_瑞士TRIMOS高度仪_尼康投影仪V12BDC|量子仪器 | 万家财经_财经新闻_在线财经资讯网 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 预制舱-电力集装箱预制舱-模块化预制舱生产厂家-腾达电器设备 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | 闭端端子|弹簧螺式接线头|防水接线头|插线式接线头|端子台|电源线扣+护线套|印刷电路板型端子台|金笔电子代理商-上海拓胜电气有限公司 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | 磁力轮,磁力联轴器,磁齿轮,钕铁硼磁铁-北京磁运达厂家 | 金属抛光机-磁悬浮抛光机-磁力研磨机-磁力清洗机 - 苏州冠古科技 | 面粉仓_储酒罐_不锈钢储酒罐厂家-泰安鑫佳机械制造有限公司 | 火锅加盟_四川成都火锅店加盟_中国火锅连锁品牌十强_朝天门火锅【官网】 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 | 迪威娱乐|迪威娱乐客服|18183620002 | 裹包机|裹膜机|缠膜机|绕膜机-上海晏陵智能设备有限公司 | 驾驶人在线_专业学车门户网站 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 冷却塔改造厂家_不锈钢冷却塔_玻璃钢冷却塔改造维修-广东特菱节能空调设备有限公司 | 塑胶地板-商用PVC地板-pvc地板革-安耐宝pvc塑胶地板厂家 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 汽液过滤网厂家_安平县银锐丝网有限公司 | 小学教案模板_中学教师优秀教案_高中教学设计模板_教育巴巴 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 托盘租赁_塑料托盘租赁_托盘出租_栈板出租_青岛托盘租赁-优胜必达 |