NumPy实现线性回归

news2024/9/22 11:33:34

1 单变量线性回归

1.1 sklearn实现(最小二乘法)

import os

import pandas as pd
import matplotlib.pyplot as plt
import sys

current_dir=os.getcwd()
path=current_dir+'\\'+"Salary Data.csv"

def plot_data(path):
    table=pd.read_csv(path)

    experience = table["Experience Years"]
    salary = table["Salary"]

    plt.figure(figsize=(8,6))
    plt.scatter(experience,salary,color="blue",label="Data points")
    plt.title("experience vs year")
    plt.xlabel("Experience (Years)")
    plt.ylabel("Salary")
    plt.grid(True)
    plt.legend()
    plt.show()
plot_data(path)

table=pd.read_csv(path)
y=table['Salary']
x=table[ ['Experience Years'] ]  # x.shape=(40,1)
z=table['Experience Years']    # z.shape=(40,)

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.7,random_state=2529)
# (28, 1) (28,) (12, 1) (12,)

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_train,y_train)

print( model.intercept_ )  # 26596.961311068262
print( model.coef_ )       # [9405.61663234]

from sklearn.metrics import mean_squared_error, r2_score
y_pred = model.predict(x_test)

mse = mean_squared_error(y_test, y_pred)
print( "mse = ", mse )          # 24141421.671440993
r2 = r2_score(y_test, y_pred)
print( "r2 = ", r2 )            # 0.960233432146844

y_whole_pred=model.predict(x)
# x.iloc[:,0]可以写成x, 或者x["Experience Years"]
plt.scatter(x.iloc[:,0],y,color="blue",label="Data points")
plt.plot(x,y_whole_pred,color="red",linewidth=2, label='linear regression')

plt.xlabel("Experience (Years)")
plt.ylabel("Salary")
plt.legend()
plt.show()

1.2 NumPy实现(梯度下降法)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
from sklearn.model_selection import train_test_split
import sys


def plot_data(path):
    table=pd.read_csv(path)

    experience = table["Experience Years"]
    salary = table["Salary"]

    plt.figure(figsize=(8,6))
    plt.scatter(experience,salary,color="blue",label="Data points")
    plt.title("experience vs year")
    plt.xlabel("Experience (Years)")
    plt.ylabel("Salary")
    plt.grid(True)
    plt.legend()
    plt.show()

class MyLinearReg:
    def __init__(self,lr = 0.01, epochs = 1000):
        self.lr = lr
        self.epochs = epochs
        self.w = None
        self.b = None
        self.loss_history = []
    def fit(self,X,y):
        m,n = X.shape

        self.w = np.zeros(n)
        self.b = 0

        for epoch in range(self.epochs):
            # x(m,n) * w(n,), numpy广播机制矩阵向量乘法
            y_pred = X @ self.w + self.b  # y_pred(m,)
            loss = (y_pred - y)           # loss(m,)
            dcost_dw = (1/m) * (X.T @ loss)

            dcost_b = (1/m) *  loss
            dcost_b = np.sum(dcost_b)

            self.w -= self.lr * dcost_dw
            self.b -= self.lr * dcost_b

            square_loss = (y_pred-y)**2
            mean_loss = np.mean(square_loss)
            self.loss_history.append(mean_loss)

            if epoch % 100 == 99 :
                print(f"Epoch {epoch} loss: {mean_loss}")
        print("Trainning finished.")
        print("Final parameters:","Slope w=",self.w," Bias b=",self.b)
        # Final parameters: Slope w= [9853.19132896]  Bias b= 23780.770014707407
    def predict(self,X):
        return X @ self.w + self.b
    def get_params(self):
        return self.w, self.b

# plot_data(path)
current_dir=os.getcwd()
path=current_dir+'\\'+"Salary Data.csv"
table=pd.read_csv(path)
x = table["Experience Years"].values # x(40,)
y = table["Salary"].values           # y(40,)
#(32,),(8,)(32,)(8,)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
# (32,) (32,) (8,) (8,)

x_train=x_train.reshape(-1,1)
x_test=x_test.reshape(-1,1)
model = MyLinearReg()
model.fit(x_train, y_train)

y_pred = model.predict(x_test)

from sklearn.metrics import mean_squared_error, r2_score

mse = mean_squared_error(y_test, y_pred)
print( "mse = ", mse )          # mse =  43053815.910611115
r2 = r2_score(y_test, y_pred)
print( "r2 = ", r2 )           # r2 =  0.9165907194371214


X=x.reshape(-1,1)
y_whole_pred=model.predict(X)
# x.iloc[:,0]可以写成x, 或者x["Experience Years"]
plt.scatter(x,y,color="blue",label="Data points")
plt.plot(x,y_whole_pred,color="red",linewidth=2, label='linear regression')

plt.xlabel("Experience (Years)")
plt.ylabel("Salary")
plt.legend()
plt.show()
Epoch 99 loss: 111815444.20061775
Epoch 199 loss: 81534511.03025383
Epoch 299 loss: 61760636.04682423
Epoch 399 loss: 48848017.74472436
Epoch 499 loss: 40415896.49608463
Epoch 599 loss: 34909602.800390095
Epoch 699 loss: 31313915.621658318
Epoch 799 loss: 28965881.353634194
Epoch 899 loss: 27432581.973080143
Epoch 999 loss: 26431315.92580659
Trainning finished.
Final parameters: Slope w= [9853.19132896]  Bias b= 23780.770014707407
mse =  43053815.910611115
r2 =  0.9165907194371214

2 多变量线性回归

2.1 sklearn实现(最小二乘法)

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
import sys

def draw_PairwiseScatter(x,y):
    num_features = x.shape[1]
    plt.figure(figsize=(15,10))
    for i in range(num_features):
        plt.subplot(3,5,i+1) # 子图的索引从1开始
        plt.scatter(x[:,i],y,marker='o', color="green", s=15,alpha=0.5)
        plt.xlabel("Feature {}".format(i+1))
        plt.ylabel("Label")
        plt.title("Featurs {} vs Target".format(i+1))
    plt.tight_layout()
    plt.show()
def draw_real_pred(x,y,model):
    y_pred_whole =  model.predict(x)
    num_features = x.shape[1]
    plt.figure( figsize=(15,10) )
    for i in range(num_features):
        plt.subplot(3,5,i+1)
        plt.scatter(x[:,i],y,marker='o',color="green", s=15,alpha=0.5)
        plt.scatter(x[:,i],y_pred_whole,marker="o", color="red", s=15,alpha=0.5)
        plt.xlabel("Feature {}".format(i+1))
        plt.ylabel("Label")
        plt.title("Featurs {} vs Target".format(i+1))
    plt.tight_layout()
    plt.show()

current_dir = os.getcwd()
path = current_dir + '\\' + "Boston.csv"
house = pd.read_csv(path)

y = house['MEDV']                           #  (506,)
X = house.drop(['MEDV'], axis = 1)   #  (506,13)
X=np.array(X)
y=np.array(y)

draw_PairwiseScatter(X,y)

from sklearn.linear_model import LinearRegression
model = LinearRegression()

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, train_size = 0.7, random_state = 2529)
#     (354, 13) (152, 13) (354,) (152,)

# Ordinary Least Squares 不是梯度下降,不用标准化数据
# theta = (X.T * X)-1 * X.T * y: 最小二乘法
model.fit(x_train,y_train)
print(model.intercept_)
print(model.coef_)

y_pred = model.predict(x_test)

from sklearn.metrics import  mean_absolute_error, r2_score
print( "mean_absolute_error(y_pred,y_test):", mean_absolute_error(y_pred,y_test) )

print ( model.score(x_test,y_test) )
r2 = r2_score(y_test, y_pred)
print(r2)  # 0.6551914852365524

draw_real_pred(X,y,model)

2.2 NumPy实现(梯度下降法) 

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
import sys

def draw_PairwiseScatter(x,y):
    num_features = x.shape[1]
    plt.figure(figsize=(15,10))
    for i in range(num_features):
        plt.subplot(3,5,i+1)
        plt.scatter(x[:,i],y,marker='o', color="green", s=15,alpha=0.5)
        plt.xlabel("Feature {}".format(i+1))
        plt.ylabel("Label")
        plt.title("Featurs {} vs Target".format(i+1))
    plt.tight_layout()
    plt.show()

def draw_real_pred(x,y,model):
    y_pred_whole =  model.predict(x)
    num_features = x.shape[1]
    plt.figure(figsize=(15,10))
    for i in range(num_features):
        plt.subplot(3,5,i+1)
        plt.scatter(x[:,i],y,marker='o',color="green", s=15,alpha=0.5)
        plt.scatter(x[:,i],y_pred_whole,marker='o', color="red", s=15,alpha=0.5)
        plt.xlabel("Feature {}".format(i+1))
        plt.ylabel("Label")
        plt.title("Featurs {} vs Target".format(i+1))
    plt.tight_layout()
    plt.show()

class MultipleLinear:
    def __init__(self,learning_rate=0.01, epochs=1000):
        self.learning_rate = learning_rate
        self.epochs = epochs
        self. theta = None
        self.cost_history = None
    def fit(self,X,y):
        X = np.hstack( ( np.ones((X.shape[0],1)), X ) )
        m,n = X.shape
        self.theta = np.zeros(n)
        self.cost_history = []
        for epoch in range(self.epochs):
            y_pred = X @ self.theta

            gradient = X.T @ (y_pred - y)
            self.theta -= self.learning_rate * gradient * (1/m)
            cost = self.compute_cost(X,y)
            self.cost_history.append(cost)

            if epoch % 100 == 99:
                print(f"Epoch {epoch} cost: {cost}")
        print("Training complete")
        print ( self.theta )
    def predict(self,X):
        m,n = X.shape
        X = np.hstack( (np.ones((m,1)), X) )
        return  X @ self.theta
    def compute_cost(self,X,y):
        m = X.shape[0]
        y_pred = X @ self.theta
        sq_errors = (y_pred - y)**2
        cost = 1 / (2 * m) * np.sum(sq_errors)
        return cost

current_dir = os.getcwd()
path = current_dir + '\\' + "Boston.csv"
house = pd.read_csv(path)


y = house['MEDV']                           #  (506,)
X = house.drop(['MEDV'], axis = 1)   #  (506,13)
X=np.array(X)
y=np.array(y)

draw_PairwiseScatter(X,y)

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# (404, 13) (102, 13) (404,) (102,)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(x_train)  # (404,13)
x_test_scaled = scaler.transform(x_test)        # (102,13)


model = MultipleLinear()
model.fit(x_train_scaled, y_train)

y_pred = model.predict(x_test_scaled)

from sklearn.metrics import  r2_score
r2 = r2_score(y_test,y_pred)
print("r2 = ",r2)       # r2 =  0.6543244875135051

draw_real_pred(X,y,model)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六、Selenium操作指南(三)

文章目录 七、模拟鼠标操作(一)左键 click()(二)右键 context_click()(三)双击 double_click()(四)拖拽 drag_and_drop(source,target)(五)悬停 move_to_elem…

python-禁止抽烟

题目描述 小理的朋友有 n 根烟,他每吸完一根烟就把烟蒂保存起来,k( k>1)个烟蒂可以换一个新的烟,那么小理的朋友最终能吸到多少根烟呢? 与某些脑筋急转弯不同的是,小理的朋友并不能从异次元借…

AI 通过python脚本自动化导出交易软件某一天的分笔成交明细

一.背景需求 打开交易软件,我们想要导出非今日的日线股票成交分笔明细,其实,很麻烦的。你得在日线图上点击某一天的柱状图,然后双击,就会出现当日的成交明细,然后导出。如果你想到导出30天或者1年的数据呢?你难道盯着电脑一步一步的操作?不,我不允许你还不知道用pytho…

应急响应-爆破漏洞应急响应流程(以SSH爆破为例)

目录 概述研判分析登录成功登录失败历史命令authorized_keys 定损止损攻击链路还原清理恢复总结复盘参考 概述 爆破漏洞是比较常见漏洞,端口开放,管理后台没有做登录频率限制等情况都可能遭受到爆破攻击,本文以SSH爆破为例,介绍下…

【SpringCloud Alibaba】(十二)学习 Sleuth + ZipKin

目录 1、ZipKin 核心架构1.1、ZipKin 概述1.2、ZipKin 核心架构 2、集成 ZipKin2.1、下载安装 ZipKin 服务端2.2、集成 ZipKin 客户端 3、ZipKin 数据持久化3.1、ZipKin 数据持久化到 MySQL 在前面整合 Sleuth 实现链路追踪时,我们是通过查看日志的情况来了解系统调…

【书生大模型实战营】进阶岛 第2关 Lagent 自定义你的 Agent 智能体

文章目录 【书生大模型实战营】进阶岛 第2关 Lagent 自定义你的 Agent 智能体学习任务Lagent 介绍环境配置Lagent Web Demo 使用基于 Lagent 自定义智能体 【书生大模型实战营】进阶岛 第2关 Lagent 自定义你的 Agent 智能体 学习任务 使用 Lagent 自定义一个智能体&#xff…

Nginx: 负载均衡基础配置, 加权轮序, hash算法, ip_hash算法, least_conn算法

负载均衡 在真正的反向代理场景中,必然涉及到的一个概念,就是负载均衡所谓负载均衡,也就是将Nginx的请求发送给后端的多台应用程序服务器通常的应用程序服务器,后面的每台服务器都是一个同等的角色,提供相同的功能 用…

阿里巴巴发布 Qwen2-VL 人工智能模型,具备先进的视频分析和推理能力

中国阿里巴巴集团的云计算部门阿里云周四宣布推出一款名为 Qwen2-VL 的新型人工智能模型,该模型具有高级视觉理解能力和多语言对话能力。 该公司在 Qwen-VL 人工智能模型的基础上,历时一年研发出了新模型,并表示它可以实现对长度超过 20 分钟…

easy_spring_boot Java 后端开发框架

Easy SpringBoot 基于 Java 17、SpringBoot 3.3.2 开发的后端框架,集成 MyBits-Plus、SpringDoc、SpringSecurity 等插件,旨在提供一个高效、易用的后端开发环境。该框架通过清晰的目录结构和模块化设计,帮助开发者快速构建和部署后端服务。…

基于Java+SpringBoot+Vue的学生评奖评优管理系统的设计与实现

基于JavaSpringBootVue的学生评奖评优管理系统的设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅 某信 gzh 搜索【智…

CGAL 2D Polygons

CGAL 2D Polygons 简单概述 CGAL 2D Polygons使用。 简述 2D Polygon多边形是由一条封闭的边链表组成。对于多边形的操作有若干种常见的算法,有些算法要求多边形是简单多边形。如果边不相交,则多边形为简单多边形,除非连续的边相交于它们的…

django外键表查询存储删除

查询 之前用get 现在用filter,get返回对象,filter返回列表django model的get和filter方法的区别_django模型objects.get-CSDN博客 存储 删除

[001-07-001].Redis中的BigKey使用分析

1、常见面试题: 1.阿里的广告平台,海量数据里面查询某一固定前缀的key2.小红书,如何在生产限制keys*/flushdb/flushall等危险命令以防止误删除误使用3.美团,MEMORU USAGE命令你使用过吗4.Bikey问题,多大算big&#xf…

Spring之配置类解析源码解析

解析配置类 解析配置类流程图:https://www.processon.com/view/link/5f9512d5e401fd06fda0b2dd 解析配置类思维脑图:https://www.processon.com/view/link/614c83cae0b34d7b342f6d14 在启动Spring时,需要传入一个AppConfig.class给Appli…

VMware安装Ubuntu Linux Server操作系统

本文主要描述在VMware虚拟机上安装Ubuntu Linux Server操作系统,本版本集成kubernetes云原生对应的microk8s组件。 如上所示,从Ubuntu官方网站上下载Ubuntu服务器版本的安装文件 如上所示,在VMware上新建虚拟机,指定已下载的Ubunt…

基于yolov5的明厨亮灶阳光厨房老鼠检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的明厨亮灶阳光厨房老鼠检测系统是一种高效、智能的食品安全监测解决方案。该系统利用YOLOv5网络模型,结合深度学习技术,实现对厨房环境的实时监控与智能分析。 YOLOv5以其高速和高精度的特性,在实时目标检测任务中…

chapter09-OOP高级部分——(内部类)——day13

413-四种内部类 414-局部内部类1 记住: (1)局部内部类定义在方法中/代码块(2)作用域在方法体或者代码块中(3)本质仍然是一个类 415-局部内部类2 416-匿名内部类本质 匿名内部类只能用一次,并实例化了一个tiger对象, tiger指向它的对象,tig…

18043 找出3个数中最大的数

### 思路 1. 从键盘输入三个整数&#xff0c;使用空格分隔。 2. 比较三个整数&#xff0c;找出其中最大的数。 3. 输出最大的数。 ### 伪代码 1. 读取输入的三个整数。 2. 比较三个整数&#xff0c;找出最大的数。 3. 输出最大的数。 ### C代码 #include <iostream>…

Python编码系列—Python调试秘籍:pdb调试工具的实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

《神话:悟空》的破晓之路:文化深度与技术巅峰的交响乐章

在八月的炽热中&#xff0c;《黑神话&#xff1a;悟空》如同一道璀璨的光芒&#xff0c;划破了国产游戏的寂静夜空&#xff0c;不仅以其惊人的销量速度震撼了业界&#xff0c;更以其深厚的文化底蕴与顶尖的游戏设计&#xff0c;在全球玩家心中留下了不可磨灭的印记。这款游戏的…