自定义knn算法操作iris.data数据

第二课:学习knn算法,

简单易于理解:这个算法的重点在于k的取值,是这样的,当你想判别一个未知的点的类别时,我们采取选取离他最近的k个点,这k个点为已知类别,这k中哪一类的数量多,我们就把未知点归为哪一类,简单点就是,周围是什么人,它就是什么人。

这个是一个手写的knn算法,也可以直接调用sklearn库中的函数

from sklearn import neighbors
from sklearn import datasets

knn = neighbors.KNeighborsClassifier()
# 花的萼长,宽,花瓣的长,宽
# 字典
iris = datasets.load_iris()

print(iris)

knn.fit(iris.data, iris.target)

predictedLabel = knn.predict([[6.2, 3.4, 5.4, 2.3]])
print(predictedLabel)

接下来就是自己写的knn算法,不难的

第一步:读取数据,分为测试数据和训练数据集

# 读取文件数据--csv
# 随机加进trainset和testset
def loadDataset(filename, split, trainSet=[], testSet=[]):
#这里是一个以csv读取txt,并且转化为list的模式
    with open(filename, 'rt') 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])
#这里random随机生成小于1的数,spilt实际上代表了划分比例
            if random.random() < split:
                trainSet.append(dataSet[x])
            else:
                testSet.append(dataSet[x])

第二步,获取testData中点的k个临近点,其中涉及到一个计算点到点的距离,这里不仅仅限制在2,3维

# 多维计算距离///,length可以表示维度
def euclideanDistance(instance1, instance2, length):
    distance = 0
    for x in range(length):
        print(type(instance1[x]), instance1[x])
        print('----------------------')
        print(instance2[x])
        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))
#表示根据第0个元素排序
    distances.sort(key=operator.itemgetter(1))
    neighbors = []
    # 取前k个距离
    for x in range(k):
        neighbors.append(distances[x][0])
    return neighbors

 第三步,对k个临近点分类,找出对多的那一类

def getResponse(neighbors):
    classVotes = {}
    for x in range(len(neighbors)):
        response = neighbors[x][-1]
        if response in classVotes.keys():
            classVotes[response] += 1
        else:
            classVotes[response] = 1
            sortedVotes = sorted(classVotes.items(), key=lambda classVotes: classVotes[1], reverse=False)
    return sortedVotes[-1]
第四步,验证,查看正确率
def getAccuracy(testSet, predictions):
    print('--------------------------------------------')
    print(predictions)
    correct = 0
    for x in range(len(testSet)):
        print(testSet[x][-1], predictions[x])
        if testSet[x][-1] == predictions[x]:
            correct += 1
    return (correct / float(len(testSet))) * 100.0

第五步:定义主函数:

def main():
    trainSet = []
    testSet = []
    split = 0.67
    loadDataset(r'iris.data.txt', split, trainSet, testSet)
    predictions = []
    k = 3
    for x in range(len(testSet)):
        neighbors = getNeighbors(trainSet, testSet[x], k)
        result = getResponse(neighbors)
        predictions.append(result[0])
        print('>predicted=' + repr(result) + ',actual=' + repr(testSet[x][-1]))
    accuracy = getAccuracy(testSet, predictions)
    print("Accuracy: " + repr(accuracy) + '%')

猜你喜欢

转载自blog.csdn.net/qq_33420835/article/details/84035020