一篇文章了解机器学习(下)

一、决策树

1、主要应用场景为分类的问题。采用“树”的理念,通过计算数据的信息熵确定树的根节点、channel,从而加快数据分类。

注:与常规二分类树的区别:决策树中通过依据树的广度与深度,不断确定根节点的root值,同时具有一定的断枝、减枝的功能。
# 手动计算决策树
import pandas as pd
import numpy as npdata = pd.read_excel('shang.xls')
data['age'] = [2 if i >35 else 1 for i in data['age']]
data['money'] = [2 if i >=10000 else 1 for i in data['money']]
data['study'] = [2 if i >= 3 else 1 for i in data['study']]
data = np.array(data)
x = data[:,0:4]
y = data[:,-1]
# 定义信息熵函数
def Log2(x):return -x*np.log2(x)# 计算属性的信息增益
def branch(x,y,m):p_work_1 = sum(x[:,m] == 1) / len(x)p_work_2 = sum(x[:,m] == 2) / len(x)p_work_1_0 = 0p_work_1_1 = 0p_work_2_0 = 0p_work_2_1 = 0for i in range(len(y)):if x[i,m] == 1:if y[i] == 0:p_work_1_0 += 1else:p_work_1_1 += 1if x[i,m] == 2:if y[i] == 0:p_work_2_0 += 1else:p_work_2_1 += 1p_work_1_all = p_work_1_0 + p_work_1_1p_work_2_all = p_work_2_0 + p_work_2_1if p_work_1_0 == 0:p_work_1_0 = 0.00001else:p_work_1_0 /= p_work_1_allif p_work_1_1 == 0:p_work_1_1 = 0.00001else:p_work_1_1 /= p_work_1_allif p_work_2_0 == 0:p_work_2_0 = 0.00001else:p_work_2_0 /= p_work_2_allif p_work_2_1 == 0:p_work_2_1 = 0.00001else:p_work_2_1 /= p_work_2_all# print("p_work_1_0: ", p_work_1_0)# print("p_work_1_1: ", p_work_1_1)# print   ("p_work_2_0: ", p_work_2_0)# print("p_work_2_1: ", p_work_2_1)p_work_H = p_work_1 * (Log2(p_work_1_0) + Log2(p_work_1_1)) + p_work_2 * (Log2(p_work_2_0) + Log2(p_work_2_1))return p_work_H# 返回列表中最大值的下角标
def max_index(list):max_index = 0for i in range(len(list)):if list[i] > list[max_index]:max_index = ireturn max_index
# 计算根节点的信息熵
p_0 = sum(y==0)/len(y)
p_1 = sum(y==1)/len(y)
p_H = Log2(p_0)+Log2(p_1)
# print('根节点的信息熵为:',p_H)all_index = []
n,m = x.shape
for i in range(m):p_h = branch(x,y,i)p_w = p_H - p_hall_index.append(p_w)index = max_index(all_index)
index
# 计算机实现决策树
# 计算过程可视化
# 导入决策树的模块
from sklearn.tree import DecisionTreeClassifier 
desc = DecisionTreeClassifier(criterion="entropy")   # 设定为信息熵方式构建决策树
# 默认criterion="gini"    #  采用基尼指数作为评价标准
from sklearn.datasets import load_iris  
from sklearn.model_selection import train_test_split   
from sklearn.preprocessing import StandardScalerdata = load_iris()
x,y = load_iris(return_X_y=True)x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.75,random_state=1)
satander = StandardScaler()
x_train = satander.fit_transform(x_train)
model = desc.fit(x_train,y_train)
x_test = satander.transform(x_test)
score = model.score(x_test,y_test)
print(score)

2、决策树可视化工具

from sklearn.tree import export_graphviz
export_graphviz(model, out_file="iris_tree.dot", feature_names=data.feature_names)

将产生的model文件,复制到"http://webgraphviz.com/"进行决策树的可视化。

二、随机森林

from sklearn.ensemble import RandomForestClassifier
model =RandomForestClassifier(n_estimators=100,criterion='gini',max_depth=5)

三、线性回归

1、最小二乘法

(1)对方阵进行求导,最终Loss = 1/2||(XW-y)||^2。

# 手动实现方阵的最小二乘法
# 构建参数矩阵
# 最小二乘法计算参数   W=(X^TX)^{-1}X^Ty
# np.linalg.inv()  计算矩阵的逆矩阵
W = np.dot(np.dot(np.linalg.inv(np.dot(x.T,x)),x.T),y)
print(W)
# 手动实现非方阵的最小二乘法
# 构建参数矩阵
# 最小二乘法计算参数   W=(X^TX)^{-1}X^Ty
# np.linalg.inv()  计算矩阵的逆矩阵
W = np.dot(np.dot(np.linalg.pinv(np.dot(x.T,x)),x.T),y)
print(W)

(2)np.linalg.inv()与np.linalg.pinv()的区别

import numpy as np
data = [[1,0],[0,1],[2,2]]
# 采用np.linalg.inv对data进行逆矩阵计算
# 最终结果报错。因为计算矩阵的逆矩阵需方阵
# np.linalg.pinv()的计算机理
data = [[1,0],[0,1],[2,2]]  #data.shape = 3*2
# 将data空缺部分填充极小值,将data填充为方阵
data = [[1,0,0.00001],[0,1,0.00001],[2,2,0.00001]]
# 对data数据进行求逆矩阵 后进行矩阵的减枝 2*3型矩阵
data^-1.shape = 2*3 型矩阵

(3)链式求导计算损失函数

# 链式求导计算矩阵的Loss中W的值  (XW - y) X^T ==> W = X^-1*y*X^T*(X^T^-1)   ==> X^-1*y
# 链式求导 (XW - y) X^T ==> W = X^-1*y
W = np.dot(np.linalg.pinv(x),y)   # 计算非方阵的逆矩阵

(4)线性回归

# 计算机实现最小二乘法
# 没有偏置项
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=False)   
model.fit(x,y)
print(model.coef_)   # 结果与数学公式计算结果一致
print(model.intercept_)
# 计算机实现最小二乘法
# 有偏置项
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)   
model.fit(x,y)
print(model.coef_)   # 结果与数学公式计算结果不一致 
# 需要后续进行讨论
print(model.intercept_)

四、梯度下降

1、单维度梯度下降

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
w = np.linspace(-100, 100, 100)
# 损失函数
def loss_func(w):   return (w - 3.5)**2 -4.5*w + 10
plt.plot(w, loss_func(w))
# 损失函数的导数
def d_loss_func(w):return 2*(w-3.5)-4.5
# 梯度下降函数
def grid_func(w,learn_speed):return w - learn_speed *d_loss_func(w)# np.random.seed(66)
# w= np.random.randint(500)
w = 10
learn_speed = 0.1
# 存储训练过程中的w与loss值
x = [w]
y = [loss_func(w)]
for i in range(100):w = grid_func(w,learn_speed)x.append(w)y.append(loss_func(w))# print(loss_func(w))
plt.scatter(x,y)
plt.show()

2、多维度梯度下降

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib inlinew1 = np.linspace(-100, 100, 100)
w2 = np.linspace(-100, 100, 100)
# 损失函数
def loss_func(w1,w2):return (w1 - 3.5)**2 +(w2 - 2)**2+3*w1*w2-4.5*w1+2*w2 + 20
# 损失函数的导数/偏导
def d1_loss_func(w1,w2):return 2*(w1-3.5)+3*w2-4.5
def d2_loss_func(w1,w2):return 2*(w2-2)+3*w1+2
# 梯度下降函数 
# 多维度、锁定其他的w,每一次对单w进行计算下降。
# 将多维度 转换为 单维度 进行权重的下降
def grid_func(w1,w2,learn_speed):w1_old = w1w2_old = w2w1 = w1_old - learn_speed *d1_loss_func(w1_old,w2_old)w2 = w2_old - learn_speed *d2_loss_func(w1_old,w2_old)return w1,w2fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(w1,w2, loss_func(w1,w2))np.random.seed(66)
w1= np.random.randint(50)
w2= np.random.randint(50)
learn_speed = 0.01
# 存储训练过程中的w与loss值
x = [w1]
y = [w2]
z = [loss_func(w1,w2)]
all = []
for i in range(100):w1,w2 = grid_func(w1,w2,learn_speed)x.append(w1)y.append(w2)z.append(loss_func(w1,w2))dict= {'w1':w1,'w2':w2,'loss':loss_func(w1,w2)}all.append(dict)# print(f"第{i}步,w1:{w1},w2:{w2},loss:{loss_func(w1,w2)}")plt.scatter(x,y,z)
plt.show()
# 模型在底部进行动荡
with open('data.txt','w') as f:for i in all:f.write(str(i)+'\n')
f.close()

3、梯度下降-SGD/M_SGD

from sklearn.linear_model import SGDRegressor
model = SGDRegressor()
# MSGD == 小批量进行梯度下降
from sklearn.linear_model import SGDRegressor
model = SGDRegressor()
batch = 50
n_train = len(data) // batch
for epoch in range(model.max_iter):for i in range(n_train):# 对train数据集进行手动切分start_index = i * batchstop_index = (i+1) * batchx_train = data[start_index,stop_index]y_train = data[start_index,stop_index]# 对模型进行训练  partial_fit 每次fit不会抵消之前fit好的weightmodel.partial_fit(x_train,y_train)
# 得到模型
model.coef_  # 获得模型中最后的参数
model.intercept_  # 获得b

4、正则化

## 核心思想 == 抑制W的发展

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

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

相关文章

深入解析QP算法及其Python实现

目录 深入解析QP算法及其Python实现第一部分:QP算法的基本原理与数学模型1.1 QP问题定义1.2 算法核心思想1.3 应用场景第二部分:QP算法的Python实现(面向对象设计)2.1 核心代码实现第三部分:案例1 - 投资组合优化问题(策略模式)3.1 问题描述3.2 代码实现3.3 设计模式分析…

VuePress v2 快速搭建属于自己的个人博客网站

目录 为什么用VuePress? 一、前期准备 Node.js 使用主题快速开发 二、VuePress安装 三、个性化定制 修改配置信息 删除不需要的信息 博客上传 四、部署 使用github快速部署 初始化仓库 本地配置 配置github的ssh密钥 部署 为什么用VuePress&#xff…

前端开发调试之 PC 端调试学习笔记

一、引言 在前端开发过程中,调试是至关重要的一个环节。它能帮助我们快速定位代码中的问题,无论是页面布局错乱、交互效果异常还是性能不佳等情况,通过有效的调试手段都可以找到根源并进行修复。而在 PC 端进行调试有着其特定的方法和技巧&am…

PostgreSQL常用时间函数与时间计算提取示例说明

文章目录 常用函数与常量to_timestamp(字符串转时间戳、数字转时间戳)date与to_date(字符串转日期、时间戳转日期)interval(时间计算)基本操作与格式混合运算 to_char(各种时间转字符串)extract(提取时间字段,年月日时分秒,周、季度,第几周、…

SlickGrid点击/双击事件

分析 SlickGrid提供了点击事件方法grid.onClick和grid.onDblClick用于捕获用户对表格列的点击,捕获到点击事件之后,修改表格数据,然后使用grid.updateRow方法将修改后的数据更新到表格中。 展示 代码 创建grid(HTML)…

iOS UI 自动化 手势右滑退出当前页面

1、TouchAction from appium.webdriver.common.touch_action import TouchAction# 获取屏幕的宽度和高度 screen_width driver.get_window_size()["width"] screen_height driver.get_window_size()["height"]# 定义滑动的起点和终点坐标 start_x 0 en…

【Unity ShaderGraph实现流体效果之Node入门(二)】

Unity ShaderGraph实现流体效果之Node入门(二) 前言Shader Graph NodeStep NodeMultiply NodeRotate About AxisAddfresnel effectIs Front Face 前言 在(一)中讨论了一部分在制作流体效果时使用的Node,本章继续将剩余…

Redis 6.2 源码导读

Redis 是一个高性能的开源内存键值数据库,广泛用于缓存、会话管理和实时分析。Redis 6.2 版本引入了一些新特性和改进。 以下是 Redis 6.2 源码的一些关键部分和导读: 1. 源码结构 Redis 的源码主要分布在以下几个目录中: src/&#xff1…

集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

集合卡尔曼滤波(Ensemble Kalman Filter) 文章目录 引言理论基础卡尔曼滤波集合卡尔曼滤波初始化预测步骤更新步骤卡尔曼增益更新集合 MATLAB 实现运行结果3. 应用领域结论 引言 集合卡尔曼滤波(Ensemble Kalman Filter, EnKF)是…

解决Docker环境变量的配置的通用方法

我们部署的很多服务都是以Docker容器的形式存在的。 在运行Docker容器前,除了设置网络、数据卷之外,还需要设置各种各样的环境变量。 有时候,由于容器版本的问题,一些文档没有及时更新,可能同时存在多个新旧版本的环…

2446.学习周刊-2024年46周

封面 拍摄于11月17日,身心疲惫的时候,去山里走走看看风景,富氧的环境能缓解身心疲劳。 ✍优秀博文 # 深度解析数仓建模与指标体系构建的底层逻辑 | 金字塔原理在数仓建模分析中的应用基于“理采存管用”的数据中台建设方案业务逻辑不要放入…

自然语言处理:第六十三章 阿里Qwen2 2.5系列

本人项目地址大全:Victor94-king/NLP__ManVictor: CSDN of ManVictor 项目地址: QwenLM/Qwen2.5: Qwen2.5 is the large language model series developed by Qwen team, Alibaba Cloud. 官网地址: 你好,Qwen2 | Qwen & Qwen2.5: 基础模型大派对&a…

六、卷积神经网络(CNN)基础

卷积神经网络(CNN)基础 前言一、CNN概述二、卷积层2.1 卷积2.2 步幅(Stride)2.3 填充(Padding)2.4 多通道卷积2.5 多卷积计算2.6 特征图大小计算2.7 代码演示 三、池化层3.1 池化层计算3.1.1 最大池化层3.1.2 平均池化层 3.2 填充(Padding)3.3 步幅(Stri…

Spring Security SecurityContextHolder(安全上下文信息)

在本篇博客中,我们将讨论 Spring Security 的 SecurityContextHolder 组件,包括其实现方式、关键特性,并通过实际示例进行说明。 理解 SecurityContextHolder SecurityContextHolder 是 Spring Security 存储当前安全上下文详细信息的地方。…

通过vite+vue3+pinia从0到1搭建一个uniapp应用

最近项目上要做一个app,选择了用uniapp作为开发框架;我大概看了一下uniapp的文档,根据文档从0到1搭了一个uniapp应用供大家参考。 因为本人习惯使用了WebStorm编译器,但是uniapp官方推荐使用HBuilder搭建,如果和我一样…

【Pytorch】torch.nn.functional模块中的非线性激活函数

在使用torch.nn.functional模块时,需要导入包: from torch.nn import functional 以下是常见激活函数的介绍以及对应的代码示例: tanh (双曲正切) 输出范围:(-1, 1) 特点:中心对称,适合处理归一化后的数据…

java-贪心算法

1. 霍夫曼编码(Huffman Coding) 描述: 霍夫曼编码是一种使用变长编码表对数据进行编码的算法,由David A. Huffman在1952年发明。它是一种贪心算法,用于数据压缩。霍夫曼编码通过构建一个二叉树(霍夫曼树&a…

网络安全学习74天(记录)

11.21日,今天学习了 app抓包(需要的工具charles(激活),夜神模拟器,postern,) 思路:首先charles需要抓取的app的包,需要的是装证书,将charles的证…

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

实时数仓:Lambda架构和Kappa架构有什么联系和区别

Kappa 和 Lambda 架构是处理大数据和实时数据流的两种不同设计模式。以下是对这两种架构的概述和比较&#xff1a; Lambda 架构 定义&#xff1a; Lambda 架构的全称是 Lambda Architecture。这个架构旨在处理大规模数据&#xff0c;结合了批处理和流处理的优点&#xff0c;以…