一、机器学习

什么是机器学习,机器学习就是利用数学公式,总结出数据中的规律

一般步骤为:收集数据---建立数学模型训练---预测

机器学习有几百种算法,但可以总结为十大经典算法

二、KNN算法(k-nearest neighbors)

通过寻找k个距离最近的数据,来确定当前数据值的大小或类别,是机器学习中最简单的一个算法

knn算法有两个方面,一是预测连续型数据,称为回归,二是分类

knn算法的根本就是直线距离,选择最近的k个值

1.knn算法的回归:预估房价

在某城市小明有一套房子,他现在想要卖掉这栋房子,不知如何定价

现在小明选择四栋离他房子最近的房子,并询问房主他们购置房子的价格,进行相加求平均,

房子1=150万,房子2=160万,房子3=140万,房子4=150万,平均值为(150+160+140+150)/4=150万

小明就把150万作为房子的售价

其中选出的4就为k,k个数据的平均值这种叫回归

2.knn算法的分类:宿舍分配

其实和回归相似的地方是也是找k个最近举例的数据,不同点是分类不是要求平均值,而是在选择的k个数据里判断哪个类型最多,那我们要测的这个数据就归为哪一类。

1)宿舍分配

我们以爱好学习,对学习一般般,不爱学习这三种类型区别学生

下面是收集到的大二大三大四学生的数据,第一列是平均一年旅游的路程,第二列是平均每天学习的时间,第三列为每天吃的零食重量,最后的数字有3有2有1,是辅导员根据学生平时表现所给的标签,1为爱好学习,2为对学习一般般,3为不爱学习。

前三列是学生情况,第四列是标签结果

现在用代码绘图呈现三种分类情况

import matplotlib.pyplot as plt#导入绘图库
import numpy as np#导入numpy库
data=np.loadtxt(r"D:\learn\datingTestSet2.txt")#读取文件
#筛选信息
data_1=data[data[:,-1]==1]#选取文件中所有行的最后一列判断是否为1,把为1的提取出来作为数据data_1
data_2=data[data[:,-1]==2]#选取文件中所有行的最后一列判断是否为2,把为1的提取出来作为数据data_2
data_3=data[data[:,-1]==3]#选取文件中所有行的最后一列判断是否为3,把为1的提取出来作为数据data_3
# print(type(data_1))#<class 'numpy.ndarray'>
fig=plt.figure()#创建一个图像对象,默认是二维的
ax=plt.axes(projection='3d')#这里红色的字体都是固定的单词不能轻易改变,设定三维
ax.scatter(data_1[:,0],data_1[:,1],data_1[:,2],c='r',marker="o")#注意marker的拼写
ax.scatter(data_2[:,0],data_2[:,1],data_2[:,2],c='b',marker='+')
ax.scatter(data_3[:,0],data_3[:,1],data_3[:,2],c='y',marker='^')
ax.set(xlabel='x',ylabel='y',zlabel='z')#注意label的拼写
plt.show()

这里我们把前三列作为xyz轴空间坐标系的三个变量,最后的标签呈现以不同色不同形状的点,这样可以清晰观察到三种不同类别的人群,那么我们大一新生收集到三个信息,也就可以在图上标出点,然后选距离最近的k个数据,例如选择的五个,其中三个是红色,一个是蓝色一个是黄色,那么该学生就会被分到红色类中也就是标签1,爱好学习的学生,这就是分类。

上面只是用代码实现可视化并介绍了knn算法分类的含义,那么下面我们用代码实现数据预测

import numpy as np
from sklearn.neighbors import KNeighborsClassifier#导入sklearn库的knn分类算法

data=np.loadtxt(r"D:\learn\datingTestSet2.txt")#读取文件
data1=data[:,:-1]#全部行的所有列到-1列,不包括-1列
data2=data[:,-1]#全部行的-1列

choise=KNeighborsClassifier(n_neighbors=5)#从众多数据中选择五条作为训练
choise.fit(data1,data2)#进行训练
print(choise.predict([[14488,7.153469,1.673904]]))
#训练成功后进行测试,测试的数据是从原数据中拿出来的,这样的目的是,验证代码判断和原数据是否相同
#注意这里为什么是[[14488,7.153469,1.673904]],有两个中括号,因为这里会有个标签预测,也就是1,2,3
#一个中括号是一维数组,这里我们是二维数组
predict_data=[
    [34567,4.37289,0.23786],
    [42902,5.28395,1.38215],
    [37829,8.33333,8.22223]
]#进行预测,这里就是大一新生产生的新数据
print(choise.predict(predict_data))

我们测试发现机器预测是跟我们原数据一样的,这里很容易搞混一件事情,我们给代码的数据文件是他们用来选择最近距离k的,所以我们拿原数据去测试不是毫无意义,代码运行的时候不是查到了这串数据就把结果展示,无论数据是从原数据文件中拿出来的?还是新数据?代码运行只会把这串数据拿去挑k个数据,然后分类。

瞎买那我们拿大一学生数据(新数据)进行预测。

2)鸢尾花判断

训练数据,上千条,类型为1是鸢尾花,是0不是鸢尾花

我们需要测试的数据,该数据是已经得到实际确认类型的,用于我们测试代码分类的正确率

下面我们鸢尾花的判断

import pandas as pd#导入pandas读取excel文件
from sklearn.neighbors import KNeighborsClassifier#导入库

train_data=pd.read_excel(r"D:\learn\鸢尾花训练数据.xlsx")#读取训练数据文件

test_data=pd.read_excel(r"D:\learn\鸢尾花测试数据.xlsx")#读取测试数据文件

trainx=train_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]#二维数组,根据列名
trainy=train_data[['类型_num']]#二维数组,根据列名获得

testx=test_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
testy=test_data[['类型_num']]

choice=KNeighborsClassifier(n_neighbors=5)#选最近5个数据
choice.fit(trainx,trainy)#训练

train_predict=choice.predict(trainx)#用训练数据进行测试
complete1=choice.score(trainx,trainy)#将测试的结果和训练数据比对验证
print(complete1)

test_predict=choice.predict(testx)#用测试数据进行预测
complete2=choice.score(testx,testy)#将得到的结果和测试数据结果进行比对
print(complete2)

这里我们拿训练数据(上千条数据)测试得到比对正确率为0.96……

预测正确率为1.0,这里我们预测数据很少所以正确率比较高

3)标准化

标准化有两种一是归一化,二是z标准化

归一化,最后数值在[0,1]范围内

z标准化就是用(x-均值)/标准差得到的

实际使用z标准化比较多,下面我们来了解一下z标准化,使用scale()函数

根据上面两个例子,我们能发现,第一个宿舍分配中,三个数据的数值所在范围相差很大,这是由于单位不同的原因,而我们knn算法无非就是求直线距离,那宿舍分配举例

如果xyz之间数值相差很大,那谁大这个式子的值就由谁决定,所以我们为了减小这个误差,就对数据进行标准化

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier#导入sklearn库的knn分类算法
from sklearn.preprocessing import scale

data=np.loadtxt(r"D:\learn\datingTestSet2.txt")#读取文件
data1=data[:,:-1]#全部行的所有列到-1列,不包括-1列
data2=data[:,-1]#全部行的-1列

data11=pd.DataFrame(scale(data1))
#这里对data1,也就是数据三列进行标准化,标准化后依旧以表格形式赋值给data11,这里data11就是data1标准化过的
choise=KNeighborsClassifier(n_neighbors=5)#我们要判断某个点的时候,找五个最近点
choise.fit(data11,data2)#进行训练
compelete1=choise.score(data11,data2)
print(compelete1)

也可以对第二个鸢尾花例子进行标准化

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import scale

train_data=pd.read_excel(r"D:\learn\鸢尾花训练数据.xlsx")
test_data=pd.read_excel(r"D:\learn\鸢尾花测试数据.xlsx")
trainx=train_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
trainy=train_data[['类型_num']]
testx=test_data[['萼片长(cm)','萼片宽(cm)','花瓣长(cm)','花瓣宽(cm)']]
testy=test_data[['类型_num']]
trainx=pd.DataFrame(trainx)
trainx['萼片长标准化']=scale(trainx['萼片长(cm)'])
trainx['萼片宽标准化']=scale(trainx['萼片宽(cm)'])
trainx['花瓣长标准化']=scale(trainx['花瓣长(cm)'])
trainx['花瓣宽标准化']=scale(trainx['花瓣宽(cm)'])

testx=pd.DataFrame(testx)
testx['萼片长标准化']=scale(testx['萼片长(cm)'])
testx['萼片宽标准化']=scale(testx['萼片宽(cm)'])
testx['花瓣长标准化']=scale(testx['花瓣长(cm)'])
testx['花瓣宽标准化']=scale(testx['花瓣宽(cm)'])

choice=KNeighborsClassifier(n_neighbors=5)
choice.fit(trainx,trainy)

train_predict=choice.predict(trainx)#用训练数据进行测试
complete1=choice.score(trainx,trainy)#将测试的结果和训练数据比对验证
print(complete1)

test_predict=choice.predict(testx)#用测试数据进行预测
complete2=choice.score(testx,testy)#将得到的结果和测试数据结果进行比对
print(complete2)

,因为原数据本身就没咋有差距,所以结果基本上是不变的

更多推荐