当前位置:   article > 正文

python机器学习课程笔记_遍历ndarray的每一行

遍历ndarray的每一行

【KNN回归】

学习课程:B站【超实用】Python实现机器学习算法(全) BV1V7411P7wL

数据集:鸢尾花数据集(Iris.csv)

  1. import numpy as np
  2. import pandas as pd
  3. # 读取鸢尾花数据集,header参数来指定标题的行,默认为0,如果没有标题,则使用None
  4. data=pd.read_csv(r"C:/Users/DELL/Desktop/Iris.csv")
  5. # 使用花萼长度、花萼宽度、花瓣长度来预测花瓣宽度
  6. # 删除不需要的species列(特征),按列删除
  7. data.drop(["species"],axis=1,inplace=True)
  8. # 删除重复记录
  9. data.drop_duplicates(inplace=True)
  1. # 定义KNN的类
  2. class KNN:
  3. """使用python语言实现KNN算法(回归预测)
  4. 该算法用于回归预测,根据前3个特征属性,寻找最近的k个邻居,然后再根据k个邻居的第4个特征
  5. 属性,预测当前样本的第4个特征值
  6. """
  7. def __init__(self,k):
  8. """初始化方法
  9. parameters
  10. ----
  11. k:int 表示邻居的个数
  12. """
  13. self.k=k
  14. def fit(self,X,y):
  15. """训练方法
  16. parameters
  17. ----
  18. X:类数组类型,形状为:{样本数量,特征数量}
  19. 待训练的样本特征(属性)
  20. y:类数组类型,形状为:{样本数量}
  21. 每个样本的目标值(标签)
  22. """
  23. ## 将X转换成ndarray数据类型
  24. self.X=np.asarray(X)
  25. self.y=np.asarray(y)
  26. def predict(self,X):
  27. """根据参数传递的样本,对样本数据进行预测
  28. parameters
  29. ----
  30. X:类数组类型,形状为:{样本数量,特征数量}
  31. 待训练的样本特征(属性)
  32. returns
  33. ----
  34. result:数组类型
  35. 预测的结果
  36. """
  37. X=np.asarray(X)
  38. result=[];
  39. # 对ndarray数组进行遍历,每次取数组中的一行
  40. for x in X:
  41. # 对于测试集中的每一个样本,依次与训练集中的所有样本求距离
  42. dis=np.sqrt(np.sum((x-self.X)**2,axis=1))
  43. # 返回数组排序后,每个元素在原数组(排序之前的数组)中的索引
  44. index=dis.argsort()
  45. # 进行截断,只取前k个元素(取距离最近的k各元素的索引)
  46. index=index[:self.k]
  47. # 计算均值,然后加入到结果列表当中
  48. result.append(np.mean(self.y[index]))
  49. return np.asarray(result)
  50. def predict2(self,X):
  51. """根据参数传递的样本,对样本数据进行预测(考虑权重)
  52. 权重的计算方式:每个节点(每个邻居)距离的倒数/所有节点(所有邻居)的距离倒数之和
  53. parameters
  54. ----
  55. X:类数组类型,形状为:{样本数量,特征数量}
  56. 待训练的样本特征(属性)
  57. returns
  58. ----
  59. result:数组类型
  60. 预测的结果
  61. """
  62. X=np.asarray(X)
  63. result=[];
  64. # 对ndarray数组进行遍历,每次取数组中的一行
  65. for x in X:
  66. # 对于测试集中的每一个样本,依次与训练集中的所有样本求距离
  67. dis=np.sqrt(np.sum((x-self.X)**2,axis=1))
  68. # 返回数组排序后,每个元素在原数组(排序之前的数组)中的索引
  69. index=dis.argsort()
  70. # 进行截断,只取前k个元素(取距离最近的k各元素的索引)
  71. index=index[:self.k]
  72. # 计算所有节点的距离倒数之和,注意最后加上一个很小的值,为了避免除数为零的情况
  73. s=np.sum(1/(dis[index]+0.001))
  74. # 使用每个节点距离的倒数,除以倒数之和,得到权重
  75. weight=(1/(dis[index]+0.001))/s
  76. # 使用邻居节点的标签值,乘以对应的权重,然后相加,得到最终的预测结果
  77. result.append(np.sum(self.y[index]*weight))
  78. return np.asarray(result)
  1. # 测试与训练
  2. t=data.sample(len(data),random_state=0)
  3. train_X=t.iloc[:120,:-1]
  4. train_y=t.iloc[:120,-1]
  5. test_X=t.iloc[120:,:-1]
  6. test_y=t.iloc[120:,-1]
  7. knn=KNN(k=3)
  8. knn.fit(train_X,train_y)
  9. result=knn.predict(test_X)
  10. display(result)
  11. display(np.mean((result-test_y)**2))
  12. display(test_y.values)
  1. # 考虑权重的结果
  2. result2=knn.predict2(test_X)
  3. display(np.mean((result2-test_y)**2))
  1. # 可视化
  2. import matplotlib as mpl
  3. import matplotlib.pyplot as plt
  4. mpl.rcParams["font.family"]="SimHei"
  5. mpl.rcParams["axes.unicode_minus"]=False
  6. plt.figure(figsize=(10,10))
  7. # 绘制预测值
  8. plt.plot(result,"ro-",label="预测值")
  9. # 绘制真实值
  10. plt.plot(test_y.values,"go-",label="真实值")
  11. plt.title("KNN连续值预测展示")
  12. plt.xlabel("节点序号")
  13. plt.ylabel("花瓣宽度")
  14. plt.legend()
  15. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/722107
推荐阅读
相关标签
  

闽ICP备14008679号