机器学习自学进度与笔记整理——《机器学习实战:基于Scikit-Learn和TensorFlow》(第一章)

20191020

集体智慧编程(P7-P20)

#-*-coding:GBK -*-

'''
第二章 提供推荐
一个完整的系统
适用于任何类型的商品或网络链接
建议一个涉及人员、物品和评价值的字典,然后可以借此为任何人提供建议
教材讲解与相关概念补充
'''

from math import sqrt
#import importlib,sys
#importlib.reload(sys)

#使用嵌套的字典来存储影评人及其评价
critics = {
'name_1':{'movie_1':2.5,'movie_2':3.5,'movie_3':3.0,'movie_4':3.5,'movie_5':2.5,'movie_6':3.0},
'name_2':{'movie_1':3.0,'movie_2':3.5,'movie_3':1.5,'movie_4':5.0,'movie_5':3.5,'movie_6':3.0},
'name_3':{'movie_1':2.5,'movie_2':3.0,'movie_4':3.5,'movie_6':4.0},
'name_4':{'movie_2':3.5,'movie_3':3.0,'movie_4':4.0,'movie_5':2.5,'movie_6':4.5},
'name_5':{'movie_1':3.0,'movie_2':4.0,'movie_3':2.0,'movie_4':3.0,'movie_5':2.0,'movie_6':3.0},
'name_6':{'movie_1':3.0,'movie_2':4.0,'movie_4':5.0,'movie_5':3.5,'movie_6':3.0},
'name_7':{'movie_2':4.5,'movie_5':1.0,'movie_4':4.0},
}


#返回一个有关person1与person2的基于距离的相似度评价
def sim_distance(prefs,person1,person2):
	#得到shared_items的列表
	si={}  #注意这里是一个字典
	for item in prefs[person1]:
		if item in prefs[person2]:
			si[item] = 1
			
	#如果两者没有共同之处,则返回0
	if len(si) == 0:
		return 0
		
	#计算所有差值的平方和
	sum_of_squares = sum([pow(prefs[person1][item] - prefs[person2][item],2)
	for item in prefs[person1] if item in prefs[person2]])

	#此处逻辑:给偏好越相近的人一个更大的值;为防止求出的分母是负数,在分母上+1
	return 1/(1+sqrt(sum_of_squares))
'''
print (sim_distance(critics,'name_1','name_2'))
print (sim_distance(critics,'name_1','name_3'))
print (sim_distance(critics,'name_1','name_4'))
'''


#返回p1和p2的皮尔逊相关系数
'''
*概念补充
皮尔逊相关系数:
度量两个变量之间相关程度的方法,取值[-1,1]
1表示变量完全正相关,0表示无关,-1表示完全负相关
'''
def sim_pearson(prefs,p1,p2):
	"""
	函数返回值[-1,1]
	当值为1时,说明两者拥有完全一致的评价
	"""
	#得到双方都曾评价过的物品列表
	si = {}
	for item in prefs[p1]:
		if item in prefs[p2]:
			si[item] = 1
			
	#得到列表元素的个数
	n = len(si)
	
	#如果两者没有共同之处,则返回1
	if n == 0:
		return 1
		
	#对所有偏好求和
	sum1 = sum([prefs[p1][it] for it in si])
	sum2 = sum([prefs[p2][it] for it in si])
	
	#求平方和
	sum1Sq = sum([pow(prefs[p1][it],2) for it in si])
	sum2Sq = sum([pow(prefs[p2][it],2) for it in si])
	
	#求乘积之和
	pSum = sum([prefs[p1][it]*prefs[p2][it] for it in si])
	
	#计算皮尔逊评价值
	num = pSum - (sum1*sum2/n)
	den = sqrt((sum1Sq - pow(sum1,2)/n)*(sum2Sq - pow(sum2,2)/n))
	if den == 0:
		return 0
		
	r = num/den
	
	return r
'''
print (sim_pearson(critics,'name_1','name_2'))
print (sim_pearson(critics,'name_1','name_3'))
print (sim_pearson(critics,'name_1','name_4'))
'''


#从反映偏好的字典中返回最为匹配者
#返回结果的个数和相似度函数均为可选参数
def topMatches(prefs,person,n=5,similarity=sim_pearson):
	scores = [(similarity(prefs,person,other),other)
					for other in prefs if other != person]
					
	#对列表进行排序,评价最高者排在最前面
	scores.sort()
	scores.reverse()
	return scores[0:n]
'''	
print (topMatches(critics,'name_7',n=3))
'''


#利用所有他人评价值的加权平均,为某人提供建议
def getRecommendations(prefs,person,similarity=sim_pearson):
	totals = {}
	simSums = {}
	for other in prefs:
		#不要和自己比较
		if other == person:
			continue
		sim = similarity(prefs,person,other)
			
		#忽略评价值为0或者小于零的情况
		if sim <= 0:
			continue
		
		for item in prefs[other]:
			#只对自己还未曾看过的影片进行评价
			if item not in prefs[person] or prefs[person][item] == 0:
				#相似度*评价值
				totals.setdefault(item,0)
				totals[item] += prefs[other][item]*sim #每一项最终评价值的计算方法
				#相似度之和
				simSums.setdefault(item,0)
				simSums[item] += sim
				
	#建立一个归一化的列表
	rankings = [(total/simSums[item],item) for item,total in totals.items()]
	
	#返回经过排序的列表
	rankings.sort()
	rankings.reverse()
	return rankings
'''
print(getRecommendations(critics,'name_7'))
print(getRecommendations(critics,'name_7',sim_distance))
程序进行到这里
我们已经知道怎么样向指定的人员寻找品味相近者,同时并且向他推荐商品
'''


#相近商品的匹配
def transformPrefs(prefs):
	result = {}
	for person in prefs:
		for item in prefs[person]:
			result.setdefault(item,{})
			
			#将物品和人员对调
			result[item][person] = prefs[person][item]
	return result
	
movies = transformPrefs(critics)
#print(topMatches(movies,'movie_4'))#相关影片的推荐
#print(getRecommendations(movies,'movie_3'))#为影片推荐评论人

# -*- coding: GBK -*-

'''
找到一组近期提交过的某一热门链接
且链接附带指定标签(tag)的用户
'''

import random
from pydelicious import get_popular,get_userposts,get_urlposts
import recommendations

def initializeUserDict(tag,count=5):
	"""
	得到一个包含若干用户数据的字典
	其中每一项都各自指向一个等待填入具体链接的空字典
	"""
	user_dict = {}
	
	#获取前count个最受欢迎的链接张贴记录
	for p1 in get_popular(tag=tag)[0:count]:
		#查找所有张贴该链接的用户
		for p2 in get_urlposts(p1['hrefs']):
			user = p2['user']
			user_dict[user] = {}
			
	return user_dict

def fillItems(user_dict):
	"""
	对于每一个用户
	他们的‘评价’都只有两类:张贴(1)、未张贴(0)
	"""
	
	all_items = {}
	
	#查找所有用户都提交过的链接
	for user in user_dict:
		for i in range(3):
			try:
				posts = get_userposts(user)
				break
			except:
				print('Failed user ' + user + ', retrying')
				time.sleep(4)
		for post in posts:
			url = post['href']
			user_dict[user][url] = 1.0
			all_items[url] = 1
			
	#用零填充缺失的项
	for ratings in user_dict.values():
		for item in all_items:
			if item not in ratings:
				ratings[item] = 0.0
				
delusers = initializeUserDict('programming')
delusers['tsegaran'] = {}#如果你也用delicious,则将自己也加入字典中
fillItems(delusers)


'''
随机选择一位用户
并找出与其品味相近的其他用户
'''
user = delusers.keys()[random.randint(0,len(delusers)-1)]
topMatches(delusers,user)
getRecommendations(delusers,user)[0:10]

在2019年10月22日时,因为这本书基于Python2.x编写,并且遇到书中链接失效的情况,最终选择再换一本书。

机器学习吴恩达(4/113)

学习参考链接:
机器学习(Machine Learning)- 吴恩达(Andrew Ng)

20191022

机器学习吴恩达(8/113)

机器学习实战:基于Scikit-Learn和TensorFlow

因为各个教材教授内容大同小异,从今天开始以该书为主,记录学习进程。
学习参考链接:
DeqianBai/Hands-on-Machine-Learning

20191023

机器学习实战:基于Scikit-Learn和TensorFlow

第一部分 机器学习基础(1-8章)

第一章 机器学习概览

思维导图

你可能感兴趣的:(机器学习,python,数据挖掘)