基于單個參數線性回歸的機器學習代碼

本文為學習吳恩達版本機器學習教程的代碼整理,使用的數據集為https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes/blob/f2757f85b99a2b800f4c2e3e9ea967d9e17dfbd8/code/ex1-linear%20regression/ex1data1.txt

將數據集和py代碼放到同一目錄中,使用Spyder打開運行,代碼中整體演示了數據加載處理過程、線性回歸損失函數計算方法、批量梯度下降方法、獲得結果后的預估方法、線性回歸結果函數繪制、模型導出及加載使用方法,其中最后三部分彼此無依賴關系可單獨執行。詳細代碼為下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import joblib# 導入數據
path =  'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])"""
計算線性回歸模型的損失值
"""
def computeCost(X, y, theta):"""此函數計算給定參數 theta 下的均方誤差損失。它用于評估線性回歸模型預測值與實際值之間的差異。損失值越小,表明模型的預測越準確。Parameters:X : numpy.ndarray 表示特征數據集的矩陣,其中包含了模型用于預測的特征。y : numpy.ndarray 表示目標變量的向量,包含了每個數據點的實際值。theta : numpy.ndarray 線性回歸模型的參數向量,包括截距項和特征的系數。Returns:float 返回計算得到的均方誤差損失值。"""# 計算模型預測值和實際值之間的差異inner = np.power(((X * theta.T) - y), 2)# 計算并返回均方誤差損失的平均值return np.sum(inner) / (2 * len(X))# 在數據集前面加入一列全為1的數據,用于適配截距項
data.insert(0, 'Ones', 1)# 分離特征(X)和目標變量(y)
cols = data.shape[1]
X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列
y = data.iloc[:,cols-1:cols]#X是所有行,最后一列# 將X和y的類型轉換為numpy矩陣,方便后續計算
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix(np.array([0,0]))# 初始化theta# 計算初始的損失值,僅為輸出和最終損失對比
initial_cost = computeCost(X, y, theta)
print("初始的損失值:", initial_cost)"""
執行批量梯度下降
"""
def gradientDescent(X, y, theta, alpha, iters):"""這個函數通過迭代地調整參數 theta,以最小化損失函數。Parameters:X : numpy.ndarray 特征數據集矩陣。y : numpy.ndarray 目標變量向量。theta : numpy.ndarray 線性回歸模型的初始參數向量。alpha : float 學習率,控制梯度下降的步長。iters : int 梯度下降的迭代次數。Returns:tuple 返回一個元組,包含優化后的 theta 和每次迭代的損失值數組。"""# 初始化一個臨時變量,用于更新 thetatemp = np.matrix(np.zeros(theta.shape))# 獲取 theta 中參數的數量parameters = int(theta.ravel().shape[1])# 初始化一個數組,用于記錄每次迭代的損失值cost = np.zeros(iters)# 迭代進行梯度下降for i in range(iters):# 計算當前參數下的誤差error = (X * theta.T) - y# 對每個參數進行更新for j in range(parameters):# 計算誤差與特征值的乘積term = np.multiply(error, X[:,j])# 更新 theta 的第 j 個參數temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))# 更新 thetatheta = temp# 記錄當前的損失值cost[i] = computeCost(X, y, theta)# 返回優化后的參數和損失值記錄return theta, cost# 設置學習率和迭代次數
alpha = 0.01
iters = 2000# 執行梯度下降算法,優化theta
g, cost = gradientDescent(X, y, theta, alpha, iters)# 計算優化后的損失值,僅為輸出和初始損失對比
final_cost = computeCost(X, y, g)
print("優化后的損失值", final_cost)"""
使用需要預測的數據X進行預測
"""
# 假設的人口數據
population_values = [3.5, 7.0]  # 代表35,000和70,000人口# 對每個人口值進行預測
for pop in population_values:# 將人口值轉換為與訓練數據相同的格式(包括截距項)predict_data = np.matrix([1, pop])  # 添加截距項# 使用模型進行預測predict_profit = np.dot(predict_data, g.T)print(f"模型預測結果 {pop} : {predict_profit[0,0]}")"""
使用模型繪制函數
"""
# 創建預測函數
x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = g[0, 0] + (g[0, 1] * x)# 繪制線性回歸結果
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')# 繪制預測線
ax.scatter(data.Population, data.Profit, label='Traning Data')# 繪制訓練數據點
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()"""
使用模型繪制損失值變化曲線
"""
# 繪制損失函數的變化
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost, 'r') # 損失值隨迭代次數的變化
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()"""
保存模型
"""
# 保存模型
joblib.dump(g, 'linear_regression_model.pkl')"""
加載模型并執行預測
"""
# 加載模型
loaded_model = joblib.load('linear_regression_model.pkl')# 假設的人口數據
population_values = [3.5, 7.0]  # 代表35,000和70,000人口# 使用模型進行預測
for pop in population_values:# 更新預測數據矩陣,包括當前的人口值predict_data = np.matrix([1, pop])# 進行預測predict_value = np.dot(predict_data, loaded_model.T)print(f"加載模型預測結果 {pop} : {predict_value[0,0]}")

運行后結果:
在這里插入圖片描述
在這里插入圖片描述
輸出結果:

初始的損失值: 32.072733877455676
優化后的損失值 4.47802760987997
模型預測結果 3.5 : 0.349676138927709
模型預測結果 7.0 : 4.487420850578528
加載模型預測結果 3.5 : 0.349676138927709
加載模型預測結果 7.0 : 4.487420850578528

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

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

相關文章

2023最新八股文前端面試題

第一章 Css 1.說一下CSS的盒模型。 在HTML頁面中的所有元素都可以看成是一個盒子盒子的組成:內容content、內邊距padding、邊框border、外邊距margin盒模型的類型: 標準盒模型 margin border padding content IE盒模型 margin content(border padding) 控制盒模型的模式…

淘寶api接口測試方式(item_get-獲得淘寶商品詳情)

注冊淘寶開放平臺賬號:首先,你需要在淘寶開放平臺上注冊一個賬號,并創建一個應用。獲取App Key和Secret Key:在創建應用后,你會獲得App Key和Secret Key,這些憑證將用于調用API。了解淘寶商品詳情接口&…

【開源】基于Vue+SpringBoot的免稅店商城管理系統

文末獲取源碼,項目編號: S 069 。 \color{red}{文末獲取源碼,項目編號:S069。} 文末獲取源碼,項目編號:S069。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、系統設計2.1 功能模塊設計2.2 研究方法 三、系統…

什么是圖片懶加載(image lazy loading)?它的作用是什么?

聚沙成塔每天進步一點點 ? 專欄簡介 前端入門之旅:探索Web開發的奇妙世界 歡迎來到前端入門之旅!感興趣的可以訂閱本專欄哦!這個專欄是為那些對Web開發感興趣、剛剛踏入前端領域的朋友們量身打造的。無論你是完全的新手還是有一些基礎的開發…

如何使用vue開發vscode插件

以下是一個簡單的示例,演示如何使用Vue和VSCode的Webview API來開發一個簡單的VSCode插件: 創建一個VSCode插件項目 首先,你需要創建一個VSCode插件項目。你可以使用VSCode的插件生成器來快速創建一個基本的項目結構。從VSCode的命令面板中運…

【Flutter】graphic圖表實現tooltip一段時間后自動隱藏

概述 graphic圖表中提供了自定義tooltip的事件,可通過selections中on和clear配置手勢選項和可識別設備,默認情況下tooltip需要雙擊隱藏,但這并不符合我們的需求。通過調研發現,若想實現tooltip隔幾秒后隱藏,可通過Str…

3DMax物理畫筆物體填充放置繪制畫筆插件安裝使用方法

3DMax物理畫筆物體填充放置繪制畫筆插件,允許您使用筆刷以非常自然的方式用物品快速填充場景,并使用剛體模擬自動放置它們。 無論你是從事建筑、游戲電影還是商業。。。等等,你經常需要用一些物品為你的場景添加細節。手工放置它們是乏味的&…

Threejs發光閃爍提示特效

一、導語 發光閃爍特效應該在我們的項目中是經常需要去封裝的一個特效吧,一般用于點擊選擇,選中物體,或者一些特效加持于中心物體,物體碰撞檢測后的發光特效等等 二、分析 我們可以合理的使用后處理特效,上步驟&am…

hive查看數據庫出現org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

FAILED: HiveException java,lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient 在啟動hive后,使用show databses查看數據庫時發現,出現了這個錯誤 情況一: 根據搜索查找以及…

Docker一 | Docker的基本使用

目錄 Docker的基本使用 常用命令 啟動Docker 查看Docker的運行狀態 重啟Docker 停止Docker服務 查看命令相關信息 鏡像命令 列出本地主機上的鏡像 搜索某個鏡像的名稱 拉取指定的鏡像到本地 查看鏡像/容器/數據卷所占的空間 刪除某個鏡像 容器命令 啟動容器 列出…

數字電路基礎知識系列(六)之LC濾波器的基礎知識

LC濾波器,是指將電感(L)與電容器 ©進行組合設計構成的濾波電路,可去除或通過特定頻率的無源器件。電容器具有隔直流通交流,且交流頻率越高越容易通過的特性。而電感則具有隔交流通直流,且交流頻率越高越不易通過的特性。因此…

linux如何使用Xshell遠程連接

簡介:本文的一切條件基于redhat的linux操作系統。 目錄 1、創建虛擬機: 2、使用命令查看網段信息 拓展1:(若網卡上沒有網段信息,可以使用任意兩種方法): 準備工作: 1、點擊左…

git入門教程+常用命令

Git入門教程 本文章主要參照視頻教程:https://www.bilibili.com/video/BV1FE411P7B3/?spm_id_from333.337.search-card.all.click&vd_source06caf161b187fb3f4c039bc15e238fea 為什么要使用GIT 版本控制是項目、文檔迭代的必然要求,所以需要使用…

Springboot自定義start首發預告

Springboot自定義start首發預告 基于Springboot的自定義start , 減少項目建設重復工作, 如 依賴 , 出入參包裝 , 日志打印 , mybatis基本配置等等等. 優點 模塊化 可插拔 易于維護和升級 定制化 社區支持(后期支持) 發布時間 預告: 2023-12-10 預計發布: 2024-1-1 , 元旦首…

Android 設置音量默認值

在車機 Audio 開發中,有很多場景需要設置音量的最大值和最小值問題,例如通話模式通常是禁止靜音的,耳機模式調整到較大音量時開機后會恢復一個最大默認值等問題。而且通常情況下不通車型的默認值可能會不同,這篇文章就來看一下如何…

Java多線程是什么?

Java多線程是什么? Java多線程是指在程序中同時運行多個線程,每個線程都是獨立運行的,即有自己的執行路徑、棧、寄存器等資源,并且可以同步地訪問共享數據。 Java多線程的主要優勢在于能夠充分利用多核處理器,同時提…

移動端原生實現列表列固定橫向滾動功能

功能介紹: 在移動端開發中,會用到列表作為信息展示方式,一般希望上下滾動時,可以固定表頭,左右滾動時,可以固定最左列。 需求: 1、列表可以使用數組循環遍歷; 2、上下滾動時&…

離線環境下使用百度地圖(vue版)(展示自己的地圖瓦片)3.0版本api

1.下載自己想要的地圖網片 (1)瓦片圖下載 提取百度網盤中文件,然后運行exe文件,選擇要下載的層級及地區即可 百度網盤鏈接:https://pan.baidu.com/s/16sOJ9ws7HCgNH3EMf7Ejyg?pwd0q0e 提取碼:0q0e (2)將瓦片圖映射到網上 推薦使…

CSS中常用的10個文本樣式屬性

一個頁面中,文本樣式,是必不可少的,當然css也給我們準備了很多很多很多的文本樣式,以下列舉了10個常用的文本樣式屬性及常用的屬性值,掌握了,也基本滿足使用了 1: text-transform 可以用來設置文本的大小寫…

Python-docx 深入word源碼 自定義字符間距

代碼和實現效果 from docx import Document from docx.oxml import OxmlElement from docx.oxml.ns import qn from docx.shared import Pt# 調整pt設置字間距 def SetParagraphCharSpaceByPt(run, pt1):通過修改word源碼方式, 添加w:spacing標簽直接通過調整pt來設置字符間距…