在做FAQ系统时,用户输入一个查询之后,返回若干个打好分数的文档。对于这些文档,有些是应该输出的,有些是不应该输出的。那么应该在什么地方截断呢?

这个问题其实是一个聚类问题,在一维空间中把若干个点聚成两类。

聚类就有标准:类内距离尽量小、类间距离尽量大。

由此想到Fisher准则。

那么给定一个浮点数组,寻找这个浮点数组的fisher点,应该如何实现呢?

fisher准则目标函数为fisher=(s1+s2)/(m1-m2)^2

可以用O(n)复杂度实现。

但是有没有更快速的方法呢?

从左往右扫描,如果fisher准则函数是一个类似二次函数的形状,那么就可以利用“三分法”求极值的策略将复杂度降为O(logN)。其实是不可能的,因为O(n)的方法优势在于快速计算目标函数fisher,如果使用三分法就无法O(1)复杂度计算目标函数fisher,而是O(n)的复杂度计算目标函数。这样其实复杂度反而提高了。所以这个问题到这里就可以停止了。但是“fisher曲线”到底是不是类似二次函数的呢?

为了验证是否满足“类似二次函数”的特性,我随机出一堆数字,求fisher曲线。

实验结果:并不满足“类似二次函数”,但是大概率地满足此条件。

本实验一共测试了10000组长度在3~1000之间的数组。

下面的0,1,2...表示曲线斜率方向变化次数,右面数字表示出现次数。

可以发现,那些 不满足“类似二次函数”的图像看上去也都近似“V”形。

0: 7668
1: 1732
2: 416
3: 129
4: 34
5: 17
6: 3
7: 1

实验代码如下:

import numpy as np
import tqdm def getfisher(a):
s = np.sum(a)
ss = np.sum(a * a)
now_s = 0
now_ss = 0
ret = []
for i in range(len(a) - 1):
now_s += a[i]
now_ss += a[i] ** 2
l_s = now_s / (i + 1)
l_ss = now_ss / (i + 1)
r_s = (s - now_s) / (len(a) - 1 - i)
r_ss = (ss - now_ss) / (len(a) - 1 - i)
fisher = (l_ss + r_ss) / (l_s - r_s) ** 2
ret.append(fisher)
return ret def checkright(a):
dir = 0
cnt = 0
for i in range(1, len(a)):
if dir != np.sign(a[i] - a[i - 1]) and dir != 0 and np.abs(a[i]-a[i-1])>1e-2:
cnt += 1
dir = np.sign(a[i] - a[i - 1])
return cnt def main():
c = dict()
for i in tqdm.tqdm(range(10000)):
x = np.sort(np.random.rand(np.random.randint(3, 1000)))
f = getfisher(x)
# plt.plot(x[:-1], f)
cnt = checkright(f)
if cnt not in c:
c[cnt] = 0
c[cnt] += 1
# plt.show()
print(c) if __name__ == '__main__':
main()

Fisher准则一维聚类的更多相关文章

  1. 线性判别分析(LDA)准则:FIsher准则、感知机准则、最小二乘(最小均方误差)准则

    准则 采用一种分类形式后,就要采用准则来衡量分类的效果,最好的结果一般出现在准则函数的极值点上,因此将分类器的设计问题转化为求准则函数极值问题,即求准则函数的参数,如线性分类器中的权值向量. 分类器设 ...

  2. Clustering[Spectral Clustering]

    0. 背景 谱聚类在2007年前后十分流行,因为它可以快速的通过标准的线性代数库来实现,且十分优于传统的聚类算法,如k-mean等. 至于在任何介绍谱聚类的算法原理上,随便翻开一个博客,都会有较为详细 ...

  3. 一维数组的 K-Means 聚类算法理解

    刚看了这个算法,理解如下,放在这里,备忘,如有错误的地方,请指出,谢谢 需要做聚类的数组我们称之为[源数组]需要一个分组个数K变量来标记需要分多少个组,这个数组我们称之为[聚类中心数组]及一个缓存临时 ...

  4. 关于fisher判别的一点理解

    最近一个朋友问这方面的一些问题,其实之前也就很粗略的看了下fisher,真正帮别人解答问题的时候才知道原来自己也有很多东西不懂.下面小结下自己对fisher判别的理解: 其实fisher和PCA差不多 ...

  5. 【线性判别】Fisher线性判别(转)

    今天读paper遇到了Fisher线性判别的变体, 所以来学习一下, 所以到时候一定要把PRMl刷一遍呀 以下两篇论文一起阅读比较好: 论文1: https://blog.csdn.net/Rainb ...

  6. 线性判别函数-Fisher 线性判别

    这是我在上模式识别课程时的内容,也有参考这里. 线性判别函数的基本概念 判别函数为线性的情况的一般表达式 式中x是d 维特征向量,又称样本向量, 称为权向量, 分别表示为 是个常数,称为阈值权. 设样 ...

  7. PRML读书会第四章 Linear Models for Classification(贝叶斯marginalization、Fisher线性判别、感知机、概率生成和判别模型、逻辑回归)

    主讲人 planktonli planktonli(1027753147) 19:52:28 现在我们就开始讲第四章,第四章的内容是关于 线性分类模型,主要内容有四点:1) Fisher准则的分类,以 ...

  8. 谱聚类 Spectral Clustering

    转自:http://www.cnblogs.com/wentingtu/archive/2011/12/22/2297426.html 如果说 K-means 和 GMM 这些聚类的方法是古代流行的算 ...

  9. Fisher线性判别分析

    Fisher线性判别分析 1.概述 在使用统计方法处理模式识别问题时,往往是在低维空间展开研究,然而实际中数据往往是高维的,基于统计的方法往往很难求解,因此降维成了解决问题的突破口. 假设数据存在于d ...

随机推荐

  1. 服务器主体 "sa" 无法在当前安全上下文下访问数据库 XXX[SQLSTATE 08004] (错误 916). 该步骤失败。

    作业脚本为use XXX go 修改为选择XXX数据库

  2. python3 IEDriver抓取时报数据

    最近做了测试抓取XX时报的数据,由于需要事先登录,并且有验证码,关于验证码解决有两个途径:一是利用打码平台,其原理是把验证码的图片上传发送给打码平台, 然后返回其验证码.二就是自己研究验证码技术问题. ...

  3. 用keras实现lstm 利用Keras下的LSTM进行情感分析

    1    I either LOVE Brokeback Mountain or think it’s great that homosexuality is becoming more accept ...

  4. Topic Model的分类和设计原则

    Topic Model的分类和设计原则 http://blog.csdn.net/xianlingmao/article/details/7065318 topic model的介绍性文章已经很多,在 ...

  5. [Functional Programming] Using Last monoid with Maybe

    Imaging we have a deck of cards, eveytimes we need to pick one card from deck, the result we want to ...

  6. OpenGL ES 3.0之Shading Language(八)

    每个OpenGL ES 3.0程序要求一个顶点着色器和一个片段着色器去渲染一个图形.着色器概念是API 的中心,本篇将介绍着色器语言部分包含下面几项 1.变量和变量类型 2.矢量和矩阵创建及选择 3. ...

  7. sonarqube 5.6

    转载:https://www.jianshu.com/p/402987500bfd 一. 简介 Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量.通过插件形式,可以支持包括java,C ...

  8. [Canvas]越来越近的女孩

    本作比前作增加了控制功能,观看动态效果请点此下载代码用Chrome或Firfox浏览器观看. 图例: 代码: <!DOCTYPE html> <html lang="utf ...

  9. Android NDK开发篇(六):Java与原生代码通信(异常处理)

    一.捕获异常 异常处理是Java中的功能.在Android中使用SDK进行开发的时候常常要用到.Android原生代码在运行过程中假设遇到错误,须要检測,并抛出异常给Java层.运行原生代码出现了问题 ...

  10. 微信小程序 - 分包加载(预下载)

    开发者可以通过配置,在进入小程序某个页面时,由框架自动预下载可能需要的分包,提升进入后续分包页面时的启动速度.对于独立分包,也可以预下载主包. 配置方法 预下载分包行为在进入某个页面时触发,通过在 a ...