5 逻辑回归及Python实现

news2024/11/15 17:16:04

1 主要思想

分类就是分割数据:

  • 两个条件属性:直线;
  • 三个条件属性:平面;
  • 更多条件属性:超平面。

在这里插入图片描述
使用数据:

5.1,3.5,0
4.9,3,0
4.7,3.2,0
4.6,3.1,0
5,3.6,0
5.4,3.9,0
. . .
6.2,2.9,1
5.1,2.5,1
5.7,2.8,1
6.3,3.3,1

2 理论

2.1 线性分割面的表达

平面几何表达直线(两个系数):
y = a x + b . y = ax + b. y=ax+b.

重新命名变量:
w 0 + w 1 x 1 + w 2 x 2 = 0. w_0 + w_1 x_1 + w_2 x_2 = 0. w0+w1x1+w2x2=0.

强行加一个 x 0 ≡ 1 x_0 \equiv 1 x01
w 0 x 0 + w 1 x 1 + w 2 x 2 = 0. w_0 x_0 + w_1 x_1 + w_2 x_2 = 0. w0x0+w1x1+w2x2=0.

向量表达( x \mathbf{x} x为行向量, w \mathbf{w} w为列向量,)
x w = 0. \mathbf{xw} = 0. xw=0.

2.2 学习与分类

  • Logistic regression的学习任务,就是计算向量 w \mathbf{w} w;
  • 分类(两个类别):对于新对象 x ′ \mathbf{x}' x,计算 x ′ w \mathbf{x}'\mathbf{w} xw,结果小于0则为0类,否则为1类;
  • 线性模型(加权和)是机器学习诸多主流方法的核心。

2.3 基本思路

2.3.1 第一种损失函数:

w \mathbf{w} w在训练集中 ( X , Y ) (\mathbf{X}, \mathbf{Y}) (X,Y)表现要好。
Heaviside跃迁函数为
H ( z ) = { 0 ,  if  z < 0 , 1 2 ,  if  z = 0 , 1 ,  otherwise. H(z) = \left\{\begin{array}{ll} 0, & \textrm{ if } z < 0,\\ \frac{1}{2}, & \textrm{ if } z = 0,\\ 1, & \textrm{ otherwise.} \end{array}\right. H(z)= 0,21,1, if z<0, if z=0, otherwise.
X = { x 1 , … , x m } \mathbf{X} = \{\mathbf{x}_1, \dots, \mathbf{x}_m\} X={x1,,xm}, 错误率即:
1 m ∑ i = 1 m ∣ H ( x i w ) − y i ∣ , \frac{1}{m}\sum_{i = 1}^m |H(\mathbf{x}_i\mathbf{w}) - y_i|, m1i=1mH(xiw)yi,
其中 H ( x i w ) H(\mathbf{x}_i\mathbf{w}) H(xiw)是分类器给的标签,而 y i y_i yi是实际标签。

  • 优点:表达了错误率;
  • 缺点:函数 H H H不连续,无法使用优化理论。

2.3.2 第二种损失函数

Sigmoid函数:
σ ( z ) = 1 1 + e − z . \sigma(z) = \frac{1}{1 + e^{-z}}. σ(z)=1+ez1.
优点:连续,可导。
在这里插入图片描述

Sigmoid函数的导数:
σ ′ ( z ) = d d z 1 1 + e − z = − 1 ( 1 + e − z ) 2 ( e − z ) ( − 1 ) = e − z ( 1 + e − z ) 2 = 1 1 + e − z ( 1 − 1 1 + e − z ) = σ ( z ) ( 1 − σ ( z ) ) . \begin{array}{ll} \sigma'(z) & = \frac{d}{dz}\frac{1}{1 + e^{-z}}\\ & = - \frac{1}{(1 + e^{-z})^2} (e^{-z}) (-1)\\ & = \frac{e^{-z}}{(1 + e^{-z})^2} \\ & = \frac{1}{1 + e^{-z}} (1 - \frac{1}{1 + e^{-z}}) \\ &= \sigma(z) (1 - \sigma(z)). \end{array} σ(z)=dzd1+ez1=(1+ez)21(ez)(1)=(1+ez)2ez=1+ez1(11+ez1)=σ(z)(1σ(z)).

y ^ i = σ ( x i w ) \hat{y}_i = \sigma(\mathbf{x}_i\mathbf{w}) y^i=σ(xiw),
1 m ∑ i = 1 m 1 2 ( y ^ i − y i ) 2 , \frac{1}{m} \sum_{i = 1}^m \frac{1}{2}(\hat{y}_i - y_i)^2, m1i=1m21(y^iyi)2,
其中平方使得函数连续可导, 1 2 \frac{1}{2} 21是为了适应求导的惯用手法。

缺点:非凸优化, 多个局部最优解

2.3.3 凸与非凸

在这里插入图片描述
在这里插入图片描述

2.3.4 第三种损失函数(强行看作概率)

由于 0 < σ ( z ) < 1 0 < \sigma(z) < 1 0<σ(z)<1, 将 σ ( x i w ) \sigma(\mathbf{x}_i \mathbf{w}) σ(xiw)看作类别为1的概率, 即
P ( y i = 1 ∣ x i ; w ) = σ ( x i w ) , P(y_i = 1 | \mathbf{x}_i; \mathbf{w}) = \sigma(\mathbf{x}_i \mathbf{w}), P(yi=1∣xi;w)=σ(xiw),
其中 x i \mathbf{x}_i xi是条件, w \mathbf{w} w是参数。

相应地
P ( y i = 0 ∣ x i ; w ) = 1 − σ ( x i w ) , P(y_i = 0 | \mathbf{x}_i; \mathbf{w}) = 1 - \sigma(\mathbf{x}_i \mathbf{w}), P(yi=0∣xi;w)=1σ(xiw),
综合上两式, 可得
P ( y i ∣ x i ; w ) = ( σ ( x i w ) ) y i ( 1 − σ ( x i w ) ) 1 − y i P(y_i | \mathbf{x}_i; \mathbf{w}) = (\sigma(\mathbf{x}_i \mathbf{w}))^{y_i} (1 - \sigma(\mathbf{x}_i \mathbf{w}))^{1 - y_i} P(yixi;w)=(σ(xiw))yi(1σ(xiw))1yi

该值越大越好。
假设训练样本独立, 且同等重要。
为获得全局最优, 将不同样本涉及的概率连乘, 获得似然函数:
L ( w ) = P ( Y ∣ X ; w ) = ∏ i = 1 m P ( y i ∣ x i ; w ) = ∏ i = 1 m ( σ ( x i w ) ) y i ( 1 − σ ( x i w ) ) 1 − y i \begin{array}{ll} L(\mathbf{w}) & = P(\mathbf{Y} | \mathbf{X}; \mathbf{w})\\ & = \prod_{i = 1}^m P(y_i | \mathbf{x}_i; \mathbf{w})\\ & = \prod_{i = 1}^m (\sigma(\mathbf{x}_i \mathbf{w}))^{y_i} (1 - \sigma(\mathbf{x}_i \mathbf{w}))^{1 - y_i} \end{array} L(w)=P(YX;w)=i=1mP(yixi;w)=i=1m(σ(xiw))yi(1σ(xiw))1yi
对数函数具有单调性:
l ( w ) = log ⁡ L ( w ) = log ⁡ ∏ i = 1 m P ( y i ∣ x i ; w ) = ∑ i = 1 m y i log ⁡ σ ( x i w ) + ( 1 − y i ) log ⁡ ( 1 − σ ( x i w ) ) \begin{array}{ll} l(\mathbf{w}) & = \log L(\mathbf{w})\\ & = \log \prod_{i = 1}^m P(y_i | \mathbf{x}_i; \mathbf{w})\\ & = \sum_{i = 1}^m {y_i} \log \sigma(\mathbf{x}_i \mathbf{w}) + (1 - y_i) \log (1 - \sigma(\mathbf{x}_i \mathbf{w})) \end{array} l(w)=logL(w)=logi=1mP(yixi;w)=i=1myilogσ(xiw)+(1yi)log(1σ(xiw))

平均损失:

  • L ( w ) L(\mathbf{w}) L(w), l ( w ) l(\mathbf{w}) l(w)越大越好;
  • l ( w ) l(\mathbf{w}) l(w)为负值;
  • 求相反数, 除以实例个数, 损失函数:

1 m ∑ i = 1 m − y i log ⁡ σ ( x i w ) − ( 1 − y i ) log ⁡ ( 1 − σ ( x i w ) ) . \frac{1}{m} \sum_{i = 1}^m - {y_i} \log \sigma(\mathbf{x}_i \mathbf{w}) - (1 - y_i) \log (1 - \sigma(\mathbf{x}_i \mathbf{w})). m1i=1myilogσ(xiw)(1yi)log(1σ(xiw)).

分析:

  • y i = 0 y_i = 0 yi=0 时退化为 − log ⁡ ( 1 − σ ( x i w ) ) - \log(1 - \sigma(\mathbf{x}_i \mathbf{w})) log(1σ(xiw)), σ ( x i w ) \sigma(\mathbf{x}_i \mathbf{w}) σ(xiw)越接近0越损失越小;
  • y i = 1 y_i = 1 yi=1 时退化为 − log ⁡ σ ( x i w ) - \log \sigma(\mathbf{x}_i \mathbf{w}) logσ(xiw), σ ( x i w ) \sigma(\mathbf{x}_i \mathbf{w}) σ(xiw)越接近1越损失越小。

优化目标:
min ⁡ w 1 m ∑ i = 1 m − y i log ⁡ σ ( x i w ) − ( 1 − y i ) log ⁡ ( 1 − σ ( x i w ) ) . \min_\mathbf{w} \frac{1}{m} \sum_{i = 1}^m - {y_i} \log \sigma(\mathbf{x}_i \mathbf{w}) - (1 - y_i) \log (1 - \sigma(\mathbf{x}_i \mathbf{w})). wminm1i=1myilogσ(xiw)(1yi)log(1σ(xiw)).

2.4 梯度下降法

梯度下降法是机器学习的一种主流优化方法
在这里插入图片描述
迭代式推导:
由于
l ( w ) = ∑ i = 1 m y i log ⁡ σ ( x i w ) + ( 1 − y i ) log ⁡ ( 1 − σ ( x i w ) ) l(\mathbf{w}) = \sum_{i = 1}^m y_i \log \sigma(\mathbf{x}_i \mathbf{w}) + (1 - y_i) \log (1 - \sigma(\mathbf{x}_i \mathbf{w})) l(w)=i=1myilogσ(xiw)+(1yi)log(1σ(xiw))
∂ l ( w ) ∂ w j = ∑ i = 1 m ( y i σ ( x i w ) − 1 − y i 1 − σ ( x i w ) ) ∂ σ ( x i w ) ∂ w j = ∑ i = 1 m ( y i σ ( x i w ) − 1 − y i 1 − σ ( x i w ) ) σ ( x i w ) ( 1 − σ ( x i w ) ) ∂ x i w ∂ w j = ∑ i = 1 m ( y i σ ( x i w ) − 1 − y i 1 − σ ( x i w ) ) σ ( x i w ) ( 1 − σ ( x i w ) ) x i j = ∑ i = 1 m ( y i − σ ( x i w ) ) x i j \begin{array}{ll} \frac{\partial l(\mathbf{w})}{\partial w_j} & = \sum_{i = 1}^m \left(\frac{y_i}{\sigma(\mathbf{x}_i \mathbf{w})} - \frac{1 - y_i}{1 - \sigma(\mathbf{x}_i \mathbf{w})}\right) \frac{\partial \sigma(\mathbf{x}_i \mathbf{w})}{\partial w_j}\\ & = \sum_{i = 1}^m \left(\frac{y_i}{\sigma(\mathbf{x}_i \mathbf{w})} - \frac{1 - y_i}{1 - \sigma(\mathbf{x}_i \mathbf{w})}\right) \sigma(\mathbf{x}_i \mathbf{w}) (1 - \sigma(\mathbf{x}_i \mathbf{w})) \frac{\partial \mathbf{x}_i \mathbf{w}}{\partial w_j}\\ & = \sum_{i = 1}^m \left(\frac{y_i}{\sigma(\mathbf{x}_i \mathbf{w})} - \frac{1 - y_i}{1 - \sigma(\mathbf{x}_i \mathbf{w})}\right) \sigma(\mathbf{x}_i \mathbf{w}) (1 - \sigma(\mathbf{x}_i \mathbf{w})) x_{ij}\\ & = \sum_{i = 1}^m (y_i - \sigma(\mathbf{x}_i \mathbf{w})) x_{ij} \end{array} wjl(w)=i=1m(σ(xiw)yi1σ(xiw)1yi)wjσ(xiw)=i=1m(σ(xiw)yi1σ(xiw)1yi)σ(xiw)(1σ(xiw))wjxiw=i=1m(σ(xiw)yi1σ(xiw)1yi)σ(xiw)(1σ(xiw))xij=i=1m(yiσ(xiw))xij

3 程序分析

3.1 Sigmoid函数

return 1.0/(1 + np.exp(-paraX))

3.2 使用sklearn

#Test my implemenation of Logistic regression and existing one.
import time, sklearn
import sklearn.datasets, sklearn.neighbors, sklearn.linear_model
import matplotlib.pyplot as plt
import numpy as np

"""
The version using sklearn,支持多个决策属性值
"""
def sklearnLogisticTest():
    #Step 1. Load the dataset
    tempDataset = sklearn.datasets.load_iris()
    x = tempDataset.data
    y = tempDataset.target

    #Step 2. Classify
    tempClassifier = sklearn.linear_model.LogisticRegression()
    tempStartTime = time.time()
    tempClassifier.fit(x, y)
    tempScore = tempClassifier.score(x, y)
    tempEndTime = time.time()
    tempRuntime = tempEndTime - tempStartTime

    #Step 3. Output
    print('sklearn score: {}, runtime = {}'.format(tempScore, tempRuntime))

"""
The sigmoid function, map to range (0, 1)
"""
def sigmoid(paraX):
    return 1.0/(1 + np.exp(-paraX))

"""
Illustrate the sigmoid function.
Not used in the learning process.
"""
def sigmoidPlotTest():
    xValue = np.linspace(-6, 6, 20)
    #print("xValue = ", xValue)
    yValue = sigmoid(xValue)
    x2Value = np.linspace(-60, 60, 120)
    y2Value = sigmoid(x2Value)
    fig = plt.figure()
    ax1 = fig.add_subplot(2, 1, 1)
    ax1.plot(xValue, yValue)
    ax1.set_xlabel('x')
    ax1.set_ylabel('sigmoid(x)')
    ax2 = fig.add_subplot(2, 1, 2)
    ax2.plot(x2Value, y2Value)
    ax2.set_xlabel('x')
    ax2.set_ylabel('sigmoid(x)')
    plt.show()

"""
函数:梯度上升算法,核心
"""
def gradAscent(dataMat,labelMat):
    dataSet = np.mat(dataMat)                          # m*n
    labelSet = np.mat(labelMat).transpose()            # 1*m->m*1
    m, n = np.shape(dataSet)                            # m*n: m个样本,n个特征
    alpha = 0.001                                      # 学习步长
    maxCycles = 1000                                    # 最大迭代次数
    weights = np.ones( (n,1) )
    for i in range(maxCycles):
        y = sigmoid(dataSet * weights)                 # 预测值
        error = labelSet - y
        weights = weights + alpha * dataSet.transpose() * error
    return weights

"""
函数:画出决策边界,仅为演示用,且仅支持两个条件属性的数据
"""
def plotBestFit(paraWeights):
    dataMat, labelMat = loadDataSet()
    dataArr=np.array(dataMat)
    m,n=np.shape(dataArr)
    x1=[]           #x1,y1:类别为1的特征
    x2=[]           #x2,y2:类别为2的特征
    y1=[]
    y2=[]
    for i in range(m):
        if (labelMat[i])==1:
            x1.append(dataArr[i,1])
            y1.append(dataArr[i,2])
        else:
            x2.append(dataArr[i,1])
            y2.append(dataArr[i,2])

    fig=plt.figure()
    ax=fig.add_subplot(111)
    ax.scatter(x1,y1,s=30,c='red',marker='s')
    ax.scatter(x2,y2,s=30,c='green')

    #画出拟合直线
    x=np.arange(3, 7.0, 0.1)
    y=(-paraWeights[0]-paraWeights[1]*x)/paraWeights[2]    #直线满足关系:0=w0*1.0+w1*x1+w2*x2
    ax.plot(x,y)
 
    plt.xlabel('a1')
    plt.ylabel('a2')
    plt.show()

"""
读数据, csv格式
"""
def loadDataSet(paraFilename="data/iris2class.txt"):
    dataMat=[]  #列表list
    labelMat=[]
    txt=open(paraFilename)
    for line in txt.readlines():
        tempValuesStringArray = np.array(line.replace("\n", "").split(','))
        tempValues = [float(tempValue) for tempValue in tempValuesStringArray]
        tempArray = [1.0] + [tempValue for tempValue in tempValues]
        tempx = tempArray[:-1] #不要最后一列
        tempy = tempArray[-1] #仅最后一列
        
        dataMat.append(tempx)
        labelMat.append(tempy)
        
    #print("dataMat = ", dataMat)
    #print("labelMat = ", labelMat)
    return dataMat,labelMat

"""
Logistic regression分类
"""
def mfLogisticClassifierTest():
    #Step 1. Load the dataset and initialize
    #如果括号内不写数据,则使用4个属性前2个类别的iris
    x, y = loadDataSet("data/iris2condition2class.csv")
    
    #tempDataset = sklearn.datasets.load_iris()
    #x = tempDataset.data
    #y = tempDataset.target

    tempStartTime = time.time()
    tempScore = 0
    numInstances = len(y)
    #Step 2. Train
    weights = gradAscent(x, y)

    #Step 2. Classify
    tempPredicts = np.zeros((numInstances))

    #Leave one out
    for i in range(numInstances):
        tempPrediction = x[i] * weights
        #print("x[i] = {}, weights = {}, tempPrediction = {}".format(x[i], weights, tempPrediction))
        if tempPrediction > 0:
            tempPredicts[i] = 1
        else:
            tempPredicts[i] = 0

    #Step 3. Which are correct?
    tempCorrect = 0
    for i in range(numInstances):
        if tempPredicts[i] == y[i]:
            tempCorrect += 1

    tempScore = tempCorrect / numInstances
    
    tempEndTime = time.time()
    tempRuntime = tempEndTime - tempStartTime

    #Step 4. Output
    print('Mf logistic socre: {}, runtime = {}'.format(tempScore, tempRuntime))

    #Step 5. Illustrate 仅对两个属性情况有效
    rowWeights = np.transpose(weights).A[0]
    plotBestFit(rowWeights)
    
def main():
    #sklearnLogisticTest()
    mfLogisticClassifierTest()
    #sigmoidPlotTest()

main()

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

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

相关文章

一个容易被忽视的标签 —— iframe

前言 甲问&#xff1a;说说你知道的HTML标签。 乙于是说了一大堆标签&#xff0c;比如div&#xff0c;span等等。 甲说&#xff1a;那你知道 iframe 标签吗&#xff1f; 乙这时候迟疑了片刻&#xff0c;缓缓说出&#xff1a;知道它&#xff0c;但是不太了解这个标签。 HTM…

学到了,原来华为是这样判断MES系统的好坏的

可以想象华为公司对供应商的要求是多么严格&#xff0c;那么我们今天来谈一下华为对供应商工厂MES系统这块的要求&#xff0c;这要从生产防错系统、品质管控系统、品质追溯系统、出货防错系统四个方面来说。一、生产物料和生产治具防错系统建立完整的物料和治具标签方案&#x…

常用的数据脱敏(手机、邮箱、身份证号)

一、什么是数据脱敏 先来看看什么是数据脱敏&#xff1f;数据脱敏也叫数据的去隐私化&#xff0c;在我们给定脱敏规则和策略的情况下&#xff0c;对敏感数据比如 手机号、银行卡号 等信息&#xff0c;进行转换或者修改的一种技术手段&#xff0c;防止敏感数据直接在不可靠的环境…

AcWing3485. 最大异或和

先看题目&#xff1a; 说实话&#xff0c;我看到这道题就想用滑动窗口&#xff0c;但是滑了一下发现不太对啊&#xff0c;如果我用滑动窗口的话&#xff0c;那么最后肯定是一个固定长度为m的窗口在持续计算&#xff0c;区间长度小于m的区间的异或和肯定会被遗漏。然后我就想怎么…

vue前端架构说明书模板示例

目录 1. 技术说明... 2 1.1 版本明细... 2 1.2 核心技术介绍... 2 2. 项目结构说明... 3 3. 自动化部署设置说明... 5 4. 打包及运行说明... 5 5. 导包说明... 6 5.1 方案一... 6 5.2 方案二... 7 5.3 补充说明... 7 6. 修改本地运行时链接的服务器说明... 7 7. 常…

从 B 站出发,用 Chrome devTools performance 分析页面如何渲染

页面是如何渲染的&#xff1f;通常会得到“解析 HTML、css 合成 Render Tree&#xff0c;就可以渲染了”的回答。但是具体都做了些什么&#xff0c;却很少有人细说&#xff0c;我们今天就从 Chrome 的性能工具开始&#xff0c;具体看看一个页面是如何进行渲染的&#xff0c;以及…

视频传输协议详解(RTMP、RTSP、HLS)

RTMP——Real Time Messaging Protocol&#xff08;实时消息传输协议&#xff09;RTMP是由Adobe公司提出的&#xff0c;在互联网TCP/IP五层体系结构中应用层&#xff0c;RTMP协议是基于TCP协议的&#xff0c;也就是说RTMP实际上是使用TCP作为传输协议。TCP协议在处在传输层&…

sql学习一

文章目录一、if 语句二、去重问题三、concat,upper,lower四、group_concat五、like 模糊匹配六、union和union all七、流程控制语句case八、limit一、if 语句 if(expr1, expr2, expr3)当expr1的值为真时函数的返回值为expr2&#xff0c;当expr1的值为假时&#xff0c;函数的返…

安装redis并设置开机自启动允许远程链接

一、进入/usr/local目录下面&#xff1b;下载redis包wget https://download.redis.io/releases/redis-5.0.14.tar.gz二、安装gccyum install gcc-c三、解压、进入目录、编译tar -xvf redis-5.0.14.tar.gzcd redis-5.0.14make ##如果报错zmalloc.h:50:31: 致命错误&#xff1a;j…

打破单片机开发模式--胶水语言(JavaScript)

概述 传统的嵌入式单片机开发基本上形式如下图&#xff1a; 该流程对于功能单一或者功能变更极少的场景是比较友好的&#xff0c;但是对于设备应用层变更比较多或者公板方案开发应用的场景&#xff0c;上述场景显的有些累赘。那么有什么方式可以解决呢&#xff1f;&#xff1f…

U-Boot 之七 详解 Driver Model 架构、配置、命令、初始化流程

U-Boot 在 2014 年 4 月参考 Linux Kernel 的驱动模型设计并引入了自己的 Driver Model&#xff08;官方简称 DM&#xff09; 驱动架构。这个驱动模型&#xff08;DM&#xff09;为驱动的定义和访问接口提供了统一的方法&#xff0c;提高了驱动之间的兼容性以及访问的标准性。 …

和月薪3W的聊过后,才知道自己一直在打杂...

前几天和一个朋友聊面试&#xff0c;他说上个月同时拿到了腾讯和阿里的offer&#xff0c;最后选择了阿里。 我了解了下他的面试过程&#xff0c;就一点&#xff0c;不管是阿里还是腾讯的面试&#xff0c;这个级别的程序员&#xff0c;都会考察项目管理能力&#xff0c;并且权重…

[牛客网] HJ35 蛇形矩阵(写了好久才写出来)

链接https://www.nowcoder.com/practice/649b210ef44446e3b1cd1be6fa4cab5e?tpId37&tqId21258&rp1&ru/exam/oj/ta&qru/exam/oj/ta&sourceUrl%2Fexam%2Foj%2Fta%3Fdifficulty%3D2%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26type%3D37&dif…

区块链行业遭供应链攻击,上万加密钱包被“抄底”损失上亿美元

当地时间8月2日晚间&#xff0c; 区块链行业遭遇了一次行业重创 。据科技媒体TechCrunch报道&#xff0c; 若干名攻击者“抄底”了上万个加密钱包&#xff0c;钱包内有价值上亿美元的代币。 据了解遭受攻击的加密钱包包括Phantom、Slope和TrustWallet等。涉及到的币种除了SOL、…

Vue2的tsx开发入门完全指南

本篇文章尽量不遗漏重要环节&#xff0c;本着真正分享的心态&#xff0c;不做标题党 下面进入正题&#xff1a; 由于现在vue的官方脚手架已经非常完善我们就不单独配置webpack了&#xff0c;节省大量的时间成本。 首先使用vue/cli创建一个vue模版项目&#xff08;记得是vue/…

Dockerfile详解

一、能干嘛&#xff1f; 我们总会遇到下面这种情况&#xff1a;使用docker pull 拉取下来的镜像发现其提供的功能并不完善&#xff0c;比如拉下来个centos的镜像&#xff0c;运行该镜像生成容器发现连vim&#xff0c;ifconfig命令都没有&#xff01;想要在该镜像的基础上扩充其…

[SQL]增删查改语法概览

数据定义 基本概念 基本表 本身独立存在的表SQL中一个关系就对应一个基本表一个(或多个)基本表对应一个存储文件一个表可以带若干索引 存储文件 物理结构对用户透明索引存放在存储文件中 视图 从一个或几个基本表导出的表数据库中至存放数据的定义而不存放视图对应的数据视…

Moonlight iPad全屏无边框串流方法

环境&#xff1a;iPad MoonLight 串流PC 问题&#xff1a;iPad无法全屏&#xff0c;有边框 解决办法&#xff1a;将电脑分辨率和MoonLight自定义分辨率调整为iPad原始分辨率 背景&#xff1a;在使用iPad进行MoonLight串流PC游戏时&#xff0c;发现客户端不论如何设定iPad都有边…

SQL函数

SQL函数 DATE_SUB()函数 1.1函数语法定义 1.2函数实际应用&#xff1a; 语法: 获取当前日期&#xff1a;select curdate()获取当前日期前一天&#xff1a;select date_sub(curdate(),interval 1 day)获取当前日期后一天&#xff1a;select date_sub(curdate(),interval -1 …

mysql(一) 使用注意事项及优化

初学mysql的时候、写了一份 "什么是CRUD&#xff1f; CRUD的操作" 的文章&#xff08;18年的&#xff09; 我开心看到有朋友经常在下面讨论一些问题、 但是以现在&#xff08;今天 23年&#xff09;回头看觉得 那些只是入门需要知道和掌握的、也刚好最近不是很忙 所…