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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ 线性回归_模型之母:简单线性回归的代码实现

發布時間:2024/7/23 c/c++ 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 线性回归_模型之母:简单线性回归的代码实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

模型之母:簡單線性回歸的代碼實現

關于作者:餅干同學,某人工智能公司交付開發工程師/建模科學家。專注于AI工程化及場景落地,希望和大家分享成長中的專業知識與思考感悟。

0x00?前言

在《模型之母:簡單線性回歸&最小二乘法》中,我們從數學的角度理解了簡單線性回歸,并且推導了最小二乘法。

本文內容完全承接于上一篇,我們來以代碼的方式,實現簡單線性回歸。話不多說,碼起來

0x01 簡單線性回歸算法的實現

首先我們自己構造一組數據,然后畫圖

import numpy as npimport matplotlib.pyplot as pltx = np.array([1.,2.,3.,4.,5.])y = np.array([1.,3.,2.,3.,5,])plt.scatter(x,y)plt.axis([0,6,0,6])plt.show()

下面我們就可以根據樣本真實值,來進行預測。

實際上,我們是假設線性關系為:?這根直線,然后再根據最小二乘法算a、b的值。我們還可以假設為二次函數:。可以通過最小二乘法算出a、b、c

實際上,同一組數據,選擇不同的f(x),即模型,通過最小二乘法可以得到不一樣的擬合曲線。

不同的數據,更可以選擇不同的函數,通過最小二乘法可以得到不一樣的擬合曲線。

下面讓我們回到簡單線性回歸。我們直接假設是一條直線,模型是:

根據最小二乘法推導求出a、b的表達式:

下面我們用代碼計算a、b:

# 首先要計算x和y的均值x_mean = np.mean(x)y_mean = np.mean(y)# a的分子num、分母dnum = 0.0d = 0.0for x_i,y_i in zip(x,y): # zip函數打包成[(x_i,y_i)...]的形式 num = num + (x_i - x_mean) * (y_i - y_mean) d = d + (x_i - x_mean) ** 2a = num / db = y_mean - a * x_mean

在求出a、b之后,可以計算出y的預測值,首先繪制模型直線:

y_hat = a * x + bplt.scatter(x,y) # 繪制散點圖plt.plot(x,y_hat,color='r') # 繪制直線plt.axis([0,6,0,6])plt.show()

然后進行預測:

x_predict = 6y_predict = a * x_predict + bprint(y_predict)

5.2

0x02 向量化運算

我們注意到,在計算參數a時:

# a的分子num、分母dnum = 0.0d = 0.0for x_i,y_i in zip(x,y): # zip函數打包成[(x_i,y_i)...]的形式 num = num + (x_i - x_mean) * (y_i - y_mean) d = d + (x_i - x_mean) ** 2a = num / d

我們發現有這樣一個步驟:向量w和向量v,每個向量的對應項,相乘再相加。其實這就是兩個向量“點乘”

這樣我們就可以使用numpy中的dot運算,非常快速地進行向量化運算。

總的來說:

向量化是非常常用的加速計算的方式,特別適合深度學習等需要訓練大數據的領域。

對于 y = wx + b, ?若 w, x都是向量,那么,可以用兩種方式來計算,第一是for循環:

y = 0for i in range(n): y += w[i]*x[i] y += b

另一種方法就是用向量化的方式實現:

y = np.dot(w,x) + b

二者計算速度相差幾百倍,測試結果如下:

import numpy as npimport timea = np.random.rand(1000000)b = np.random.rand(1000000)tic = time.time()c = np.dot(a, b)toc = time.time()print("c: %f" % c)print("vectorized version:" + str(1000*(toc-tic)) + "ms")c = 0tic = time.time()for i in range(1000000): c += a[i] * b[i]toc = time.time()print("c: %f" % c)print("for loop:" + str(1000*(toc-tic)) + "ms")

運行結果:

c: 249981.256724vectorized version:0.998973846436msc: 249981.256724for loop:276.798963547ms

對于獨立的樣本,用for循環串行計算的效率遠遠低于向量化后,用矩陣方式并行計算的效率。因此:

只要有其他可能,就不要使用顯示for循環。

0x03 自實現的工程文件

3.1 代碼

還記得我們之前的工程文件嗎?創建一個SimpleLinearRegression.py,實現自己的工程文件并調用

import numpy as npclass SimpleLinearRegression: def __init__(self): """模型初始化函數""" self.a_ = None self.b_ = None def fit(self, x_train, y_train): """根據訓練數據集x_train,y_train訓練模型""" assert x_train.ndim ==1, \ "簡單線性回歸模型僅能夠處理一維特征向量" assert len(x_train) == len(y_train), \ "特征向量的長度和標簽的長度相同" x_mean = np.mean(x_train) y_mean = np.mean(y_train) num = (x_train - x_mean).dot(y_train - y_mean) # 分子 d = (x_train - x_mean).dot(x_train - x_mean) # 分母 self.a_ = num / d self.b_ = y_mean - self.a_ * x_mean return self def predict(self, x_predict): """給定待預測數據集x_predict,返回表示x_predict的結果向量""" assert x_predict.ndim == 1, \ "簡單線性回歸模型僅能夠處理一維特征向量" assert self.a_ is not None and self.b_ is not None, \ "先訓練之后才能預測" return np.array([self._predict(x) for x in x_predict]) def _predict(self, x_single): """給定單個待預測數據x_single,返回x_single的預測結果值""" return self.a_ * x_single + self.b_ def __repr__(self): """返回一個可以用來表示對象的可打印字符串""" return "SimpleLinearRegression()"

3.2 調用

下面我們在jupyter中調用我們自己寫的程序:

首先創建一組數據,然后生成SimpleLinearRegression()的對象reg1,然后調用一下

from myAlgorithm.SimpleLinearRegression import SimpleLinearRegressionx = np.array([1.,2.,3.,4.,5.])y = np.array([1.,3.,2.,3.,5,])x_predict = np.array([6])reg = SimpleLinearRegression()reg.fit(x,y)

輸出:SimpleLinearRegression()

reg.predict(x_predict)reg.a_reg.a_

輸出:array([5.2]) 0.8 0.39999999999999947

y_hat = reg.predict(x)plt.scatter(x,y)plt.plot(x,y_hat,color='r')plt.axis([0,6,0,6])plt.show()

0xFF?總結

在本篇文章中,我們實現了簡單線性回歸算法的代碼,并且使用了向量化運算,事實證明,向量化運算能夠提高運算效率。

同時我們發現,只要數學公式推導清楚了,實際寫代碼時沒有太多難度的。

那么我們思考一個問題,在之前的kNN算法(分類問題)中,使用分類準確度來評價算法的好壞,那么回歸問題中如何評價好壞呢?

熱門文章

直戳淚點!數據從業者權威嘲諷指南!

AI研發工程師成長指南

數據分析師做成了提數工程師,該如何破局?

算法工程師應該具備哪些工程能力

數據團隊思考:如何優雅地啟動一個數據項目!

數據團隊思考:數據驅動業務,比技術更重要的是思維的轉變

總結

以上是生活随笔為你收集整理的c++ 线性回归_模型之母:简单线性回归的代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。

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