最大最小距离算法(Max-Min-distance)

基本思想:

对待分类模式样本集采取以最大距离原则选取新的聚类中心,以最小距离原则进行模式归类。

算法原理和步骤:

1.从 N N N个样本集中的任选取一个样本,作为第一个聚类中心 z 1 z_1 z1
2.选取距离第一个聚类中心 z 1 z_1 z1最远的样本作为第二个聚类中心 z 2 z_2 z2
3.计算其余样本与 z 1 、 z 2 z_1、z_2 z1z2之间的距离,并求出它们中的最小值,即:
d i j = ∥ x i − z j ∥ , j = 1 , 2 d_{ij}= \Vert x_i-z_j\Vert, j=1,2 dij=xizj,j=1,2
d i = m i n [ d i 1 , d i 2 ] , i = 1 , 2 , . . . N d_i=min[d_{i1},d_{i2}], i = 1,2,...N di=min[di1,di2],i=1,2,...N

4.若:( θ 为选定的比例系数 \theta 为选定的比例系数 θ为选定的比例系数)
d l = max ⁡ i [ m i n [ d i 1 , d i 2 ] ] > θ ∗ ∥ z 1 − z 2 ∥ d_l = \max_{i} [min[d_{i1},d_{i2}]] > \theta*\Vert z_1-z_2\Vert dl=imax[min[di1,di2]]>θz1z2
则相应的样本 x l x_l xl作为第三个聚类中心 z 3 z_3 z3,转至下一步继续判断是否存在新的聚类中心,否则转至第六步;
5.假设存在 k k k个聚类中心,计算各样本到各个聚类中心的距离 d i j d_{ij} dij,并算出:
d l = max ⁡ i [ m i n [ d i 1 , d i 2 , . . . , d i k ] ] > θ ∗ ∥ z 1 − z 2 ∥ d_l = \max_{i} [min[d_{i1},d_{i2},...,d_{ik}]] > \theta*\Vert z_1-z_2\Vert dl=imax[min[di1,di2,...,dik]]>θz1z2
若成立,则 z k + 1 = x l z_{k+1}=x_l zk+1=xl,并循环此步骤,继续判断是否有新的聚类中心存在,否则转至第六步;
6.当判断不再有新的聚类中心存在时,将样本集按最小距离原则分到各类中去,即计算:
d i j = ∥ x i − z j ∥ , j = 1 , 2 , . . . , k , i = 1 , 2 , . . . , N d_{ij}= \Vert x_i-z_j\Vert, j=1,2,...,k,i = 1,2,...,N dij=xizj,j=1,2,...,k,i=1,2,...,N

MATLAB代码实现:

clear all
close all
clc
%坐标点,初始化选定比例系数
num = 10;eta = 0.5;
axis([0 10 0 10]);
hold on
%c = zeros(10,1);z = zeros(10,2);
x1 = [0,0];x2 = [3,8];x3 = [2,2];x4 = [1,1];
x5 = [5,3];x6 = [4,8];x7 = [6,3];x8 = [5,4];
x9 = [6,4];x10 = [7,5];
W = [x1;x2;x3;x4;x5;x6;x7;x8;x9;x10];
%% step1 任选一个坐标点作为第一个聚类中心z1
R= randperm(num);
c(1) = R(1);
z(1,:) = W(c(1),:);
%% step2 从数据中选取一个距离z1最远的坐标点,作为第二个聚类中心z2
d = zeros(num,1);
for i = 1:num
    d(i) = norm(z(1,:)-W(i,:));
end
[~,c(2)] = max(d);%距离,位置
z(2,:)= W(c(2),:);
%% step3 计算剩余数据与z1,z2之间的距离,并求其最小距离
d =zeros(num,2);
for i = 1:num
    d(i,1) = norm(z(1,:)-W(i,:));
    d(i,2) = norm(z(2,:)-W(i,:));
end
D = zeros(num,1);
for i = 1:num
    D(i) = min(d(i,:));
end
%% step4 确定是否存在第三个聚类中心
[m,n] = max(D);%最大值,位置
if m>eta*norm(z(2,:)-z(1,:));
    c(3) = n;
    z(3,:) = W(c(3),:);
    jump = 1;%转至step5
else
    jump = 2;
end

switch (jump)
    case 1
        k = 4;
        %% step5 继续确定是否存在聚类中心
        for p = 1:num
            d =zeros(num,length(c));
            for i = 1:length(c)
                for j = 1:num
                    d(j,i) = norm(z(i,:)-W(j,:));
                end
            end
            for i = 1:num
                D(i) = min(d(i,:));
            end
            [m,n] = max(D);%最大值,位置
            if m>eta*norm(z(2,:)-z(1,:));
                c(k) = n;
                z(k,:) = W(c(k),:);
                k = k+1;
            else
                break  %没有新的聚类中心
            end
        end
        
    case 2
        break
end
%% step6 最小距离法进行分类
%首先计算数据到每个聚类中心的距离
D =zeros(num,length(c));
for i = 1:length(c)
    for j = 1:num
        D(j,i) = norm(z(i,:)-W(j,:));
    end
end
%归类,判断坐标点属于的类别
k = zeros(length(c),1);
for i = 1:num
    [m,n] = min(D(i,:));
    k(i,1) = n;%归类标识
end

%设置颜色
colour = zeros(length(c),3);
for i = 1:length(c)
    colour(i,:) = rand(1,3);
end

for i = 1:length(c)
    v = find(k == i);%位置
    u = length(v);%个数
    M = zeros(u,2);%用来存储所属同一类的点
    for j = 1:u
        M(j,:) = W(v(j),:);
    end
    P = plot(M(:,1),M(:,2),'<');
    set(P,'color',colour(i,:));
end

结果:

分析:

这种算法聚类结果与选取的第一个聚类中心以及选定的比例系数 θ \theta θ 有关。这会导致聚类结果不理想,所以个人认为要尽可能避免聚类结果不理想的问题,首先可以找到距离原点最近的一点作为初始的聚类中心,同时 θ \theta θ 大小根据样本的分布及 ∥ z 1 − z 2 ∥ \Vert z_1-z_2\Vert z1z2 的大小进行综合确定。

<think>好的,用户遇到了Git合并时本地更改会被覆盖的问题,需要解决方案。根据之前的引用资料,解决方法主要有commit、stash和revert三种。首先,我得确认用户的具体情况,比如他们的本地更改是否已经完成,是否需要保留,或者是否可以丢弃。用户可能不太清楚这三种方法的适用场景,需要详细解释每个选项的步骤和优缺点。比如,commit适用于需要保留更改的情况,stash适合临时保存以便后续恢复,而revert则是直接撤销更改,适用于不需要保留的情况。需要结构清晰,分点说明,每个方法都给出操作步骤和适用场景,帮助用户理解哪种情况最适合他们。还要注意使用中文,避免技术术语过于复杂,让用户容易理解。同时,生成相关问题,可能涉及如何恢复stash的内容,或者如何避免频繁冲突等,扩展用户的知识点。另外,要确保LaTeX格式正确,但在这个问题中可能用不上数学公式,所以主要关注代码块和引用标识。检查引用是否正确,比如引用[^1]和[^2]的来源是否相关,用户提供的引用内容是否准确对应解决方案。 最后,确保回答真实可靠,操作步骤准确无误,避免误导用户。可能还需要提醒用户根据具体情况选择方法,比如如果有未完成的实验性代码,stash可能是更好的选择,而如果是确定要保留的修改,则应该commit。</think>要解决Git合并时本地更改被覆盖的问题,可根据不同场景选择以下三种方法: ### 一、提交本地更改(commit) **适用场景**:当本地更改已测试通过且需要保留到版本历史中。 **操作步骤**: 1. 将改动添加到暂存区: ```bash git add . # 添加所有文件 # 或指定文件 git add file1.txt file2.py ``` 2. 提交更改并添加描述: ```bash git commit -m "完成用户登录模块优化" ``` 3. 执行合并操作: ```bash git merge origin/main ``` **优点**:保留完整的开发记录,便于后续追溯[^1]。 ### 二、暂存更改(stash) **适用场景**:需要临时保存未完成的修改(如调试代码),优先处理合并操作。 **操作步骤**: 1. 保存当前工作状态: ```bash git stash # 可选添加备注 git stash save "用户登录模块调试代码" ``` 2. 查看暂存记录列表: ```bash git stash list ``` 3. 合并远程分支: ```bash git merge origin/main ``` 4. 恢复暂存内容: ```bash git stash pop # 恢复并删除最近一次暂存 # 或指定特定暂存 git stash apply stash@{1} ``` **优点**:保持工作目录整洁,特别适合处理紧急合并任务[^2]。 ### 三、撤销本地更改(revert) **适用场景**:本地修改可丢弃(如实验性代码或错误修改)。 **操作步骤**: 1. 撤销所有未提交的修改: ```bash git checkout -- . # 全部文件 # 或指定文件 git checkout -- file1.txt ``` 2. 执行合并操作: ```bash git merge origin/main ``` **风险提示**:此操作不可逆,需确认文件无需保留。 --- ### 对比决策表 | 方法 | 保留记录 | 可恢复性 | 适用阶段 | |---------|----------|----------|------------------| | commit | ✅ | ✅ | 功能开发完成时 | | stash | ❌ | ✅ | 开发中途临时切换 | | revert | ❌ | ❌ | 放弃无效修改 | ### 扩展应用场景 - 当存在多个暂存时,可用`git stash list`查看记录,通过`git stash apply stash@{n}`精准恢复 - 合并后出现冲突时,可使用`git mergetool`可视化工具解决冲突 - 长期分支开发推荐使用`git rebase`保持提交历史线性
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值