线性分类器MATLAB程序

线性分类器MATLAB程序,第1张

1.“与逻辑”线性分类器的设计与逻辑的真值表和逻辑值分布如下所示:

其中“o”表示逻辑0,“*”表示逻辑“1”。matlab程序如下:x=[0,0,1,10,1,0,1] t=[0,1,1,1][R,Q]=size(x)[S,Q]=size(t)M=20W=[-0.1 0.2]Wc=W'C=rands(S,1)Y=W*x+Cfor j=1:Mfor i=1:4if Y(1,i)>0F(1,i)=1else,F(1,i)=0endendif all(F==t)breakenddW=(t-F)*x'E=[0.010.010.010.01]W=W+dWWz(:,j)=WY=W*x+Cendplotpv(x,t)plotpc(W,C)grid onxlabel('x1')ylabel('x2')“与逻辑”线性可分的matlab仿真如下:

2.“或逻辑”线性分类器的设计或逻辑的真值表和逻辑值分布如下所示:

其中“o”表示逻辑0,“*”表示逻辑“1”。matlab程序如下:x=[0,0,1,10,1,0,1]t=[0,1,1,1][R,Q]=size(x)[S,Q]=size(t)M=20W=[-0.1 0.2]Wc=W'C=rands(S,1)Y=W*x+Cfor j=1:Mfor i=1:4if Y(1,i)>0F(1,i)=1else,F(1,i)=0endendif all(F==t)breakenddW=(t-F)*x'E=[0.010.010.010.01]W=W+dWWz(:,j)=WY=W*x+Cendplotpv(x,t)plotpc(W,C)grid onxlabel('x1')ylabel('x2')“与逻辑”线性可分的matlab仿真如下:

望采纳 谢谢

这个是非线性svm的:

1.命令函数部分:

clear%清屏

clc

X =load('data.txt')

n = length(X)%总样本数量

y = X(:,4)%类别标志

X = X(:,1:3)

TOL = 0.0001%精度要求

C = 1%参数,对损失函数的权重

b = 0%初始设置截距b

Wold = 0%未更新a时的W(a)

Wnew = 0%更新a后的W(a)

for i = 1 : 50%设置类别标志为1或者-1

y(i) = -1

end

a = zeros(n,1)%参数a

for i = 1 : n%随机初始化a,a属于[0,C]

a(i) = 0.2

end

%为简化计算,减少重复计算进行的计算

K = ones(n,n)

for i = 1 :n%求出K矩阵,便于之后的计算

for j = 1 : n

K(i,j) = k(X(i,:),X(j,:))

end

end

sum = zeros(n,1)%中间变量,便于之后的计算,sum(k)=sigma a(i)*y(i)*K(k,i)

for k = 1 : n

for i = 1 : n

sum(k) = sum(k) + a(i) * y(i) * K(i,k)

end

end

while 1%迭代过程

%启发式选点

n1 = 1%初始化,n1,n2代表选择的2个点

n2 = 2

%n1按照第一个违反KKT条件的点选择

while n1 <= n

if y(n1) * (sum(n1) + b) == 1 &&a(n1) >= C &&a(n1) <= 0

break

end

if y(n1) * (sum(n1) + b) >1 &&a(n1) ~= 0

break

end

if y(n1) * (sum(n1) + b) <1 &&a(n1) ~=C

break

end

n1 = n1 + 1

end

%n2按照最大化|E1-E2|的原则选取

E1 = 0

E2 = 0

maxDiff = 0%假设的最大误差

E1 = sum(n1) + b - y(n1)%n1的误差

for i = 1 : n

tempSum = sum(i) + b - y(i)

if abs(E1 - tempSum)>maxDiff

maxDiff = abs(E1 - tempSum)

n2 = i

E2 = tempSum

end

end

%以下进行更新

a1old = a(n1)

a2old = a(n2)

KK = K(n1,n1) + K(n2,n2) - 2*K(n1,n2)

a2new = a2old + y(n2) *(E1 - E2) / KK%计算新的a2

%a2必须满足约束条件

S = y(n1) * y(n2)

if S == -1

U = max(0,a2old - a1old)

V = min(C,C - a1old + a2old)

else

U = max(0,a1old + a2old - C)

V = min(C,a1old + a2old)

end

if a2new >V

a2new = V

end

if a2new <U

a2new = U

end

a1new = a1old + S * (a2old - a2new)%计算新的a1

a(n1) = a1new%更新a

a(n2) = a2new

%更新部分值

sum = zeros(n,1)

for k = 1 : n

for i = 1 : n

sum(k) = sum(k) + a(i) * y(i) * K(i,k)

end

end

Wold = Wnew

Wnew = 0%更新a后的W(a)

tempSum = 0%临时变量

for i = 1 : n

for j = 1 : n

tempSum= tempSum + y(i )*y(j)*a(i)*a(j)*K(i,j)

end

Wnew= Wnew+ a(i)

end

Wnew= Wnew - 0.5 * tempSum

%以下更新b:通过找到某一个支持向量来计算

support = 1%支持向量坐标初始化

while abs(a(support))<1e-4 &&support <= n

support = support + 1

end

b = 1 / y(support) - sum(support)

%判断停止条件

if abs(Wnew/ Wold - 1 ) <= TOL

break

end

end

%输出结果:包括原分类,辨别函数计算结果,svm分类结果

for i = 1 : n

fprintf('第%d点:原标号 ',i)

if i <= 50

fprintf('-1')

else

fprintf(' 1')

end

fprintf('判别函数值%f 分类结果',sum(i) + b)

if abs(sum(i) + b - 1) <0.5

fprintf('1\n')

else if abs(sum(i) + b + 1) <0.5

fprintf('-1\n')

else

fprintf('归类错误\n')

end

end

end

2.名为f的功能函数部分:

function y = k(x1,x2)

y = exp(-0.5*norm(x1 - x2).^2)

end

3.数据:

0.8871 -0.34918.3376 0

1.25191.20836.5041 0

-1.19251.93381.8790 0

-0.12772.43712.6971 0

1.96973.09066.0391 0

0.76030.82411.5323 0

1.63823.55164.4694 0

1.3438 -0.45395.9366 0

-1.3361 -2.02011.6393 0

-0.38863.30418.0450 0

-0.67806.0196 -0.4084 0

0.3552 -0.10511.2458 0

1.65604.07860.8521 0

0.81173.54516.8925 0

1.4773 -1.93403.9256 0

-0.0732 -0.95260.4609 0

0.15214.37112.2600 0

1.48200.74930.3475 0

0.61404.52618.3776 0

0.57213.34603.7853 0

0.52694.14524.3900 0

1.7879 -0.53902.5516 0

0.98855.76250.1832 0

-0.33182.4373 -0.6884 0

1.35785.47093.4302 0

2.7210 -1.12684.7719 0

0.5039 -0.10252.3650 0

1.11071.68853.7650 0

0.78621.35877.3203 0

1.0444 -1.58413.6349 0

1.77951.72764.9847 0

0.67101.4724 -0.5504 0

0.23030.2720 -1.6028 0

1.7089 -1.73994.8882 0

1.00590.55575.1188 0

2.30500.85452.8294 0

1.95550.98980.3501 0

1.71411.54133.8739 0

2.27495.32804.9604 0

1.61710.52703.3826 0

3.6681 -1.84094.8934 0

1.19641.87811.4146 0

0.77882.10480.0380 0

0.79165.09063.8513 0

1.08071.88495.9766 0

0.63402.60303.6940 0

1.9069 -0.06097.4208 0

1.65994.94098.1108 0

1.37630.88993.9069 0

0.84851.46886.7393 0

3.67926.10924.9051 1

4.38127.21486.1211 1

4.39713.41397.7974 1

5.07167.7253 10.5373 1

5.30788.81386.1682 1

4.14485.51562.8731 1

5.36096.04584.0815 1

4.74526.63521.3689 1

6.02746.5397 -1.9120 1

5.31743.01346.7935 1

7.24593.69703.1246 1

6.10078.10875.5568 1

5.99246.92385.7938 1

6.02635.33337.5185 1

3.64708.09156.4713 1

3.65437.22647.5783 1

5.01146.53353.5229 1

4.43487.4379 -0.0292 1

3.60873.73513.0172 1

3.53745.53547.6578 1

6.00482.0691 10.4513 1

3.14234.00035.4994 1

3.40127.15368.3510 1

5.54715.1372 -1.5090 1

6.50895.49118.0468 1

5.45836.76745.9353 1

4.17272.97983.6027 1

5.16728.41364.8621 1

4.88083.55141.9953 1

5.49384.19983.2440 1

5.45425.88034.4269 1

4.87433.96418.1417 1

5.97626.77112.3816 1

6.69457.28581.8942 1

4.73015.76521.6608 1

4.70845.36233.2596 1

6.04083.31387.7876 1

4.60248.35170.2193 1

4.70546.6633 -0.3492 1

4.71395.63626.2330 1

4.0850 10.71183.3541 1

6.10886.16354.2292 1

4.98365.40426.7422 1

6.13876.19492.5614 1

6.07007.03733.3256 1

5.68815.13639.9254 1

7.20582.35704.7361 1

4.29727.32454.7928 1

4.77948.12353.1827 1

3.92826.4092 -0.6339 1

图像做分类器训练要建立视觉词袋来进行图像分类。该过程生成用来表示图像视觉词的直方图,通过这些直方图来训练图像分类器。下面的步骤描述如何建立图像集,建立视觉词袋,以及训练和运用图像分类器。

第一步:建立图像类别集合

将图像分割成训练子集和测试子集。利用imageDatastore函数来存储训练分类器的图像。可以利用splitEachLabel函数将图像分割成训练数据和测试数据。

读取类别图像和创建图像子集

setDir = fullfile(toolboxdir('vision'),'visiondata','imageSets')

imds = imageDatastore(setDir,'IncludeSubfolders',true,'LabelSource','foldernames')

分割图集成训练和测试子集。下例中,30%作为训练数据,余下的作为测试数据。

[trainingSet,testSet] = splitEachLabel(imds,0.3,'randomize')

第二步:建立特征词袋

通过从每个类别的有代表性的图像中提取特征描述符,创建视觉词汇表或特征包。

通过在训练集合中提取出的特征描述符上利用k-means聚类算法,bagOfFeatures对象定义特征,视觉词汇。该算法迭代地将描述符分成k个互斥簇。由此产生的簇是紧密的,并具有相似的特性。每个集群中心代表一个特征,或一个可视词。可以基于特征检测器提取特征,也可以定义一个网格来提取特征描述符。网格方法可能丢失细节信息。因此,对不包含明显特征的图像使用网格,例如海滩等景物的图像。使用Speed up robust features(或SURF)检测器提供更大的尺度不变性。默认情况下,该算法运行“网格”方法。

该算法工作流对图像进行整体分析。图像必须有适当的标签来描述它们所代表的类。例如,一组汽车图像可以被标记为汽车。工作流不依赖于空间信息,也不依赖于标记图像中的特定对象。视觉词袋技术依赖于非局部化的检测技术。

第三步:通过视觉词袋训练图像分类器

trainImageCategoryClassifier函数返回一个图像分类器。该方法使用基于2分类支持向量机(SVM)的error-correcting output codes(ECOC)框架来训练一个多分类器。

该方法利用bagOfFeatures对象返回的视觉词袋将图像集中的图像编码成视觉词直方图。然后将视觉词直方图作为训练分类器的正负样本。

1、将训练集中的每幅图像利用bagOfFeature的encode方法进行编码。该函数检测和提取图像中的特征,然后利用最近邻算法构造每个图像的特征直方图。函数将描述符逼近聚类中心来增加直方图各bin的数值。直方图的长度取决于bagOfFeatures对象构造的出来的视觉词的数量。最终将直方图作为图像的特征向量。

2、对训练集中的每幅图像重复步骤1,建立训练数据

3、评价分类器。在测试图像集上使用imagecategoryclassifier的evaluate方法测试分类器。输出混淆矩阵可以分析预测结果。理想的分类结果是对角线上包含一个标准矩阵。不正确的分类导致出现分数值。

第四步:对图像或图像集进行分类

最后使用imageCategoryClassifier 的predeict方法对新图像进行分类来确定其类型。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12153650.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存