机器学习
首先介绍一下什么是机器学习,机器学习就是⽤⼤量数据进⾏训练,获取到⼀个数据模型,预测就是应⽤训练的模型,来解决⼀个未知的 问题。就像我们人学习一样,⽤⼤量模拟题作为数据进⾏训练,获得的模型就是解题的⽅法。⾼考就是应⽤你训练获取的模 型,检测你的模型是不是可以解决未知的问题
机器学习的步骤
- 确定与问题相关的数据(明确输⼊)
- 收集与问题相关的数据 (数据准备,学)
- 分析预测结果的类型 (分类,回归,是判断题还是应⽤题)
- 根据预测结果的类型,选择⼀个合适的算法,找到输⼊和输出之间的关系
- ⽤这个算法(套路)去解决新的问题市⾯上的很多机器学习相关的
feature和label
⾃变量和因变量
feature,⾃变量(输⼊)
label,因变量(输出)
label=f(feature)
分类和回归
- 分类: classfication, 数据结果往往是离散的,根据你的学习努⼒情况,判断是否能够通过考试;根据email的内容,判断是否是垃圾邮件
- 回归:regression , 数据结果往往是连续的,基于⻋的品牌,年代,型号,预测⻋的价值(500RMB~500000RMB); 基于每天的卡路⾥摄⼊量和运动量,预测⼀周后的体重(48KG〜80KG);基于树的直径,预测树的年龄(0~500岁)
机器学习步骤注意事项
- 输入输出,就是自变量和因变量,对应feature和label
- 数据集必须是规范、格式统一的,方便计算机程序处理
- 分类的问题答案是有限个,可以理解成选择题和判断题,回归的问题,答案不能用简单的分类来描述
- 确定feature和label之间的关系,有无数的算法,每种算法都有自己的优缺点
- 根据预测的情况,我们可能需要重新调整算法和生成的模型
knn算法
这里介绍机器学习最简单的算法—knn算法,knn算法全称为k-nearest neighbor,最近k个邻居算法
knn算法的原理就是当预测一个新的数据x时,通过判断距离他最近的k的点是什么类型来判断x是什么类型
距离的计算
这里距离计算用的就是欧式距离
二维平面中两点之间的距离
三维平面中两点之间的距离
n维平面中两点之间距离
数据归一化
比如⻢云有100000000元钱,你有1块钱 ,⻢云⾝⾼1⽶6,你⾝⾼1⽶8
数字的单位不同,带来距离的影响需要调整,因此需要数据归一化
代码表示
def minmax(input):
return (input- np.min(input.T,axis=1)) /(np.max(input.T,axis=1)- np.min(input.T,axis=1))
数据标准化
数据均匀分布⽤归⼀化⽐较合适,数据如果是⾮均匀的离散分布,⼀定要⽤标准化。
代码表示:
def standration(input):
return (input- np.mean(input.T,axis=1)) /(np.std(input.T,axis=1))
k值的选择
knn算法最重要的也就是k值的选择,k值的不同,影响着最后结果的不同,k值的选取跟数据集的⼤⼩和离散程度有密切的关系, 经验表明,如果数据量⾜够⼤, k的值为数据集⼤⼩开平⽅是⽐较理想的k值
下面给出一个例子:给出一组数据表示男生的月薪和女生对其是否喜欢,比如8000,0代表男生月薪8000,女生不喜欢;18000,1男生月薪18000,女生喜欢;44000,0,男生月薪44000,女生不喜欢,通过knn算法进行训练,最后给出男生的月薪,预测女生是否喜欢。
下边是完整代码
- feature就是输入,也就是男生月薪
- label就是输出,也就是女生是否喜欢
- 这里预测男生月薪14000,女生是否喜欢
- 这里距离的计算为feature-predictPerson,输入值和预测值之间的差异
- 这里k选取3,将feature-predictPerson的差值从小到大排序,通过前三个输出的结果即可预测男生月薪14000,女生喜欢
import numpy as np
#准备数据
data=np.array([
[8000,0],
[12000,1],
[13000,1],
[15000,1],
[18000,1],
[25000,0],
[40000,0],
[44000,0],
[3000,0]
])
#计算要预测的人的薪资 最接近的几个人的情况
#一个人月薪14000,女生是否喜欢
feature=data[:,0:1]
label=data[:,1:2] #0不喜欢 1喜欢
#创建一个新的候选人 工资14000
predictPerson=np.array([14000])
#计算候选人工资 14000与历史数据工资之间的差异
feature-predictPerson
#对差额数据取绝对值
dis=np.abs(feature-predictPerson)
#[[ 6000]
# [ 2000]
# [ 1000]
# [ 1000]
# [ 4000]
# [11000]
# [26000]
# [30000]
# [11000]]
#对差额绝对值排序,找到差额最小的三个人所在的位置
dis1=np.argsort(dis,axis=0) #axis=0从上到下排序
#排序后的是二维数组,可以进行降维
dis2=dis1.reshape(1,-1) #1行 -1不管多少元素
print(dis2)
#[[2 3 1 4 0 5 8 6 7]]
index=dis2[0]
print(index)
#[2 3 1 4 0 5 8 6 7]
#查看最接近的前三个人的情况
print(label[index[0:3]])
#[[1]
# [1]
# [1]]