02-18 周六 图解机器学习之SMV 第五章5-2

news2025/2/27 13:17:28
02-18 周六 图解机器学习之SMV 第五章5-2
时间版本修改人描述
2023年2月18日11:47:18V0.1宋全恒新建文档

环境

 程序的基本环境,是使用了jupyter,在容器中运行的。

简介

 本程序主要演示支持向量的获取,支持向量是距离超平面最近的点组成的。程序的主要作用是将超平面和支持向量都绘制在同一个图上。

#%程序5-2名称:sklearnsupportvectors.py
from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
X, y = make_blobs(n_samples=50, centers=2,random_state=0, cluster_std=0.60)

clf = SVC(kernel='linear')
clf.fit(X, y)

def plot_svc_decision_function(clf, ax=None):
    """Plot the decision function for a 2D SVC"""
    if ax is None:
        ax = plt.gca()
    x = np.linspace(plt.xlim()[0], plt.xlim()[1], 30)
    y = np.linspace(plt.ylim()[0], plt.ylim()[1], 30)
    Y, X = np.meshgrid(y, x)
    P = np.zeros_like(X)
    for i, xi in enumerate(x):
        for j, yj in enumerate(y):
            P[i, j] = clf.decision_function([[xi, yj]])
    # plot the margins
    ax.contour(X, Y, P, colors='k',
               levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='spring')
plot_svc_decision_function(clf)
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
            s=200, facecolors='none');
plt.show()

程序解读

数据生成

from sklearn.datasets import make_blobs
from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
X, y = make_blobs(n_samples=50, centers=2,random_state=0, cluster_std=0.60)

数据生成,生成的样本数一共50个,中心为2。因为make_blobs默认的参数n_features为2,因此一共有两个特征。

拟合数据

 SVM用于分类和回归,目的是找到一个超平面,使得离超平面最近的点都有很大的距离,max(最小距离)。

clf = SVC(kernel='linear')
clf.fit(X, y)

这是重点

clf.support_vectors_[:, 0], clf.support_vectors_[:, 1]这两是支持向量

根据官方code.py,核必须是{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’}之一,或是自定义的。

核函数的选择:

1、特征数量大,和样本数量差不多:此时选LR或者线性核SVM

2、特征数量少,样本数量正常:高斯核

3、特征数量小,样本数量大:手动添加特征变为第一种情况

 在本小节生成的程序中,特征数量为2,样本数量为50。差不多一个量级。而且生成的数据是线性可分的。

在这里插入图片描述

 可以这么理解, 在经过SVM之后,所有与职场向量机相关的数据均封装在了clf对象中了。上述我们打印了clf的支持向量,可以看到一共有三个点是支持向量

函数定义

def plot_svc_decision_function(clf, ax=None):
    """Plot the decision function for a 2D SVC"""
    if ax is None:
        ax = plt.gca()
    x = np.linspace(plt.xlim()[0], plt.xlim()[1], 30)
    y = np.linspace(plt.ylim()[0], plt.ylim()[1], 30)
    Y, X = np.meshgrid(y, x)
    P = np.zeros_like(X)
    for i, xi in enumerate(x):
        for j, yj in enumerate(y):
            P[i, j] = clf.decision_function([[xi, yj]])
    # plot the margins
    ax.contour(X, Y, P, colors='k',
               levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])

 可以看到,在函数定义中传入的参数为clf,classifier的简写。

plt.gca 进行坐标轴的移动

 上述在参数中,包含一个ax参数,并且先进行了初始化,意思就是说ax可以由外界传入,如果不传入,我会初始化一个。‘

利用plt.gca进行坐标轴支柱的移动。

img

 上图中,用红色标识出的黑色边界框线在Matplotlib中被称为spines,中文翻译为脊柱…在我理解看来,意思是这些边界框线是坐标轴区域的“支柱”

那么,我们最终要挪动的其实就是这四个“支柱”

 且所有的操作均在plt.gca( )中完成,gca就是get current axes的意思

import matplotlib.pyplot as plt

# 这里建立的画布大小是5*5的,并不是坐标轴范围,使用“十字按钮”拖动你就懂了!
plt.figure(figsize = (5,5))
plt.plot()  # 画个只有坐标系的图(因为没有传参数,所以显示空白)

ax = plt.gca()

# 获取你想要挪动的坐标轴,这里只有顶部、底部、左、右四个方向参数
ax.xaxis.set_ticks_position('bottom')  #  要挪动底部的X轴,所以先目光锁定底部!

# 在这里,position位置参数有三种,这里用到了“按Y轴刻度位置挪动”
# 'data'表示按数值挪动,其后数字代表挪动到Y轴的刻度值
ax.spines['bottom'].set_position(('data',0))

plt.show()

img

主要用于进行坐标轴四个支柱的移动。

xlim和ylim

plt.xlim() 显示的是x轴的作图范围,同时plt.ylim() 显示的是y轴的作图范围,而 plt.xticks() 表达的是x轴的刻度内容的范围

在这里插入图片描述

可以看出,无参数的xlim默认的范围为从0.01到1.0,通过修改参数进行控制

在这里插入图片描述

np.linespace生成等差数列

def linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None):

生成指定范围内指定个数的一维数组

1.在指定的间隔[“start”,“stop”]内均匀地返回数字。
2.返回“num”个等间距的样本。
3.endpoint是一个bool类型的值,如果为"Ture",“stop"是最后一个值,如果为"False”,生成的数组不会包含"stop"值
4.retstep是一个bool类型的值,如果为"Ture",会返回样本之间的间隙。

在这里插入图片描述

np.meshgrid(y, x) 用于生成网格矩阵

np.meshgrid(y, x)

X, Y = np.meshgrid(x, y) 代表的是将x中每一个数据和y中每一个数据组合生成很多点,然后将这些点的x坐标放入到X中,y坐标放入Y中,并且相应位置是对应的

    nx,ny = (3,2)
    #从0开始到1结束,返回一个numpy数组,nx代表数组中元素的个数
    x = np.linspace(0,1,nx)
    #[ 0.   0.5  1. ]
    y = np.linspace(0,1,ny)
    # [0.  1.]
    xv,yv = np.meshgrid(x,y)
    '''
    xv
    [[ 0.   0.5  1. ]
     [ 0.   0.5  1. ]]
     yv
     [[ 0.  0.  0.]
      [ 1.  1.  1.]]
    '''

 通过上面的例子,其实可以发现meshgrid函数将两个输入的数组x和y进行扩展,前一个的扩展与后一个有关,后一个的扩展与前一个有关,**前一个是竖向扩展,后一个是横向扩展。**因为,y的大小为2,所以x竖向扩展为原来的两倍,而x的大小为3,所以y横向扩展为原来的3倍。通过meshgrid函数之后,输入由原来的数组变成了一个矩阵。通过使用meshgrid函数,可以产生一个表格矩阵

在这里插入图片描述

注: meshgrid不仅可以用来生成二维网格,还可以用来生成三维网格。

 参见meshgrid生成网格

np.zeros_like(X)

 主要用于生成0数组,形状与x相同。

numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)[source]

Return an array of zeros with the same shape and type as a given array.
a:array_like

The shape and data-type of a define these same attributes of the returned array.

dtype:data-type, optional

Overrides the data type of the result.

New in version 1.6.0.

order:{‘C’, ‘F’, ‘A’, or ‘K’}, optional

Overrides the memory layout of the result. ‘C’ means C-order, ‘F’ means F-order, ‘A’ means ‘F’ if a is Fortran contiguous, ‘C’ otherwise. ‘K’ means match the layout of a as closely as possible.

New in version 1.6.0.

subok:bool, optional.

If True, then the newly created array will use the sub-class type of ‘a’, otherwise it will be a base-class array. Defaults to True.

shape:int or sequence of ints, optional.

Overrides the shape of the result. If order=’K’ and the number of dimensions is unchanged, will try to keep order, otherwise, order=’C’ is implied.

演示理解:

>>> x = np.arange(6)
>>> x = x.reshape((2, 3))
>>> x
array([[0, 1, 2],
       [3, 4, 5]])
>>> np.zeros_like(x)
array([[0, 0, 0],
       [0, 0, 0]])
 
>>> y = np.arange(3, dtype=float)
>>> y
array([0., 1., 2.])
>>> np.zeros_like(y)
array([0.,  0.,  0.])

enumerate 枚举列表

enumerate在字典赏识枚举、列举的意思;
enumerate参数为可遍历/可迭代的对象(如列表、字符串);
enumerate多用于在for循环中得到计数,利用它可以同时获得索引和值,即需要 index 和 value 值的时候可以使用enumerate;
enumerate()返回的是一个enumerate对象 。

s = [1, 2, 3, 4, 5]
e = enumerate(s)
print(e)
# <enumerate object at 0x0000028246E94C28>

示例: 索引从0开始。

s = [1, 2, 3, 4, 5]
x = enumerate(s)
for index,value in x:
    print("%s,%s"%(index,value))
    
# 0,1
# 1,2
# 2,3
# 3,4
# 4,5

示例: 索引从1开始

s = [1, 2, 3, 4, 5]
# 索引从1开始
for index,value in enumerate(s, 1):
    print("%s,%s" %(index,value))

# 1,1
# 2,2
# 3,3
# 4,4
# 5,5

示例: 将一组字典列表中的某一对字典元素与另一组字典列表中某一对字典元素组成一组新的字典列表

notes = [{'id': '11111111111', 'content': 'lalallalalalallala'}, {'id': '2222222222222', 'content': 'qqqqqqqqqqqqqqqqqqq'}, {'id': '33333333333333333', 'content': 'aaaaaaaaaaaaaaaaa'}]
ids = [one_note["id"] for one_note in notes]
contents = [one_note["content"] for one_note in notes]
print(type(ids)) # <class 'list'>
print(ids)  
# ['11111111111', '2222222222222', '33333333333333333']
print(type(contents)) # <class 'list'>
print(contents) 
# ['lalallalalalallala', 'qqqqqqqqqqqqqqqqqqq', 'aaaaaaaaaaaaaaaaa']
result = [{'id': '11111111111', 'label': 'positive'}, {'id': '2222222222222', 'label': 'positive'}, {'id': '33333333333333333', 'label': 'negative'}]
finally_result = [{"id": ids[index], "label": label["label"]} for index,label in enumerate(result)]
print(type(finally_result)) # <class 'list'>
print(finally_result)
# [{'id': '11111111111', 'label': 'positive'}, {'id': '2222222222222', 'label': 'positive'}, {'id': '33333333333333333', 'label': 'negative'}]

注: index, label in enumerate(result),其中每次index为序号0,lable,为每个字典。

在这里插入图片描述

clf.decision_function()

在这里插入图片描述

def plot_svc_decision_function(clf, ax=None):
    """Plot the decision function for a 2D SVC"""
    if ax is None:
        ax = plt.gca()
    x = np.linspace(plt.xlim()[0], plt.xlim()[1], 30)
    y = np.linspace(plt.ylim()[0], plt.ylim()[1], 30)
    Y, X = np.meshgrid(y, x)
    P = np.zeros_like(X)
    for i, xi in enumerate(x):
        for j, yj in enumerate(y):
            P[i, j] = clf.decision_function([[xi, yj]])
    # plot the margins
    ax.contour(X, Y, P, colors='k',
               levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])

 没看懂,参见 scikit-learn工具包中分类模型predict_proba、predict、decision_function用法详解

  • classes_属性按顺序保存着训练样本的类别标记。
  • predict_proba: 模型预测输入样本属于每种类别的概率,概率和为1,每个位置的概率分别对应classes_中对应位置的类别标签。以上述类别标签为[2 4 6 8]的那个分类器为例,查看一下分类模型预测的概率。img

 输入的[-1, -1]刚好是训练分类器时使用的数据,训练数据中[-1, -1]属于类别6,在predict_proba输出概率中,最大概率值出现在第三个位置上,第三个位置对应的classes_类别刚好也是类别6。这也就是说,predict_proba输出概率最大值索引位置对应的classes_元素就是样本所属的类别。下面就来看一下predict的预测结果与predict_proba的预测结果是否一致。

  • predict:模型预测输入样本所述的类别,是则输出1,不是则输出0.

在上一步中知道了predict_proba是输出样本属于各个类别的概率,且取概率最大的类别作为样本的预测结果,下面看一下predict的预测结果与predict_proba的最大值是否一致。

img

predict的预测结果为类别6,对应于classes_中的第三个元素,也同时对应于predict_proba中的第三个元素,且是概率值最大的元素

  • decision_functinon

The confidence score for a sample is the signed distance of that sample to the hyperplane.

img

 说了两件事情,其一是说评估样本X的的decision_function(等于没说,哈哈哈),其二是说,如果decision_dunction_shape**=‘ovr’,则输出的decison_function形状是(n_samples, n_classes)**, n_samples是输入样本的数量,n_classes是训练样本的类别数。这里再补充一点,如果decision_dunction_shape='ovo,则输出的decison_function形状是(n_samples, n_classes * (n_classes - 1) / 2)。‘ovr’和‘ovo’又是啥?莫急,莫急。暂且知道是用于训练多分类的就行。

大致解释下decison_function就是用来衡量待预测样本到分类模型各个分隔超平面的距离(没找到太直观的解释方法)。

 我们常见的分类器,比如LR和SVM都是只能支持二分类的,回想一下LR分类器,通过判断线性模型的预测结果是否大于0,进而判断sigmoid的输出结果是否大于0.5来判断模型属于正类还是负类。SVM也一样,前面讲了,SVM通过分隔超平面将样本分到两边去,也就是进行二分类。那么怎么能将二分类的分类算法应用到多分类任务上去呢?这就是‘ovr’和‘ovo’要解决的问题。

  • ‘ovr’:全称是One-vs-Rest。就是一个人和对面一群人干一次架(群殴)。假如我们训练数据中包含[0, 1, 2, 3]四个分类,那么分别将0, 1, 2, 3作为正样本,其余的123, 023, 013, 012作为负样本(理解: 分解就是0为正类,123为负类,1为正类,023为负类依次类推。),训练4个分类器每个分类器预测的结果表示属于对应正类也就是0, 1, 2, 3 的概率。这样对于一个输入样本就相当于要进行4个二分类然后取输出结果最大的数值对应的classes_类别。

  • ‘ovo’:全称是One-vs-One。就是一个人分别和对面的每个人干一次架(单挑,车轮战术)。同样,假如我们训练数据中包含[0, 1, 2, 3]四个分类先将类别0作为正样本,类别1,类别2,类别3依次作为负样本训练3个分类器(理解: 0为正,1,2,3为负,训练3个分类器),然后以类别1为正样本,类别0,类别2, 类别3作为负样本训练3个分类器,以此类推。由于类别0为正样本,类别1为负样本和类别1为正样本、类别0为负样本实质上是一样的,所以不需要重复训练

注: 对于ovr不再过多解释,容易理解。

对于ovo,做二分类,0,正, 1, 2, 3 负类,这样就是3种情况即01, 02, 03

1正, 0, 2,3为负 又是三种情况(0正1负和0负1正,样本实际是一样的,不再重复训练)。 12, 13

2正, 0,1,2负, 则情况为23.

一共1+2+3 = (4*3)/2

 通过上面的描述可知,假如训练样本有n_classes个类别则’ovr’模式需要训练n_classes个分类器,‘ovo’模式需要训练n_classes * (n_classes - 1) / 2 个分类器。那么问题来了,有多少个分类器是不是就得有多少个分隔超平面有多少个分隔超平面是不是就得有多少个decision_function值。这也就对应了“他是谁?”那部分所说的decison_function输出形状的描述。

二分类的decision_function

二分类模型中,decision_function返回的数组形状等于样本个数,也就是一个样本返回一个decision_function值。

import numpy as np
from sklearn.svm import SVC
 
x = np.array([[1,2,3],
                    [1,3,4],
                    [2,1,2],
                    [4,5,6],
                    [3,5,3],
                    [1,7,2]])
 
y = np.array([3, 3, 3, 2, 2, 2])
 
clf = SVC(probability=True)
clf.fit(x, y)
print(clf.decision_function(x))
 
# 返回array([2, 3]),其中2为negetive,3为positive
print(clf.classes_)

img

 还记得前面讲过的decision_function是有符号的吧,大于0表示正样本的可信度大于负样本,否则可信度小于负样本。所以对于前3个样本,decison_function都认为是正样本的可信度高,后3个样本是负样本的可信度高。那么再看一下predict的结果,前3个预测为正样本3(ps:二分类情况下正样本对应的是classes_中的第二个类别),后3个样本预测为负样本2。再看一下predict_proba预测的样本所属的类别概率,可以看到前3个样本属于类别3的概率更大,后3个样本属于类别2的概率更大。

多分类的decision_function

 多分类模型中,decision_function返回的数组形状依据使用的模式是**‘ovr’还是‘ovo’**而分别返回n_classes个和n_classes * (n_classes - 1) / 2个数值。

ovr
import matplotlib.pyplot as plt
import numpy as np
from sklearn.svm import SVC
# 样本
X = np.array(
    [
        [-1, -1],
        [-2, -1],
        [1, 1],
        [2, 1],
        [-1, 1],
        [-1, 2],
        [1, -1],
        [1, -2]
    ]
)
# 类别,一共四类
y = np.array([2, 2, 3, 3, 0, 0, 1, 1])
# SVC多分类模型默认采用ovr模式
clf = SVC(probability=True, decision_function_shape="ovr")
clf.fit(X, y)
 
# 计算样本距离每个分类边界的距离
# One-vs-One 按照decision_function的得分[01, 02, 03, 12, 13, 23]判断每个分类器的分类结果,然后进行投票
# One-vs-Rest 选择decision_function的得分[0-Rest, 1-Rest, 2-Rest, 3-Rest]最大的作为分类结果
print("decision_function:\n", clf.decision_function(X))
# precidt预测样本对应的标签类别
print("predict:\n", clf.predict(X))
# predict_proba 预测样本对应各个类别的概率
print("predict_proba:\n", clf.predict_proba(X)) #这个是得分,每个分类器的得分,取最大得分对应的类。
print("classes_:", clf.classes_)

 在Jupyter中输出如下:

在这里插入图片描述

img

在ovr场景下,decision_function输出的最大值对应的正样本类别就是decision_function认为置信度最高的预测类别

ovo

 在ovr代码中,只要把代码行

# SVC多分类模型默认采用ovr模式
clf = SVC(probability=True, decision_function_shape="ovo")
clf.fit(X, y)

 即可将分类器转换为ovo模式。

在这里插入图片描述

模型在训练集上的decision_function以及predict_procaba、predict结果如下:

img

ovo模式下,4个类别的训练数据,需要训练6个二分类器,得到6个decition_function值,依照classes_的类别顺序,6个二分类器分别是[01, 02, 03, 12, 13, 23],前面的数字表示正类,后面的表示负类。以decision_function的第一行输出结果为例:

-0.07609727 对应 01分类器,且数值小于0,则分类结果为后者,即类别1
-1.00023294 对应 02分类器,且数值小于0,则分类结果为后者,即类别2
0.27849207 对应 03分类器,且数值大于0,则分类结果为前者,即类别0
-0.834258626 对应 12分类器,且数值小于0,则分类结果为后者,即类别2
0.24756982 对应 13分类器,且数值大于0,则分类结果为前者,即类别1
1.00006256 对应 23分类器,且数值大于0,则分类结果为前者,即类别2

最终得票数:{类别0: 1, 类别1: 2, 类别2: 3, 类别3: 0}
对以上分类结果voting投票,多数获胜,即最终分类结果为类别2。

注: 要理解这个投票的机制,很重要。对于ovo模式,仅仅通过decision_function无法得出最终判定类别。

总结: 通过上面讲的这些大概也能得出decision_function、predict_procaba、predict之间的联系了:

decision_function:输出样本距离各个分类器的分隔超平面的置信度,并由此可以推算出predict的预测结果

predict_procaba:输出样本属于各个类别的概率值,并由此可以推算出predict的预测结果

predict:输出样本属于具体类别的预测结果

 还是以SVM分类器为例,SVM分类器有个参数用来控制是否输出预测样本的概率值,probability=True时SVM分类器具有predict_proba函数,可以输出样本的预测概率,但是当probability=False,SVM分类器没有predict_proba函数,也就没办法得到样本预测结果的置信度(简单理解为概率)。但是我们又知道,当我们想要计算分类器的性能时,常常需要用到ROC和AUC,ROC曲线表示分类器预测结果FPR和TPR的变化趋势,AUC表示ROC曲线以下的面积。也就是说,要想得到ROC和AUC,就需要得到一组FPR和TPR,FPR和TPR的计算通常是基于一组样本的预测置信度,分别选择不同的置信度阈值,得到一组FPR和TPR值,然后得到ROC曲线的。现在没有predict_proba就得不到样本预测的置信度。But,还记得我们前面解释decison_function时说过的,**decision_function表示通过度量样本距离分隔超平面距离的来表示置信度。**那么我们是不是可以使用decision_function的置信度来计算ROC呢?答案当然是可以的啦。

ax.contour 绘制等高线

 官方文档

contour(z);
contour(x,y,z)
contour(—,levels)
contour(—,ineSpec)
contour(—,Name,Value)
contour(ax,—)
M=contour(—)
[M,C]=contour(__)
contour(Z) 创建一个包含矩阵Z的等值线的等高线图,其中Z包含X-Y平面上的高度值。
contour(X,Y,Z) 指定Z中各值得X和Y坐标。
contour(—,levels) 将要显示得等高线指定为上述任一语法中得最后一个参数。将levels指定为标量n,以在n个自动选择的层级上显示等高线。要在某些特定高度绘制等高线,请将levels指定为单调递增值的向量。
contour(—,LineSpec) 指定等高线的线型和颜色。
contour(—,Name,Value) 使用一个或多个名称—值对组参数指定等高线图的其他选项。
contour(ax,—)在目标坐标区中显示等高线图。将坐标区指定为上述任一语法中的第一个参数。
M=contour(—)返回等高线矩阵M,其中包含每个层级的顶点的(X,Y)坐标。
[M,c]=contour(—)返回等高线矩阵和等高线对象c。显示等高线后使用c设置属性。

在这里插入图片描述

 参考Python Matplotlib.axes.Axes.contour()用法及代码示例

 函数功能:用来绘制等高线和决策边界

 参考matplotlib可视化之等高线图plt.contourf()与机器学习中绘制决策边界

 参考 网格理解

 matplotllib绘图,值得认真查看,有代码有图,对于熟悉matplot的库由许多帮助。

 记录linestyle和marker在这里插入图片描述
在这里插入图片描述

 contour理解

 python 等高线与等高线填充图 较为准确的。

contour函数用于绘制等高线和等高线之间的填充,等高线的理解就是对于一个函数,等高线就是假如有一个函数z=f(x,y),你在平面上所有的x,y取值都会对应一个z值,如果f是连续的,那么把z值相同的点(x,y)连接起来就会形成一条曲线,这就是这个z值的等高线。等高线的理解参见

 等高线

def plot_svc_decision_function(clf, ax=None):
    """Plot the decision function for a 2D SVC"""
    if ax is None:
        ax = plt.gca()
    x = np.linspace(plt.xlim()[0], plt.xlim()[1], 30)
    y = np.linspace(plt.ylim()[0], plt.ylim()[1], 30)
    Y, X = np.meshgrid(y, x)
    P = np.zeros_like(X)
    for i, xi in enumerate(x):
        for j, yj in enumerate(y):
            P[i, j] = clf.decision_function([[xi, yj]])
    # plot the margins
    ax.contour(X, Y, P, colors='k',
               levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])

 绘制等高线,levels表示要关注的高度值。linestyles则可以取值实线,点斜线,点线等。把levels修改为[-1, 0, 1, 2]则会出现四根线。

8.Matplotlib绘图–等高线

绘制散点图

 scatter文档参考

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='spring')
plot_svc_decision_function(clf)
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
            s=2000, facecolors='none');
plt.show()

在这里插入图片描述

 从上图中可以看出,c用于表示点的颜色。在进行支持向量的绘制的时候,描述了所有的点。

在这里插入图片描述

 因此,我觉得在绘制等高线时,matplot应该是对网格内进行了插值,插入了许多点来进行绘制等高线。网格仅用来圈定散点的范围。二维上的许多特征点,也可以理解在高纬空间中,只不过恰好在同一个平面上而已。绘制散点图的工作就不做进一步分析了,因为之前已经总结过了。

总结

 图解机器学习这个书呢,自己也是痛苦了许久,因为情绪也不怎么好吧,所以自我提升也一直没有不愿意开展。刚刚完成了对于甘地自传的阅读,接下来就是希望3月份能完成这本《图解机器学习》的阅读。

 本文中对于ovo和ovr的理解还是很重要的。发现虽然是尝试理解机器学习,但是好像都是在熟悉sklearn和matplot,画图和机器学习,算法也都封装好了。先会用再说吧。

 参考支持向量机代码实现_sklearn实现支持向量机

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

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

相关文章

django+celery+ RabbitMQ自定义多个消息队列

关于django celery的使用网上有很多文章&#xff0c;本文就不多做更多的说明。 本文使用版本 python3.8.15 Django3.2.4 celery5.2.7celery.py from __future__ import absolute_import, unicode_literals import os from celery import Celery from kombu import Exchange, …

XC7K70T-1FBG484C, XC7A50T-1CSG324I FPGA,Kintex-7 285 I/O

说明Kintex-7 FPGA为快速增长应用和无线通信提供最优性价比和低功耗。Kintex-7 FPGA具有卓越的性能和连接性&#xff0c;与前一代相比&#xff0c;优化了最佳性价比&#xff0c;提高了2倍&#xff0c;实现了新一类fpga。Kintex-7内置支持8通道PCI Express (Gen1/Gen2)&#xff…

RPC框架dubbo的学习

一、基础知识 1、分布式基础理论 1.1&#xff09;、什么是分布式系统&#xff1f; 《分布式系统原理与范型》定义&#xff1a; “分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统” 分布式系统&#xff08;distributed system&#…

Linux驱动开发—设备树开发详解

设备树开发详解 设备树概念 Device Tree是一种描述硬件的数据结构&#xff0c;以便于操作系统的内核可以管理和使用这些硬件&#xff0c;包括CPU或CPU&#xff0c;内存&#xff0c;总线和其他一些外设。 Linux内核从3.x版本之后开始支持使用设备树&#xff0c;可以实现驱动代…

Vue3后台管理系统(四)SVG图标

目录 一、安装 vite-plugin-svg-icons 二、创建图标文件夹 三、main.ts 引入注册脚本 四、vite.config.ts 插件配置 五、TypeScript支持 六、组件封装 七、使用 Element Plus 图标库往往满足不了实际开发需求&#xff0c;可以引用和使用第三方例如 iconfont 的图标&…

Java数组,超详细整理,适合新手入门

目录 一、什么是Java中的数组&#xff1f; 二、数组有哪些常见的操作&#xff1f; 三、数组的五种赋值方法和使用方法 声明数组 声明数组并且分配空间 声明数组同时赋值(1) 声明数组同时赋值(2) 从控制台输入向数组赋值 四、求总和平均 五、求数组中最大值最小值 六…

leetcode.1326 灌溉花园的最少水龙头数目 - 贪心

1326. 灌溉花园的最少水龙头数目 题目&#xff1a; 思路&#xff1a; 注意&#xff1a;「整个花园」包含不是整点的位置&#xff0c;例如 0.5 这种小数位置也要被灌溉到 对于所有能覆盖某个左端点的水龙头&#xff0c;选择能覆盖到最远右端点的水龙头是最优解 比较像【搭桥】的…

ArcGIS批量拼接大量栅格遥感影像:Mosaic工具

本文介绍在ArcGIS下属的ArcMap软件中&#xff0c;基于Mosaic工具&#xff0c;批量对大量栅格遥感影像文件加以拼接、镶嵌的方法。 在GIS应用中&#xff0c;我们时常需要对大量栅格遥感影像数据加以批量拼接的工作。这一步骤可以基于Python语言实现&#xff0c;具体可以参考文章…

HIVE 基础(三)

目录 建表语句 表数据 Hive建表高阶语句 - CTAS and WITH CTAS – as select方式建表 CTE (CTAS with Common Table Expression) LIKE 创建临时表 清空表数据 修改表&#xff08;Alter针对元数据&#xff09; 改名 修正表文件格式 修改列名 添加列 替换列 动态分…

如何在面试中介绍自己的项目,才能让软件测试面试官无可挑剔,

四、项目 4.1 简单介绍下最近做过的项目 根据自己的项目整理完成&#xff0c;要点&#xff1a; 1&#xff09;项目背景、业务、需求、核心业务的流程 2&#xff09;项目架构&#xff0c;B/S还是C/5&#xff0c;数据库用的什么? 中间件用的什么&#xff1f;后台什么语言开发…

使用统一返回响应,出现String类型转换失败的问题

使用统一返回响应&#xff0c;出现String类型转换失败的问题问题描述解决方案1、替换fastjson转换器2、在统一响应中&#xff0c;对String类型特殊处理3、加入Jackson转换器解决&#xff08;同时可关闭Zalando的堆栈打印&#xff09;问题描述 在对项目框架进行升级处理的时候&…

数据存储(整型数据存储)

目录 一、 数据类型详细介绍 1.类型的基本归类 二、 整形在内存中的存储 1.原码、反码、补码 对于整形来说&#xff1a;数据存放内存中其实存放的是补码。 三、大小端字节序介绍及判断 1、大端小端&#xff1a; 2、写出一个判断大小端的程序 四、练习整型存储 8个练习…

基于微信公众号(服务号)实现扫码自动登录系统功能

微信提供了两种方法都可以实现扫描登录。 一种是基于微信公众平台的扫码登录&#xff0c;另一种是基于微信开放平台的扫码登录。 两者的区别: 微信开放平台需要企业认证才能注册&#xff08;认证费用300元&#xff0c;只需要认证1次&#xff0c;后续不再需要进行缴费年审&#…

Python制作9行最简单音乐播放器?不,我不满足

嗨害大家好鸭~我是小熊猫 好久不见啦~这次就来给大家整个大福利 ~ 源码资料电子书:点击此处跳转文末名片获取 最简单的9行代码音乐播放器如下&#xff1a; import time import pygamefile r歌曲路径 pygame.mixer.init() print(正在播放,file) track pygame.mixer.music.lo…

遗传算法及Python实现

0 建议学时 4学时 1 人工智能概述 2020中国人工智能产业年会在苏州召开&#xff0c;会上发布的《中国人工智能发展报告2020》显示&#xff0c;过去十年(2011-2020) &#xff0c;中国人工智能专利申请量达389571件&#xff0c;占全球总量的74.7%&#xff0c;位居世界第一。 报…

Power BI 数据处理介绍(数据初始调整、合并列及查看数据结构)

本系列的文章&#xff1a; 安装流程和示例介绍&#xff1a; 《Power BI windows下载安装流程&#xff09;》《Power BI 11个必学官方示例数据案例&#xff08;附下载链接&#xff09;》 数据导入阶段介绍&#xff1a; 《Power BI 数据导入&#xff08;SQL Server、MySQL、网页…

1802908-00-4,Dde Biotin-PEG4-alkyne,炔烃PEG4生物素Dde

Dde Biotin-PEG4-alkyne&#xff0c;Alkyne-PEG4-Biotin Dde&#xff0c;Dde 生物素-PEG4-炔烃&#xff0c;Dde 生物素PEG4炔基&#xff0c;炔烃PEG4生物素DdeProduct structure&#xff1a;Product specifications&#xff1a;1.CAS No&#xff1a;1802908-00-42.Molecular fo…

leetcode 540. Single Element in a Sorted Array(排序数组中的单个元素)

给一个已经排好序的升序数组&#xff0c;其中每个元素都会重复2次&#xff0c;只有一个元素只有一个&#xff0c; 找出这个只有一个的元素。 要求时间复杂度在O(logn), 空间复杂度在O(1). 思路&#xff1a; 时间复杂度为O(logn), 让人想到了binary search. 因为时间复杂度为…

keil5安装了pack包但是还是不能选择device

一开始&#xff0c;我以为是keil5无法安装 STM32 芯片包&#xff0c;打开device倒是可以看到stm公司的芯片包&#xff0c;但是没有我想要的stm32f1。 我按照网上的一些说法&#xff0c;找到了这个STM32F1 的pack芯片包&#xff0c;但是我双击安装的时候&#xff0c;它的安装位…

(HP)新手引导使用react-shepherd

1&#xff0c;官方参数文档&#xff1a;https://shepherdjs.dev/docs/tutorial-02-usage.html 2&#xff0c;基本代码 import { ShepherdTour } from react-shepherd; import ./index.less; // 自己的样式文件&#xff0c;用来修改样式 import ./shepherd.less; // 将shephe…