Hi, I receive an error message for the code below.
It says TypeError: int() argument must be a string, a bytes-like object or a number, not ‘NoneType’
I believe that the error could lie in the line
´´´
(xx, yy, prediction_grid) = make_prediction_grid(predictors, outcomes, limits, h, k)
´´´
or is related to make_prediction_grid.
Could anyone help me out by any chance? That’d be great!
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as ss
def knn_predict(p, points, outcomes, k=5):
ind = find_nearest_neighbors(p, points, k)
majority_vote(outcomes)
return majority_vote(outcomes[ind])
def find_nearest_neighbors(p, points, k=5):
"""Find the k nearest neighbors of p and return their indices."""
distances = np.zeros(points.shape[0])
for i in range(len(distances)):
distances[i] = distance(p, points[i])
ind = np.argsort(distances)
return ind[0:k]
def majority_vote(votes):
"""Return the most common element in votes."""
vote_counts={}
for vote in votes:
if vote in vote_counts:
vote_counts[vote] += 1
else:
vote_counts[vote]=1
winners=[]
max_count=max(vote_counts.values())
for vote, count in vote_counts.items():
if count == max_count:
winners.append(vote)
def distance(p1, p2):
"""Find the distance between points p1 and p2."""
return np.sqrt(np.sum(np.power(p2-p1, 2)))
def generate_synth_data(n=50):
"""Create two sets of points from bivariate normal distributions."""
points = np.concatenate((ss.norm(0,1).rvs((n,2)), ss.norm(1,1).rvs((n,2))), axis=0)
outcomes = np.concatenate((np.repeat(0, n), np.repeat(1, n)), axis=0)
return (points, outcomes)
h=1
def make_prediction_grid(predictors, outcomes,limits, h, k):
"""Classify each point on the prediction grid."""
(x_min, x_max, y_min, y_max) = limits
xs = np.arange(x_min, x_max, h)
ys = np.arange(y_min, y_max, h)
xx, yy = np.meshgrid(xs, ys)
prediction_grid = np.zeros(xx.shape, dtype = int)
for i,x in enumerate(xs):
for j, y in enumerate(ys):
p = np.array([x, y])
prediction_grid[j, i] = knn_predict(p, predictors, outcomes, k)
return (xx, yy, prediction_grid)
def plot_prediction_grid (xx, yy, prediction_grid, filename):
""" Plot KNN predictions for every point on the grid."""
from matplotlib.colors import ListedColormap
background_colormap = ListedColormap (["hotpink","lightskyblue", "yellowgreen"])
observation_colormap = ListedColormap (["red","blue","green"])
plt.figure(figsize =(10,10))
plt.pcolormesh(xx, yy, prediction_grid, cmap = background_colormap, alpha = 0.5)
plt.scatter(predictors[:,0], predictors [:,1], c = outcomes, cmap = observation_colormap, s = 50)
plt.xlabel('Variable 1'); plt.ylabel('Variable 2')
plt.xticks(()); plt.yticks(())
plt.xlim (np.min(xx), np.max(xx))
plt.ylim (np.min(yy), np.max(yy))
plt.savefig(filename)
(predictors, outcomes) = generate_synth_data()
k = 5; filename = "knn_synth_5.pdf"; limits = (-3, 4, -3, 4); h = 0.1
(xx, yy, prediction_grid) = make_prediction_grid(predictors, outcomes, limits, h, k)
plot_prediction_grid(xx, yy, prediction_grid, filename)