机器学习实战(一)KNN

KNN算法

距离度量,监督学习算法。假设有一个待预测数据,遍历此节点与所有点的距离,选择前K个,最大投票法。

最近邻算法K=1

对异常值不敏感,无数据输入假设,精度高;计算复杂度高,空间复杂度高;适用于数值型和标称型(分类数据)

总结出每个算法的优缺点,使用场景,碰到特定问题才可以知道用什么算法。数据和特征决定了模型的上线,算法逼近上限。

常用的向量距离度量准则:欧氏距离、曼哈顿距离、皮尔逊系数、信息熵、巴氏距离、马氏距离、汉明距离、切比雪夫距离

距离计算(以欧氏距离为例)

def classify0(inX, dataSet, labels, k):
#numpy函数shape[0]返回dataSet的行数
dataSetSize = dataSet.shape[0]
#在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向)
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
#二维特征相减后平方
sqDiffMat = diffMat**2
#sum()所有元素相加,sum(0)列相加,sum(1)行相加
sqDistances = sqDiffMat.sum(axis=1)
#开方,计算出距离
distances = sqDistances**0.5
#返回distances中元素从小到大排序后的索引值
sortedDistIndices = distances.argsort()

#读取前K个数据的类别,计算类别次数
#classcount是一个字典
Class Count = {}
for i in range(K):
  voteIlable = labels[sortedDistIndices[i]]
  #得到labels数组
  #如果字典有该key,value+1;没有创建key然后value+1
  ClassCount[voteIlabel] = ClassCount.get(voteIlabel,0) + 1
  #classCount = {dict}{‘A类’:2,‘B类’:1}(K=3)
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
#list格式。按item排序,item是类别次数。排好后取第一个元素的key,就是待分类数据的标签


数据可视化
对数据进行结构化分析,是一个非常重要的步骤。
PCA降维。。。

归一化
为什么要归一化?如果特征样本不进行归一化或者说特征空间差距很大,必然导致欠拟合问题。
如果数据差别不是很大,可以不进行归一化。但是差距过大必须进行归一化。
否则偏向于训练大的数据,小的数据相当于被忽略。

归一化中最简单的方法:  max-min 归一化
"""
函数说明:对数据进行归一化
Parameters:
dataSet - 特征矩阵
Returns:
normDataSet - 归一化后的特征矩阵
ranges - 数据范围
minVals - 数据最小值
Modify:
2017-03-24
"""

def autoNorm(dataSet):
# 获得数据的最小值最大值,返回一个列表,返回dataSet矩阵中每一列最小(最大)的元素。
    #参数为1时返回行的最小最大值
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
# 最大值和最小值的范围,range = 最大值列表 - 最小值列表 = 差值列表
ranges = maxVals - minVals
# shape查看矩阵或数组的维数。shape(dataSet)返回dataSet的矩阵行列数
   #np.zeros()给数组赋初值0,生成一个同dataSet同规格的全0矩阵
normDataSet = np.zeros(np.shape(dataSet))
# 返回dataSet矩阵的行数(读取矩阵第一维的长度)
m = dataSet.shape[0]
# dataSet矩阵每一列数据都减去每一列的最小值
normDataSet = dataSet - np.tile(minVals, (m, 1))
# 除以最大和最小值的差,得到归一化数据
  #DataSet矩阵每一列数据除以每一列的差值
normDataSet = normDataSet / np.tile(ranges, (m, 1))
# 返回归一化数据结果,数据范围,最小值
return normDataSet, ranges, minVals


Sklearn安装
装之前需要两个库,numpy+mkl和scipy。或者直接装anaconda或者pycharm,不需要预装库。
模块
算法的好坏,还需要调参。KNN中weights和neighbor很重要。

#建立对象,
neigh = KNN(n_neighbors=3, algorithm='auto')
#训练
neigh.fit(trainingMat, hwLabels)
#测试
classfierResult = neigh.predict(vectorUnderTest)

加州大学欧文学院机器学习数据集仓库UCI,里面有大量数据集,用于验证ML算法
http://archive.ics.uci.edu/ml
选择view all data sets,可以选择分类、回归、聚类或其他类型数据集;也可按属性类型、数据结构。。。
Ctrl+F 光学手写数字识别,点进去有基本介绍。还会附加相关论文。

转载于:https://www.cnblogs.com/cherry-BAIL/p/11146993.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值