机器学习算法之 kNN k-邻近算法


 kNN 算法

 K-临近算法,最基本的机器学习算法之一,简单讲就是已有标本数据,计算预测的数据和每个标本数据的特征距离(如欧氏距离),

距离近的标本数据类型作为预测数据的类型。

 原理:已有训练样本集,新的数据和训练样本特征比较,训练样本集中取特征最相似数据的标签。一般来说先找前K个最相似的

数据,这就是K-邻近算法的出处,然后K个最相似数据取出现次数最多数据的分类作为结果。

 实现:

 1、 找出与测试数据距离最近的k个数据,取其中出现次数最多的数据分类

 2、 归一化数据:有时特征范围不一样导致影响计算,把所有特征转化到0-1之间,newValue=oldValue/(max-min)

 距离计算距离公式:

 两个向量(X1,Y1)和(X2,Y2)的距离
在这里插入图片描述
 算法特点:
  优点:精度高,对异常值不敏感,无数据输入假定
  缺点:计算复杂度高、空间复杂度高

 python 代码例子

如下函数保存到kNN.py

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    #先把inX构造成重复dataSetSize次的数组,(dataSetSize, 1)意思是变成二维数组,不是一维数组里重复。再减去dataSet
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet 
    sqDiffMat = diffMat ** 2
    sqDinstance = sqDiffMat.sum(axis=1) 
    distances = sqDinstance ** 0.5 
    sortDistIndicies = distances.argsort()
    classCount={}
    for i in range(k):
       voteIlabel = labels[sortDistIndicies[i]] 
       classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1

    #print(classCount)     
    sortClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True)
    #print(sortClassCount)     

    return sortClassCount[0][0]  

测试代码,保存到classifyTest.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-
from numpy import * 
import operator  
import kNN
  
def createDataSet():
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
    labels = ['A', 'A', 'B', 'B']
    return group, labels


group, labels = createDataSet()    
#classRes = classify0([0,0], group, labels, 3)
#print(classRes)
def execute(inX):
    group, labels = createDataSet()    
    return kNN.classify0(inX, group, labels, 3)

测试

>>> import classifyTest
>>> classifyTest.execute([0,0])
'B'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
现在我们回到LDA的原理上,我们在第一节说讲到了LDA希望投影后希望同一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大,但是这只是一个感官的度量。现在我们首先从比较简单的二类LDA入手,严谨的分析LDA的原理。     假设我们的数据集D={(x1,y1),(x2,y2),...,((xm,ym))}D={(x1,y1),(x2,y2),...,((xm,ym))},其中任意样本xixi为n维向量,yi∈{0,1}yi∈{0,1}。我们定义Nj(j=0,1)Nj(j=0,1)为第j类样本的个数,Xj(j=0,1)Xj(j=0,1)为第j类样本的集合,而μj(j=0,1)μj(j=0,1)为第j类样本的均值向量,定义Σj(j=0,1)Σj(j=0,1)为第j类样本的协方差矩阵(严格说是缺少分母部分的协方差矩阵)。     μjμj的表达式为: μj=1Nj∑x∈Xjx(j=0,1) μj=1Nj∑x∈Xjx(j=0,1)     ΣjΣj的表达式为: Σj=∑x∈Xj(x−μj)(x−μj)T(j=0,1) Σj=∑x∈Xj(x−μj)(x−μj)T(j=0,1)     由于是两类数据,因此我们只需要将数据投影到一条直线上即可。假设我们的投影直线是向量ww,则对任意一个样本本xixi,它在直线ww的投影为wTxiwTxi,对于我们的两个类别的中心点μ0,μ1μ0,μ1,在在直线ww的投影为wTμ0wTμ0和wTμ1wTμ1。由于LDA需要让不同类别的数据的类别中心之间的距离尽可能的大,也就是我们要最大化||wTμ0−wTμ1||22||wTμ0−wTμ1||22,同时我们希望同一种类别数据的投影点尽可能的接近,也就是要同类样本投影点的协方差wTΣ0wwTΣ0w和wTΣ1wwTΣ1w尽可能的小,即最小化wTΣ0w+wTΣ1wwTΣ0w+wTΣ1w。综上所述,我们的优化目标为: argmaxwJ(w)=||wTμ0−wTμ1||22wTΣ0w+wTΣ1w=wT(μ0−μ1)(μ0−μ1)TwwT(Σ0+Σ1)w argmax⏟wJ(w)=||wTμ0−wTμ1||22wTΣ0w+wTΣ1w=wT(μ0−μ1)(μ0−μ1)TwwT(Σ0+Σ1)w     我们一般定义类内散度矩阵SwSw为: Sw=Σ0+Σ1=∑x∈X0(x−μ0)(x−μ0)T+∑x∈X1(x−μ1)(x−μ1)T Sw=Σ0+Σ1=∑x∈X0(x−μ0)(x−μ0)T+∑x∈X1(x−μ1)(x−μ1)T     同时定义类间散度矩阵SbSb为: Sb=(μ0−μ1)(μ0−μ1)T Sb=(μ0−μ1)(μ0−μ1)T     这样我们的优化目标重写为: argmaxwJ(w)=wTSbwwTSww argmax⏟wJ(w)=wTSbwwTSww     仔细一看上式,这不就是我们的广义瑞利商嘛!这就简单了,利用我们第二节讲到的广义瑞利商的性质,我们知道我们的J(w)J(w)最大值为矩阵S−12wSbS−12wSw−12SbSw−12的最大特征值,而对应的ww为S−12wSbS−12wSw−12SbSw−12的最大特征值对应的特征向量! 而S−1wSbSw−1Sb的特征值和S−12wSbS−12wSw−12SbSw−12的特征值相同,S−1wSbSw−1Sb的特征向量w′w′和S−12wSbS−12wSw−12SbSw−12的特征向量ww满足w′=S−12www′=Sw−12w的关系!     注意到对于二类的时候,SbwSbw的方向恒为μ0−μ1μ0−μ1,不妨令Sbw=λ(μ0−μ1)Sbw=λ(μ0−μ1),将其带入:(S−1wSb)w=λw(Sw−1Sb)w=λw,可以得到w=S−1w(μ0−μ1)w=Sw−1(μ0−μ1), 也就是说我们只要求出原始二类样本的均值和方差就可以确定最佳的投影方向ww了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值