机器学习:
现有鸢尾花有三类分别是:山鸢尾、杂色鸢尾、维吉尼亚鸢尾,无法通过肉眼分辨,假如非植物学专家想要去分辨某一个鸢尾花是哪一种,就需要用到机器学习。
机器学习一般思路(有监督学习):
1、先由人工去采集鸢尾花,并测量每朵鸢尾花的各种性状,比如:花瓣长、花瓣宽、花萼长、花萼宽,然后由植物学专家认定每一朵鸢尾花类别,其中每一个类别分配一个值,比如山鸢尾=0、杂色鸢尾=1、维吉尼亚鸢尾=2。
2、使用机器学习算法,比如:K近邻算法、朴素贝叶斯、决策树等训练得到模型(一个以鸢尾花性状为自变量鸢尾花类别为因变量的函数)
3、将未知种类的鸢尾花性状特征输入函数得到类别结果
K近邻算法(knn):
1、解释
k:表示选择的“最近邻居”的数量(通常由用户指定,如K=3、5等)
近邻:指在特征空间中距离目标样本最近的训练样本。
2、示例
已知鸢尾花如下:
名称 | 花瓣长 | 花瓣宽 | 花萼长 | 花萼宽 | 结果 |
---|---|---|---|---|---|
a | 5 | 3.6 | 1.4 | 0.2 | 0 |
b | 6.4 | 3.1 | 5.5 | 1.8 | 2 |
c | 5.9 | 3.0 | 5.1 | 1.8 | 2 |
d | 5.6 | 3.0 | 4.1 | 1.3 | 1 |
e | 5.4 | 3.4 | 1.7 | 0.2 | 0 |
f | 5.4 | 3.0 | 4.5 | 1.5 | 1 |
g | 6.7 | 3.1 | 5.6 | 2.4 | 2 |
h | 6.7 | 3.0 | 5.2 | 2.3 | 2 |
i | 5.7 | 2.9 | 4.2 | 1.3 | 1 |
g | 5.7 | 2.5 | 5.0 | 2.0 | 2 |
k | 6.7 | 3.1 | 4.4 | 1.4 | 1 |
l | 6.4 | 2.8 | 5.6 | 2.1 | 2 |
m | 7.2 | 3.0 | 5.8 | 1.6 | 2 |
n | 6.9 | 3.1 | 5.1 | 2.3 | 2 |
o | 5.0 | 3.5 | 1.6 | 0.6 | 0 |
任取两种性状比如花瓣长、花瓣宽来训练模型,如下图所示:
当有一个未知鸢尾花p其花瓣长为6.6,花瓣宽为2.8,在坐标系中表示为如上图所示p=(6.6,2.8),想要预测他的类别可以带入以上模型,由距离可以得到最邻近的五个点为(b,k,n,h,i),对应类别为(2,1,2,2,1),由于离鸢尾花p最近的五个点中2类别占多数,所以判断该鸢尾花p为类别2的鸢尾花。
以上机器学习K近邻算法使用python实现如下:
import numpy as np
from collections import Counter
class MyKNeighborClassifier(object):
#初始化
def __init__(self,K_Neighbor):
#赋值近邻数量
self.k_neighbor = k_neighbor
#训练
def fit(self,X,y):
#将样本特征与标签转化为numpy方便计算
X = np.array(X)
y = np.array(y)
#判断参数是否正确
if X.ndim!=2 or y.ndim!=1 of X.shape[0]!=y.shape[0]:
raise ValueError("参数错误")
#赋值给类属性
self.X = X
self.y = y
#预测
def predict(self,X):
#将样本特征转化为numpy方便计算
X = np.array(X)
#判断参数是否正确
if X.ndim!=2 or X.shape[1]!=self.X.shape[1]:
raise ValueError("参数错误")
#创建结果数组
results=[]
#循环待预测样本特征
for x in X:
#计算当前待测样本特征到所有训练样本特征的距离
distance = ((self.X - x) ** 2).sum(axis=1)
#获取k_neighbor个最小距离序号
idxs = np.argsort(a=distance)[:self.k_neighbor]
#获取k_neighbor个最小距离序号对应的标签
lables = self.y[idxs]
#计算最大概率标签
lable = Counter(lables).most_common(1)[0][0]
#将当前待测样本特征对应标签加入结果数组
results.append(lable)
#将结果数组转numpy数组后返回
return np.array(results)