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 光学手写数字识别,点进去有基本介绍。还会附加相关论文。