日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线性回归实战---Abalone鲍鱼年龄预测

發布時間:2024/1/8 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性回归实战---Abalone鲍鱼年龄预测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線性回歸實現Abalone鮑魚年齡預測

文章目錄

  • 線性回歸實現Abalone鮑魚年齡預測
    • 一、環境準備
        • 數據集簡介
    • 二、線性回歸基礎知識
        • 什么是線性回歸?
        • “最小二乘法” 求解線性回歸問題
    • 三、Python代碼
    • 四、結果分析

前面我們使用手動編寫,后面通過sklearn第三方庫來與我們手寫的模型進行對比

一、環境準備

原始數據集下載及說明:https://archive.ics.uci.edu/ml/datasets/abalone

Python 3.9.13+PyCharm 2022.2.3 (Professional Edition) 或者 jupyter什么的自己選擇

sklearn==1.1.3 pip install -U scikit-learn

數據集簡介

官方的文檔介紹如下:

從中我們可以看到原始數據集共有4177條數據,其中每條數據包含9個特征,見下表

名稱數據類型測量單位描述
性別標稱M、F和I(嬰兒)
長度連續mm最長外殼測量
直徑連續mm垂直于長度
高度連續mm殼中有肉
全重連續g整只鮑魚
屠宰重量連續g肉的重量
內臟重量連續g腸道重量(出血后)
殼重連續g干燥后
Ringsinteger+1.5表示年齡(年)

同樣的,我們還是可以不用太關心這些特征是什么并不影響我們后面對鮑魚年齡的預測.

二、線性回歸基礎知識

什么是線性回歸?

在統計學中,線性回歸(Linear Regression)是利用稱為線性回歸方程的最小平方函數對一個或多個自變量和因變量之間關系進行建模的一種回歸分析。這種函數是一個或多個稱為回歸系數的模型參數的線性組合。只有一個自變量的情況稱為簡單回歸,大于一個自變量情況的叫做多元回歸。


“最小二乘法” 求解線性回歸問題


推薦參考: 用人話講明白線性回歸LinearRegression

三、Python代碼

# -*- coding: utf-8 -*- # @Author : yxn # @Date : 2022/11/12 18:49 # @IDE : PyCharm(2022.2.3) Python3.9.13 import numpy as np from scipy.stats import pearsonr from sklearn import linear_modelclass LinearRegression:"""手動實現線性回歸模型的LinearRegression類"""def __init__(self):self.w = None # 增廣權重向量self.n_features = None # 用于存儲樣本屬性的數量def fit(self, X, y):"""在進行異常判斷之后,將樣本轉化為增廣特征向量,然后使用公式w=(X^TX)^{-1}X^Ty,利用numpy的dot與linalg.inv函數,實現最小二乘法。(需要判斷樣本數量是否大于屬性數量):param X: 訓練屬性集X訓:param y: 練標簽集y:return: 最優參數w"""assert isinstance(X, np.ndarray) and isinstance(y, np.ndarray) # assert(斷言)用于判斷輸入值是否異常assert X.ndim == 2 and y.ndim == 1assert y.shape[0] == X.shape[0]n_samples = X.shape[0]self.n_features = X.shape[1]extra = np.ones((n_samples,))X = np.c_[X, extra]if self.n_features < n_samples:self.w = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y) # 使用最小二乘法求權重w,np.linalg.inv:求逆矩陣else:raise ValueError('dont have enough samples')def predict(self, X):"""用于執行測試,輸入測試樣本集,轉化成增廣特征向量,返回預測標簽。:param X: 測試屬性集X:return: 預測標簽y_"""n_samples = X.shape[0]extra = np.ones((n_samples,))X = np.c_[X, extra]if self.w is None:raise RuntimeError('cant predict before fit')y_ = X.dot(self.w)return y_def loadDataSet(fileName):"""數據集每一行為一個樣本,其中最后一個值為標簽,其余值為屬性。根據文件名,依次讀取每一行,將屬性與標簽轉化為float類型,存儲在列表中,再存入屬性集xArr,標簽集yArr:param fileName: 數據集文件名fileName:return: 屬性集xArr,標簽集yArr(轉化成numpy的array類型)"""numFeat = len(open(fileName).readline().split('\t')) - 1xArr = []yArr = []fr = open(fileName)for line in fr.readlines():lineArr = []curLine = line.strip().split('\t')for i in range(numFeat):lineArr.append(float(curLine[i]))xArr.append(lineArr)yArr.append(float(curLine[-1]))return np.array(xArr), np.array(yArr)def main():"""(頂層代碼)線性回歸模型完成鮑魚年齡的預測:return:"""# 使用loadDataSet函數讀取文件abalone.txt,將返回的屬性集、標簽集賦值給X, yX, y = loadDataSet(r"E:\wynuJunior\模式識別\5回歸實踐\abalone.csv")# #===================手寫LinearRegression==============================# #lr = LinearRegression() # 實例化LinearRegression()模型lr.fit(X, y) # 使用fit方法進行訓練y_pre = lr.predict(X) # 使用predict方法,對訓練時的屬性集再進行預測print("手寫線性回歸預測標簽:", y_pre)# #===================sklearn模塊中LinearRegression=======================# #sklearn_lr = linear_model.LinearRegression() # 調用sklearn模塊中的線性回歸模型sklearn_lr.fit(X, y) # 使用fit方法進行訓練sklearn_y_pre = sklearn_lr.predict(X) # 使用predict方法,對訓練時的屬性集再進行預測print("sklearn模塊線性回歸預測標簽:\n", sklearn_y_pre)# 使用pearsonr相關系數,比較兩種預測結果的差距。(頂層代碼)# pearsonr函數可以從scipy.stats模塊導入,輸入兩個序列,比較其相似性,# 現將手寫模型的結果y_pre與sk-learn模型的結果sklearn_y_pre# 返回兩個數值,分別代表相似性與置信度,其中第一個數值(相似性)應當為1,否則代表手寫代碼出現錯誤。print('手動編寫的線性回歸與sklearn中的線性回歸預測結果相似性為: ', pearsonr(y_pre, sklearn_y_pre)[0])if __name__ == '__main__':main() # 程序執行入口 補充內容: 嶺回歸 # -*- coding: utf-8 -*- # @Author : yxn # @Date : 2022/11/23 22:36 # @IDE : PyCharm(2022.2.3) Python3.9.13 import numpy as np from sklearn import linear_modeldef loadDataSet(fileName):"""數據集每一行為一個樣本,其中最后一個值為標簽,其余值為屬性。根據文件名,依次讀取每一行,將屬性與標簽轉化為float類型,存儲在列表中,再存入屬性集xArr,標簽集yArr:param fileName: 數據集文件名fileName:return: 屬性集xArr,標簽集yArr(轉化成numpy的array類型)"""numFeat = len(open(fileName).readline().split('\t')) - 1xArr = []yArr = []fr = open(fileName)for line in fr.readlines():lineArr = []curLine = line.strip().split('\t')for i in range(numFeat):lineArr.append(float(curLine[i]))xArr.append(lineArr)yArr.append(float(curLine[-1]))return np.array(xArr), np.array(yArr)def Ridge_regression():"""嶺回歸模型完成鮑魚年齡的預測# 官方文檔 https://scikit-learn.org/dev/modules/generated/sklearn.linear_model.Ridge.html"""# 使用loadDataSet函數讀取文件abalone.txt,將返回的屬性集、標簽集賦值給X, yX, y = loadDataSet(r"E:\wynuJunior\模式識別\5回歸實踐\abalone.csv")# #===================sklearn模塊中嶺回歸=======================# ## l2正則化線性最小二乘。alpha是L2正則化常數,它乘以L2項,控制正則化的力量。# 當' alpha = 0 '時,目標等價于普通最小值平方.ridge_reg = linear_model.Ridge(alpha=0., solver='lsqr') # 嶺回歸ridge_reg.fit(X, y) # 使用fit方法進行訓練ridge_y_pre = ridge_reg.predict(X) # 使用predict方法,對訓練時的屬性集再進行預測print("sklearn模塊嶺回歸預測標簽:\n", ridge_y_pre)if __name__ == '__main__':Ridge_regression() # 程序執行入口

四、結果分析

運行結果如下:

可以看到我們是輸出標簽都是一樣的,而且預測結果相似性也達到了99.9%,可見手寫的線性回歸是正確的.

總結

以上是生活随笔為你收集整理的线性回归实战---Abalone鲍鱼年龄预测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。