您的位置:首页 > 其它

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

2020-01-14 19:28 666 查看

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]机器学习(Machine Learning)- 吴恩达(Andrew Ng)" target=_blank> = 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]

[/code]

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

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

学习参考链接:
[url=https://www.bilibili.com/video/av9912938]机器学习(Machine Learning)- 吴恩达(Andrew Ng)

20191022

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

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

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

20191023

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

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

第一章 机器学习概览

思维导图

  • 点赞
  • 收藏
  • 分享
  • 文章举报
Seal_Wings 发布了44 篇原创文章 · 获赞 0 · 访问量 1142 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: