k最近邻算法
1. 原理
- 数据映射到高维空间中的点
- 找出k个最近的样本
- 投票结构
2.如何衡量距离
数学中距离满足三个要求
- 必须为正数
- 必须对称
- 满足三角不等式
3.闵可夫斯基距离(Minkowski):
- 汉哈顿距离
- 欧氏距离
- 切比雪夫距离
公式:
q越大,差异越大的维度对最终距离影响越大
q = 1时为曼哈顿距离
q = 2时为欧式距离
q无穷大时为切比雪夫距离
4.马氏距离
考虑数据分布
5.KNN分类实现的简单案例
from dataminer.baseClassifier.baseClassifier import BaseClassifier
from dataminer.mltools.stats.distance import Distance
import operator
class KNNClassifier(BaseClassifier):
def __init__(self,traingfilesname,fieldsrols,delimiter,k=10):
super(KNNClassifier,self).__init__(traingfilesname,fieldsrols,delimiter)
self.k=k
def _findNearestNeighbor(self,item):
neighbors=[]
for idx,onerecord in enumerate(self._data['prop']):
distance=Distance.computeManhattanDistance(onerecord,item)
neighbors.append([idx,distance,self._data['class'][idx]])
neighbors.sort(key=lambda x:x[1])
nearestk={}
for i in range(self.k):
nearestk.setdefault(neighbors[i][2],0)
nearestk[neighbors[i][2]]+=1
return nearestk
def predicate(self,item):
nearestk=self._findNearestNeighbor(item)
ps=sorted(nearestk.items(),key=lambda x:x[1],reverse=True)
return ps[0][0]
class Distance(object):
@staticmethod
def computeManhattanDistance(vector1,vector2,q=1):
"""
:param vector1: [1,2,3,45,6]
:param vector2: [1,2,4,56,7]
:return:
"""
distance=0.
n=len(vector1)
for i in range(n):
distance +=pow(abs(vector1[i]-vector2[i]),q)
return round(pow(distance,1.0/q),5)
@staticmethod
def computeEuDistance(vector1,vector2):
return Distance.computeManhattanDistance(vector1,vector2,2)
朴素贝叶斯算法
1. 概率的基本性质
- 事件的概率在0~1之间,即0<=P(A)<=1
- 必然事件的概率为1
- 不可能事件的概率为0
- 概率的加法公式:P(A并B) = P(A) + P(B)(当事件A与B互斥时)
- 事件B与事件A互为对立事件,P(A并B)=1.由加法公式得到P(A) = 1 - P(B)
2. 概率的基本知识
1)先验概率P(A)
2)后验概率(条件概率)P(A|B)
3)概率乘法公式:P(AB) = P(A) * P(B|A)
P(A|B) = P(A) * P(B|A) / P(B)
3. 全概率公式
P(B) = P(A1B + A2B + ··· + AnB)
4. 贝叶斯定理
P(Ak|B) = P(AkB) / P(B) (k = 1,2,···,n)
5. 应用场景:垃圾邮件过滤、新闻分类、金融风险识别
6.
1)先验概率:事件A1, A2, ···, An看作是导致事件B发生的“原因”,在不知事件B是否发生的情况下,它们的概率为P(A1), P(A2), ···, P(An),通常称为先验概率。
2)后验概率:现在有了新的信息已知(B发生),我们对A1, A2, ··· An发生的可能性大小P(A1|B), P(A2|B), ···, P(An|B)有了新的估价,成为“后验概率”。
3)全概率公式看成“由原因推结果”,而贝叶斯公式的作用在于“由结果推原因”:现在一个“结果”A已经发生了,在众多可能的“原因”中,到底是哪一个导致了这一结果。故贝叶斯公式也称为“逆概公式”。
7. 代码案例:
from dataminer.baseClassifier.baseClassifier import BaseClassifier
class NativeBayesianClassifier(BaseClassifier):
def __init__(self, datafilename, fieldroles, delimiter):
super(NativeBayesianClassifier, self).__init__(datafilename, fieldroles, delimiter)
self._postProb = dict() # 条件概率,