IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021-08-10 -> 正文阅读

[数据结构与算法]2021-08-10

Logistic Regression的理解

一点理解

引入
1.已知30天的消费数额,想预测第31天的数额是多少?

2.有一堆数据,每一组数据描述了一个实例,在新实例出现时描述结果是怎样?

3.早上出门天空有彩霞,半山有积云,今天会不会下雨?

总结: 案例1 可理解为从已知数据中拟出适合的模型来预测未知数据,案例2是类似这类抽象表述,下左图即为图形化展示:f是需要设计的模型;{x1,x2,…,xn}是输入数据;w是参数,模型设计的也是求解参数,输出是一个没有范围的数值。这里理解是一个样本有n个属性{x1,x2,…,xn},不同属性赋予不同的权值,也可以表示属性的重要性。案例3即是表示的是逻辑回归案例了,输入样本的今天,属性是朝霞和半山有云2个属性,输出是只有会和不会两种结果(0和1表示),即如下右图所示。总上也可简单的理解逻辑回归和线性回归都是以未知建立模型来预测未知,只是逻辑回归是以概率形式表达,从f0到p采用的一般的概率的打分函数,有sigmoid、tanh、softmax等等,其中前两者多是二分类中使用,后一多是多分类中使用。
					线性回归															逻辑回归
sigmoid函数及其导函数											tanh函数及其导函数
softmax函数及其数学算式
实例
有一组带有标签的数据分为了训练集和测试集,两种类别进行预测。

代码实现

代码实现的效果
代码Step1执行打印出的效果

Step3实现的效果。左图在x2=0的面上蓝色和红色的是分布的两类数据集,经过线性回归可以映射到斜面上蓝色的五角星和红色的菱形,右图绿色的即是划分的分界线。
Step4可视化出的Loss函数和红线是迭代过程,因为数据有限造成这种迭代效果。

代码片

#Step0:这里是对模型进行初始化,包括数据准备和参数初始化
clear all;clc;
data = load('train_data.txt');	#加载数据
useful_data = data;		
X = useful_data(:, 2:3);	#只选用第23列作为数据属性
y = useful_data(:, 5);		#获取每个样本的标签
[m,n] = size(X);
X = [X ones(m, 1)];			#加一列1是赋予了偏置方便计算
beta = zeros(n+1, 1);		#0值初始化参数
iteration = 1500;			#迭代次数
alpha = 0.01;				#学习率设计
#%Step1:这里进行训练获得模型
beta_tmp = [];
for iter = 1 : iteration
    z = X * beta;
    h = 1 ./ (1 + exp(-z));
    error = h - y;
    graident = X' * error;
    beta = beta - alpha / m * graident;
%     beta = beta*0.99 - alpha / m * graident; % momentum参数更新;
    loss_value = sum(error);
    beta_tmp(iter,:) = beta;
    z = X*beta;
    pre_tmp = sigmiod(z);
    pre = [];
    y_hat = y;
    for i=1:size(pre_tmp,1)
        if pre_tmp(i,1) <=0.5
            pre(i,1) = 0;
        else
            pre(i,1) = 1;
        end
    end
    count = 0;
    bingo = [];
    for j=1:size(pre,1)
        if pre(j,1) == y_hat(j,1)
            count = count+1;
            bingo(count,1) = j;
        end
    end
    train_accuracy = count./size(pre,1);
    
    disp(['--------第', num2str(iter), '个epoch','的准确率是', num2str(train_accuracy),'--------loss_value==',num2str(loss_value)])
%         学习率进行更新;
%         if i/20==0
%             i = i*0.1;
%         end

end
save_path = ('./batch_model.mat');
save(save_path,'beta');
save_path = ('./beta_tmp.mat');
save(save_path,'beta_tmp');
%Step2:这一步是计算训练模型下获得的准确率
beta_tmp = load('./batch_model.mat');
beta = beta_tmp.beta;
z = X*beta;
pre_tmp = sigmiod(z);
pre = [];
y_hat = y;
for i=1:size(pre_tmp,1)
    if pre_tmp(i,1) <=0.5
        pre(i,1) = 0;
    else
        pre(i,1) = 1;
    end
end
count_train = 0;
bingo = [];
for j=1:size(pre,1)
    if pre(j,1) == y_hat(j,1)
        count_train = count_train+1;
        bingo(count_train,1) = j;
    end
end
train_accuracy = count./size(pre,1);
test_data_tmp = load('test_data.txt');

test_data = [test_data_tmp(:, 2:3) ones(4,1)];
test_label = [0;1;1;1];
y_test =  test_data*beta;
y_test_sig = sigmiod(y_test);
pre_test = [];
for i=1:size(y_test_sig,1)
    if y_test_sig(i,1) >=0.5
        pre_test(i,1) = 1;
    else
        pre_test(i,1) = 0;
    end
end
count_test = 0;
for j=1:size(pre_test,1)
    if pre_test(j,1) == test_label(j,1)
        count_test = count_test+1;
    end
end
test_accuracy = count_test./size(pre_test,1);
%Step3:这里是对数据进行可视化
class1_train_data = data(1:19,:);       %这里是对原始数据进行可视化
class0_train_data = data(20:38,:);
c1_1 = class1_train_data(:,2);
c1_2 = class1_train_data(:,3);
c1_3 = zeros(19,1);
c0_1 = class0_train_data(:,2);
c0_2 = class0_train_data(:,3);
c0_3 = zeros(19,1);
subplot(1,2,1)
scatter3(c1_1,c1_2,c1_3,'filled','r');
xlabel('x1')
ylabel('x2')
zlabel('x3')
axis manual   
hold on  
scatter3(c0_1,c0_2,c0_3,'filled','b');

beta_tmp = load('./batch_model.mat');   %这里下面是另外一个figure显示升维后的数据
beta = beta_tmp.beta;
c1_data = [c1_1 c1_2 ones(19,1)];
z_c1 = c1_data*beta;
c0_data = [c0_1 c0_2 ones(19,1)];
z_c0 = c0_data*beta;
scatter3(c1_1,c1_2,z_c1,'d','r');
axis manual   
hold on  
scatter3(c0_1,c0_2,z_c0,'p','b');
subplot(1,2,2)
x1_axis = [6:0.1:7.9];
x2_axis = [6:0.1:7.9];
x = [x1_axis' x2_axis' ones(20,1)];
y = x*beta;
xlabel('x1')
ylabel('x2')
zlabel('x3')
scatter3(c1_1,c1_2,z_c1,'d','r');
axis manual   
hold on  
scatter3(c0_1,c0_2,z_c0,'p','b');
axis manual   %保持当前坐标刻度范围
hold on   %保留图像
plot3(x1_axis,x2_axis,y,'g');
%Step4:这里是可视化loss函数
beta_tmp = load('beta_tmp.mat');
beta = beta_tmp.beta_tmp;
A = beta(1:38,:);
for i=1:38
%     l = y.*(X*(beta(i,:)'/55))-log(1+exp(X*(beta(i,:)'/55)));
    l = y.*(X*(beta(i,:)'))-log(1+exp(X*(beta(i,:)')));
%     L(i,1) = sum(l)/10;
    L(i,1) = sum(l);
end
epoch = [];
for i=1:size(A,1)
    E = y.*(X*(A(i,:)'/55))-log(1+exp(X*(A(i,:)'/55)));
    epoch(i,1) = sum(E)/10;
end
x = X(:,1);
y = X(:,2);
plot3(x,y,L,'r');
xlabel('x');
ylabel('y');
zlabel('z');
% scatter3(x,y,z)%散点图
% x = beta(:,1);
% y = beta(:,2);
% L = beta(:,3);
% axis manual   %保持当前坐标刻度范围
hold on  
[X,Y,Z]=griddata(x,y,epoch,linspace(min(x),max(x))',linspace(min(y),max(y)),'v4');
% surf(X,Y,Z);%三维曲面
meshc(X,Y,Z)
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:40:50  更:2021-08-11 12:43:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 17:27:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计