网络机器人吧社区

Python机器学习第一印象|什么是K邻近算法

北辰文阁 2018-12-11 06:48:20

这是一系列的算法Demo,主要为大家建立一些印象使用,并没有涉及太多算法细节讲解。

目录:

1.什么是K邻近算法
2.K-means算法
3.线性回归
4.逻辑回归
5.决策树
6.随机森林
7.AdaBoost
8.CART
9.SVM
10.贝叶斯

Gartner发布了最新的调研报告展示,Python已经超越了R,成为了数据科学里使用最广泛以及最受欢迎的语言。数据科学的核心还是在于解决几个基本问题:

1.是A还是B?(分类问题)
2.是奇怪还是正常?(判别问题)
3.有多少?有多大?(规模问题)
4.组织结构如何?(结构问题)
5.接下来我应该则呢么做?(计划问题)。

本系列指南将会简单介绍如何使用Python来解决这些数据科学问题,第一个介绍的K-NN算法会详细采用基础的包实现,而接下来的则会通过调用已经成熟的scikit-learn里面的算法包进行阐述,并对算法和代码进行一定的阐述。本文目的在于让新手快速上手,动手跑出模型,如果是已经熟悉了解的同学,可以忽略这些指南。

K

KNN算法模型其实就是整个训练数据集。当需要预测一个新的数据点时,KNN算法会寻找训练数据集中最接近的K个数据点。预测值将会综合考虑这些接近点的值,得出结果后返回。

相似度测量方法取决于数据的类型。在连续型数值数据中,常常使用欧式距离。其他如分类或者二进制数据,则使用汉明距离。

在回归问题中,常以预测属性值的平均值返回。分类问题中则返回最频繁类。

这次指南的解决问题数据科学中的第一个问题:是A还是B?(分类问题)

实例是IRIS数据的判别,Python代码写为下列七个部分:

1.下载数据
2.加载数据
3.计算相似度
4.获取邻近数据点
5.估算预测值
6.计算精确度
7.主函数运行
from sklearn import datasets       
#引进sklearn的datasets包,主要用于下载本次计算需要的IRIS数据

import pandas as pd                
#引进pandas,主要用于加载数据并保存处理

import csv                        
#引进CSV,主要用于读取数据

import random                      
#引进Random,主要用于切割训练集和测试集

import math                        
#引进Math,主要用于算法中的数学计算

import operator                    
#引进operator包
iris = datasets.load_iris()        
#下载IRIS数据并保存本地

df = pd.DataFrame(iris.data)      
#将下载数据封装进pd

df[4] = iris.target
#加载目标列

target_dict = {
   0:'Iris-setosa',
   1:'Iris-versicolor',
   2:'Iris-virginica'}
#目标列与实际含义映射字典

df[4] = df[4].apply(lambda x: target_dict.get(x))  
#目标列映射为实际含义

df.to_csv('iris.data', sep=',', encoding='utf-8',
               index=False,header=False)
#将数据保存为CSV
#加载数据模块,设置分割比例,划分为训练集和测试集。

def loadDataset(filename, split, trainingSet=[] , testSet=[]):    with open(filename, 'rb') as csvfile:        lines = csv.reader(csvfile)        dataset = list(lines)        
       for x in range(len(dataset)-1):            
           for y in range(4):                dataset[x][y] = float(dataset[x][y])            
               if random.random() < split:                    trainingSet.append(dataset[x])            
               else:                    testSet.append(dataset[x])
#计算两个数据点之间的距离

def euclideanDistance(instance1, instance2, length):    distance = 0    for x in range(length):        distance += pow((instance1[x] - instance2[x]), 2)    
   return math.sqrt(distance)
#获取满足条件的邻近点

def getNeighbors(trainingSet, testInstance, k):    distances = []    length = len(testInstance)-1    for x in range(len(trainingSet)):        dist = euclideanDistance(testInstance, trainingSet[x], length)        distances.append((trainingSet[x], dist))    distances.sort(key=operator.itemgetter(1))    neighbors = []    
   for x in range(k):        neighbors.append(distances[x][0])    
   return neighbors
#根据邻近点集合估算预测值

def getResponse(neighbors):    classVotes = {}    
   for x in range(len(neighbors)):        response = neighbors[x][-1]        
       if response in classVotes:            classVotes[response] += 1        else:            classVotes[response] = 1    sortedVotes = sorted(classVotes.iteritems(), key=operator.itemgetter(1), reverse=True)    
   return sortedVotes[0][0]
#计算精确度

def getAccuracy(testSet, predictions):    correct = 0    for x in range(len(testSet)):        
       if testSet[x][-1] == predictions[x]:            correct += 1    return (correct/float(len(testSet))) * 100.0
#主函数运行

def main():    # 准备数据    trainingSet=[]    testSet=[]    split = 0.67    loadDataset('iris.data', split, trainingSet, testSet)    
   print 'Train set: ' + repr(len(trainingSet))    
   print 'Test set: ' + repr(len(testSet))    
   # 预测    predictions=[]    k = 3    for x in range(len(testSet)):        neighbors = getNeighbors(trainingSet, testSet[x], k)        result = getResponse(neighbors)        predictions.append(result)        print('> predicted=' + repr(result) + ', actual=' + repr(testSet[x][-1]))
   #输出每个测试结果    accuracy = getAccuracy(testSet, predictions)    print('Accuracy: ' + repr(accuracy) + '%')
   
   
   
#运行主程序

main()
#结果输出:

Train set: 97 Test set: 52 > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-setosa', actual='Iris-setosa' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-versicolor', actual='Iris-versicolor' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-versicolor', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' > predicted='Iris-virginica', actual='Iris-virginica' Accuracy: 98.07692307692307%

Copyright © 网络机器人吧社区@2017