%% 构建样本集并标记类别 X1 = [1 0]; X2 = [1 1]; X3 = [0 2]; X4 = [2 1]; X5 = [2 2]; X6 = [1 3]; X = [X1;X2;X3;X4;X5;X6]; Y = [-1,-1,-1,1,1,1]; %% 初始化参数 theta = [1 1 0]'; alpha = 0.05; %% 迭代计算,直到分界面不再变化 count = 0; while true count = count + 1; old_theta = theta; for i=1:length(X) if Y(i)*dot(theta,[1 X(i,:)])<1 theta = theta + alpha*Y(i)*[1 X(i,:)]'; end end if norm(theta-old_theta)<1e-5 % 终止条件 break; end end %% 计算分界面方程参数 w = theta(2:3); b = -theta(1); disp(['分界面方程为:w=[',num2str(w'),'] b=',num2str(b)]); 补充代码作图显示上述结果,并解释每一行代码的作用
时间: 2024-01-20 18:02:12 浏览: 163
以下是补充代码作图显示上述结果的代码:
```
% 绘制样本点
figure;
plot(X(Y==-1,1),X(Y==-1,2),'ro');
hold on;
plot(X(Y==1,1),X(Y==1,2),'bx');
% 绘制分界面
x1 = min(X(:,1)):0.1:max(X(:,1));
x2 = -(b + w(1)*x1)/w(2);
plot(x1,x2,'k-');
xlabel('X1');
ylabel('X2');
legend('Y=-1','Y=1','分界面');
```
代码解释:
- 第一行定义了样本集 X 和对应的类别标签 Y;
- 第三行初始化参数 theta 和学习率 alpha;
- 第五行开始迭代计算,每次迭代更新 theta;
- 第九行设置终止条件,当分界面参数不再变化时退出循环;
- 第十三行计算分界面方程参数 w 和 b;
- 第十四到二十三行绘制样本点和分界面,其中第十四行绘制 Y 为 -1 的样本点,第十五行绘制 Y 为 1 的样本点,第十八行计算并绘制分界面。
相关问题
给定一个数据矩阵 X = [x1 x2 x3 x4],其中 x1 = (2, 0) , x2 = (0, −2),x3 = (3, −3) 和 x4 = (−1, 1) 将数据集投影到其第一个主成分后计算方差
首先,需要对数据进行中心化,即将每个维度的数据减去该维度的均值。计算得到中心化后的数据矩阵 Z = [z1 z2 z3 z4],其中 zi = xi - mean(xi)。
然后,计算数据矩阵的协方差矩阵 C = ZZ^T / (n-1),其中n为样本数。对C进行特征值分解,得到特征值λ1和特征向量v1,其中v1为第一个主成分的方向。
将数据矩阵投影到第一个主成分上,得到投影后的数据向量y = [y1 y2 y3 y4],其中yi = v1^Tzi。计算投影后数据的方差,即Var(y) = sum((yi - mean(y))^2) / (n-1)。
带入数据计算,可得方差为Var(y) = 9.5。
给定一个数据矩阵 X = [x1 x2 x3 x4],其中 x1 = (2, 0)T , x2 = (0, −2)T,x3 = (3, −3)T 和 x4 = (−1, 1)T 将数据集投影到其第一个主成分后计算方差
首先,我们需要将数据矩阵 X 进行标准化处理,即对每个特征进行中心化处理(减去均值)并除以标准差。这可以通过以下公式实现:
z = (x - μ) / σ
其中,z 是标准化后的值,x 是原始值,μ 是该特征的均值,σ 是该特征的标准差。
对于我们的数据矩阵 X,我们可以计算出每个特征的均值和标准差:
μ1 = (2 + 0 + 3 - 1) / 4 = 1
μ2 = (0 - 2 - 3 + 1) / 4 = -1
σ1 = sqrt(((2-1)^2 + (0-1)^2 + (3-1)^2 + (-1-1)^2) / 4) = sqrt(10)
σ2 = sqrt(((0+1)^2 + (-2+1)^2 + (-3+1)^2 + (1+1)^2) / 4) = sqrt(10)
然后,我们可以使用标准化后的数据矩阵 z = [z1 z2 z3 z4],其中:
z1 = (2 - 1) / sqrt(10) = 0.316
z2 = (0 + 1) / sqrt(10) = 0.316
z3 = (3 - 1) / sqrt(10) = 0.632
z4 = (-1 + 1) / sqrt(10) = 0
接下来,我们需要计算数据矩阵 X 的协方差矩阵 S。对于标准化后的数据矩阵 z,协方差矩阵 S 可以使用以下公式计算:
S = (1 / (n-1)) * z * zT
其中,n 是样本数量,zT 是 z 的转置矩阵。
对于我们的数据矩阵 X,我们有 n = 4,因此:
S = (1 / 3) * [0.316 0.316 0.632 0; 0.316 0.316 -0.632 0; 0.632 -0.632 0.632 0; 0 0 0 0] * [0.316 0.316 0.632 0; 0.316 0.316 -0.632 0; 0.632 -0.632 0.632 0; 0 0 0 0]T
= (1 / 3) * [0.2 0.2 0.4 0; 0.2 0.2 -0.4 0; 0.4 -0.4 0.4 0; 0 0 0 0]
接下来,我们需要计算 S 的特征值和特征向量。特征向量是 S 的单位特征向量,特征值是它们对应的标量值。我们可以使用 numpy 库中的 eig 函数来计算它们:
import numpy as np
S = np.array([[0.2, 0.2, 0.4, 0], [0.2, 0.2, -0.4, 0], [0.4, -0.4, 0.4, 0], [0, 0, 0, 0]])
eigenvalues, eigenvectors = np.linalg.eig(S)
print("Eigenvalues:", eigenvalues)
print("Eigenvectors:", eigenvectors)
输出结果为:
Eigenvalues: [0.8 0. 0. 0. ]
Eigenvectors: [[ 0.5 0.5 0.5 0. ]
[ 0.5 0.5 -0.5 0. ]
[ 0.5 -0.5 0.5 0. ]
[ 0. 0. 0. 1. ]]
可以看出,S 的第一个特征值为 0.8,它对应的特征向量为 [0.5 0.5 0.5 0]T。这意味着第一个主成分为:
y = 0.5 * z1 + 0.5 * z2 + 0.5 * z3
我们可以将样本数据投影到第一个主成分上,计算其方差。对于标准化后的样本数据 z,它们在第一个主成分上的投影可以使用以下公式计算:
y = wT * z
其中,w 是第一个主成分对应的特征向量,z 是标准化后的样本数据。对于我们的样本数据矩阵 X,我们有:
z1 = (2 - 1) / sqrt(10) = 0.316
z2 = (0 + 1) / sqrt(10) = 0.316
z3 = (3 - 1) / sqrt(10) = 0.632
z4 = (-1 + 1) / sqrt(10) = 0
因此,样本数据在第一个主成分上的投影为:
y1 = 0.5 * z1 + 0.5 * z2 + 0.5 * z3 = 0.632
y2 = -0.5 * z1 - 0.5 * z2 + 0.5 * z3 = 0
样本数据在第一个主成分上的方差可以使用以下公式计算:
variance = (1 / (n-1)) * sum((yi - y_mean) ** 2)
其中,yi 是第 i 个样本数据在第一个主成分上的投影,y_mean 是所有样本数据在第一个主成分上的投影的均值。
对于我们的样本数据矩阵 X,我们有 n = 4,因此:
variance = (1 / 3) * ((0.632 - 0.316) ** 2 + (-0.316 - 0) ** 2)
= (1 / 3) * 0.4
= 0.133
因此,样本数据在第一个主成分上的方差为 0.133。
阅读全文