AI-机器学习-自学笔记(七)支持向量机(SVG)算法

       支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)

       在二维空间上,两类点被一条直线完全分开叫做线性可分。从二维扩展到多维空间中时,将两类N维空间完全分开的N-1维面就成了一个超平面。

 这些靠近超平面最近的一些点,就称为支持向量

对于非线性问题,运用核函数将数据映射到高维空间后应用线性SVM可获得解决。

SVM在scikit- learn 中的实现类是 SVC 类,我们通过一个简单的例子来演示一下:

import matplotlib.pyplot as plt
import numpy as np

from sklearn import svm

def loadDataSet(fileName):
    """
    Args:
        fileName 文件名
    Returns:
        dataMat  数据矩阵
        labelMat 类标签
    """
    dataMat = []
    labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = line.strip().split(',')
        dataMat.append([float(lineArr[0]), float(lineArr[1])])
        labelMat.append(float(lineArr[2]))
    return dataMat, labelMat
X, Y = loadDataSet('./data/datalog2.txt')
X = np.mat(X)

print("X=", X[:5])
print("Y=", Y[:5])

clf = svm.SVC(C=8,kernel='linear',gamma=10,probability=True)
#SVC(C=5, cache_size=200, class_weight=None, coef0=0.0,
#,  decision_function_shape='ovr', degree=3, gamma=10, kernel='linear',
#,  max_iter=-1, probability=False, random_state=None, shrinking=True,
#,  tol=0.001, verbose=False)
clf.fit(X, Y)

# 获取分割超平面
w = clf.coef_[0]
# 斜率
a = -w[0] / w[1]
# 从-2到10,顺序间隔采样50个样本,默认是num=50
xx = np.linspace(-2, 10)  # , num=50)
# 二维的直线方程
yy = a * xx - (clf.intercept_[0]) / w[1]
print("yy=", yy)

print("support_vectors_=", clf.support_vectors_)
b = clf.support_vectors_[0]
yy_down = a * xx + (b[1] - a * b[0])
b = clf.support_vectors_[-1]
yy_up = a * xx + (b[1] - a * b[0])

plt.plot(xx, yy, 'k-')
plt.plot(xx, yy_down, 'k--')
plt.plot(xx, yy_up, 'k--')

plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=80, facecolors='none')
plt.scatter(X[:, 0].flat, X[:, 1].flat, c=Y, cmap=plt.cm.Paired)
plt.axis('tight')
plt.show()

运行后得到下图

 我们再用scikit-learn中自带的手写数字数据集进行实验

import matplotlib.pyplot as plt
import numpy as np
import scipy,cv2,imageio
from sklearn import svm
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from fractions import Fraction
from skimage.transform import resize


#读取sklearn.datasets自带的手写数字数据集
datas = load_digits()
#print(datas.data[1])
#前63个值为特征,赋值给x,最后一个值是分类,赋值给y
x = datas.data[:, :-1]
y = datas.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=666)

#调用svm.SVC方法进行训练
clf = svm.SVC(C=8,kernel='linear',gamma=10,probability=True)
#SVC(C=5, cache_size=200, class_weight=None, coef0=0.0,
#,  decision_function_shape='ovr', degree=3, gamma=10, kernel='linear',
#,  max_iter=-1, probability=False, random_state=None, shrinking=True,
#,  tol=0.001, verbose=False)
clf.fit(x, y)

#print(clf.predict(x[0:15]))#必须以区间取值的方式,4:5 其实就是取 4 这个值
#训练集准确率
print("Train :", clf.score(x_train, y_train))
#测试集准确率
print("Test :", clf.score(x_test, y_test))



#以下为实现用训练好的模型识别自己手写的图片

#图片处理函数,主要是把图片压缩为8*8的格式(和数据集一致),包括变灰度、黑白反转
def image2Digit(image):
    # 调整为8*8大小
    #im_resized = scipy.misc.imresize(image, (8,8))#scipy.misc.imresize这个函数现在不能用了
    #print(image.shape)
    im_resized=cv2.resize(image,(8, 8))
    #print('im_resized:')
    #print(im_resized.shape)
    im_resized2=im_resized.astype(np.float32)  #这里是个坑,CV2默认数据格式是float64的,np默认格式是float32的,这里要把数据格式转一下,否则后面会报错
    #print('im_resized2:')
    #print(im_resized2)

    # RGB(三维)转为灰度图(一维)
    im_gray = cv2.cvtColor(im_resized2, cv2.COLOR_BGR2GRAY)
    #print('im_gray')
    #print(im_gray.shape)
    
    # 调整为0-16之间(digits训练数据的特征规格)像素值——16/255
    im_hex = Fraction(16,255) * im_gray
    #print('im_hex')
    #print(im_hex)
    # 将图片数据反相(digits训练数据的特征规格——黑底白字)
    im_reverse = 16 - im_hex
    
    return im_reverse.astype(np.int)

#图片文件路径
fp='data/numbers/test1.png'

# 读取单张自定义手写数字的图片
#image = scipy.misc.imread(fp)   #新版本scipy不支持imread,可以用imageio.imread代替
image = imageio.imread(fp)

# 调用上面的函数,将图片转为digits训练数据的规格——即数据的表征方式要统一
im_reverse = image2Digit(image)
# 显示图片转换后的像素值
print(im_reverse)
# 8*8转为1*64(预测方法的参数要求)
reshaped = im_reverse.reshape(1,64)
# 预测
result = clf.predict(reshaped[:, :-1])
print('识别到的数字为:{}'.format(result[0]))

打印结果如下:

PS C:\coding\machinelearning>SVM-手写数字数据集实验.py      
Train : 1.0
Test : 1.0
[[ 0  0  0  0  0  0  0  0]
 [ 0  0 16 16 16 16 15  0]
 [ 0  0 16 16  9  9 16  0]
 [ 0  0  0  0  0 16 16  0]
 [ 0  0  0  1 14 16  0  0]
 [ 0  0 16 16 16  8  0  0]
 [ 0  0  1 15 16 16 16 16]
 [ 0  0  0  0  0  0  0  2]]
识别到的数字为:2
PS C:\coding\machinelearning>

从图形也能看出来,这是个数字2

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SVG(Static Var Generator)是一种用于无功补偿的设备,它通过电子开关控制来响应电网压力的变化,并产生合适的电流来实现无功补偿。SVG无功补偿控制程序算法是指用于控制SVG设备的程序,其主要目的是根据电网压力的变化来控制SVG的输出,以实现最优的无功补偿效果。 SVG无功补偿控制程序算法通常包括以下几个步骤: 1. 采集电网压力数据:通过传感器或测量装置,实时采集电网的电压数据,并将其输入到控制程序中。 2. 分析电网压力变化:控制程序通过对电网电压数据的分析,判断无功补偿的需求。如果电网电压过低,需输出无功功率来提高电压;如果电网电压过高,需吸收无功功率来降低电压。 3. 计算无功功率:根据电网电压的变化,控制程序使用合适的算法计算出所需的无功功率。 4. 控制SVG输出:根据计算得到的无功功率需求,控制程序通过控制SVG的电子开关,调整其输出电流和相位,以产生所需的无功功率。 5. 跟踪和调整:控制程序根据SVG输出的实际效果,通过不断跟踪和调整,对SVG的控制参数进行优化,以达到最佳的无功补偿效果。 通过合理的算法和控制程序设计,SVG设备可以在电网中自动进行无功补偿,提高电网的稳定性和供电质量。 ### 回答2: SVG无功补偿控制程序算法是指用于电力系统中静止无功发生器(SVG)的无功补偿控制方法和步骤。SVG作为一种高性能的电力电子装置,用于调节电网中的电压和无功功率,以最优化电力系统的运行。 该控制程序算法的基本原理是通过对电网的电压进行实时监测和反馈控制,使SVG能够在电力系统中产生所需的无功功率,并减少系统的无功负荷。具体步骤如下: 1. 采集电网电压:使用传感器或测量装置,实时采集电网的电压信号。 2. 信号处理:对采集到的电压信号进行滤波和放大等信号处理操作,以获得可靠的输入信号。 3. 算法计算:根据电网电压的测量值,通过运算和计算,确定所需的SVG无功补偿功率的大小和方向。 4. 控制命令生成:根据算法计算的结果,生成相应的控制命令,用于控制SVG的输出功率。 5. 控制信号传输:将控制命令通过串口、以太网或其他通信手段传输给SVG装置,实现对SVG输出功率的调节。同时,还需确保控制信号的稳定传输和准确性。 6. 反馈控制:根据实际的SVG输出功率和电网电压的测量值,进行反馈控制,调整控制命令,以保证系统的无功补偿效果。 7. 控制周期调节:根据系统运行的需求和控制策略,调整控制周期,以实现对电网电压的快速响应和稳定控制。 通过以上步骤,SVG无功补偿控制程序算法能够实现对电力系统中无功功率的实时监测和调节,提高电网的电压质量和无功补偿效果,确保电力系统的稳定运行。 ### 回答3: SVG(Static Var Generator)是一种用于电力系统中无功补偿的设备,它能够快速响应系统中的无功功率需求,并能灵活地调整无功功率流入或流出电力系统。 SVG无功补偿控制程序算法是指用于控制SVG设备的计算方法和步骤。一般来说,SVG无功补偿控制程序算法的主要目标是实现电力系统的无功功率平衡,以提高系统的稳定性和可靠性。 在具体的算法设计中,SVG无功补偿控制程序通常包括以下几个关键步骤: 1. 监测系统的无功功率需求:通过监测电网的电压和电流信号,计算得出系统当前的无功功率需求。 2. 确定SVG的补偿策略:根据系统的无功功率需求,采用一定的算法和策略确定SVG设备的补偿方式,包括补偿电流的大小和方向。 3. 计算补偿电流:根据补偿策略,计算出SVG设备需要提供的补偿电流,以实现无功功率平衡。 4. 控制SVG设备:将计算得出的补偿电流信号送入SVG设备,并进行相应的控制,以实现补偿电流的注入或吸收。 5. 实时调整与优化:根据监测到的系统反馈信号,实时调整补偿策略和补偿电流,优化无功功率补偿效果。 总之,SVG无功补偿控制程序算法是根据系统的无功功率需求,通过计算和控制,实现SVG设备的无功功率补偿,以提高电力系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值