matlab中的 peaks 函数的含义

matlab 中的 peaks 函数是一个典型的多元函数。它本质上是一个二元高斯分布的概率密度函数,函数表达式为:

\begin{equation}f(x,y)=3(1-x)^{2}e^{-x^2-(y+1)^2}-10(\frac{1}{5}x-x^3-y^5)e^{-x^2-y^2}-\frac{1}{3}e^{-(x+1)^2-y^2}\end{equation}

在 matlab 命令行窗口直接输入 peaks 可以得到其表达式的 matlab 形式:

z =  3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... 
   - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ... 
   - 1/3*exp(-(x+1).^2 - y.^2) 

三维图像:

 f=@(x,y)3*(1-x).^2.*exp(-(x.^2) - (y+1).^2)- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2)- 1/3*exp(-(x+1).^2 - y.^2);
 ezmesh(f);

从图像看出,它恰好有3个极小点,3个极大点。

好的,现在我们需要在meanshift函数调用findpeak函数,找到每个数据点所属的聚类的心点(peak)。同时,我们需要检查当前点的peak是否已经存在于已有的聚类,如果是,则将该点赋予已有的类别,否则创建一个新的类别。以下是代码实现: ``` def meanshift(data, r): labels = np.zeros(len(data.T)) peaks = [] #聚集的类心 label_no = 1 #当前label labels[0] = label_no peak = findpeak(data, 0, r) peakT = np.concatenate(peak, axis=0).T peaks.append(peakT) for idx in range(1, len(data.T)): # 寻找当前点的peak curr_peak = findpeak(data, idx, r) # 实时关注当前peak是否会收敛到一个新的聚类(和已有peaks比较) found_cluster = False for i, p in enumerate(peaks): # 计算当前点与已有的peak之间的距离 dist = np.sqrt(np.sum((curr_peak - p)**2)) if dist <= r: # 如果距离小于等于r,则将该点归入已有的类别 labels[idx] = i+1 found_cluster = True break if not found_cluster: # 如果距离大于r,则创建一个新的类别 label_no += 1 labels[idx] = label_no peaks.append(np.concatenate(curr_peak, axis=0).T) return labels, np.array(peaks).T ``` 在循环,我们首先调用findpeak函数找到当前点的peak,然后遍历所有已经存在的peak,计算当前点与它们之间的距离,如果距离小于等于r,则将该点归为已有的类别,否则创建一个新的类别。需要注意的是,我们在labels使用1,2,3...等正整数来表示不同的类别,而非像k-means那样使用0,1,2...等整数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心态与习惯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值